screen-5.0.2/0000775000175000017500000000000015224432752011451 5ustar alexalexscreen-5.0.2/FAQ0000777000175000017500000000000015224432752013075 2doc/FAQustar alexalexscreen-5.0.2/install-sh0000700000175000017500000003611515224432734013447 0ustar alexalex#!/bin/sh # install - install a program, script, or datafile scriptversion=2024-06-19.01; # UTC # This originates from X11R5 (mit/util/scripts/install.sh), which was # later released in X11R6 (xc/config/util/install.sh) with the # following copyright and license. # # Copyright (C) 1994 X Consortium # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to # deal in the Software without restriction, including without limitation the # rights to use, copy, modify, merge, publish, distribute, sublicense, and/or # sell copies of the Software, and to permit persons to whom the Software is # furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included in # all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE # X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN # AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC- # TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. # # Except as contained in this notice, the name of the X Consortium shall not # be used in advertising or otherwise to promote the sale, use or other deal- # ings in this Software without prior written authorization from the X Consor- # tium. # # # FSF changes to this file are in the public domain. # # Calling this script install-sh is preferred over install.sh, to prevent # 'make' implicit rules from creating a file called install from it # when there is no Makefile. # # This script is compatible with the BSD install script, but was written # from scratch. tab=' ' nl=' ' IFS=" $tab$nl" # Set DOITPROG to "echo" to test this script. doit=${DOITPROG-} doit_exec=${doit:-exec} # Put in absolute file names if you don't have them in your path; # or use environment vars. chgrpprog=${CHGRPPROG-chgrp} chmodprog=${CHMODPROG-chmod} chownprog=${CHOWNPROG-chown} cmpprog=${CMPPROG-cmp} cpprog=${CPPROG-cp} mkdirprog=${MKDIRPROG-mkdir} mvprog=${MVPROG-mv} rmprog=${RMPROG-rm} stripprog=${STRIPPROG-strip} posix_mkdir= # Desired mode of installed file. mode=0755 # Create dirs (including intermediate dirs) using mode 755. # This is like GNU 'install' as of coreutils 8.32 (2020). mkdir_umask=22 backupsuffix= chgrpcmd= chmodcmd=$chmodprog chowncmd= mvcmd=$mvprog rmcmd="$rmprog -f" stripcmd= src= dst= dir_arg= dst_arg= copy_on_change=false is_target_a_directory=possibly usage="\ Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE or: $0 [OPTION]... SRCFILES... DIRECTORY or: $0 [OPTION]... -t DIRECTORY SRCFILES... or: $0 [OPTION]... -d DIRECTORIES... In the 1st form, copy SRCFILE to DSTFILE. In the 2nd and 3rd, copy all SRCFILES to DIRECTORY. In the 4th, create DIRECTORIES. Options: --help display this help and exit. --version display version info and exit. -c (ignored) -C install only if different (preserve data modification time) -d create directories instead of installing files. -g GROUP $chgrpprog installed files to GROUP. -m MODE $chmodprog installed files to MODE. -o USER $chownprog installed files to USER. -p pass -p to $cpprog. -s $stripprog installed files. -S SUFFIX attempt to back up existing files, with suffix SUFFIX. -t DIRECTORY install into DIRECTORY. -T report an error if DSTFILE is a directory. Environment variables override the default commands: CHGRPPROG CHMODPROG CHOWNPROG CMPPROG CPPROG MKDIRPROG MVPROG RMPROG STRIPPROG By default, rm is invoked with -f; when overridden with RMPROG, it's up to you to specify -f if you want it. If -S is not specified, no backups are attempted. Report bugs to . GNU Automake home page: . General help using GNU software: ." while test $# -ne 0; do case $1 in -c) ;; -C) copy_on_change=true;; -d) dir_arg=true;; -g) chgrpcmd="$chgrpprog $2" shift;; --help) echo "$usage"; exit $?;; -m) mode=$2 case $mode in *' '* | *"$tab"* | *"$nl"* | *'*'* | *'?'* | *'['*) echo "$0: invalid mode: $mode" >&2 exit 1;; esac shift;; -o) chowncmd="$chownprog $2" shift;; -p) cpprog="$cpprog -p";; -s) stripcmd=$stripprog;; -S) backupsuffix="$2" shift;; -t) is_target_a_directory=always dst_arg=$2 # Protect names problematic for 'test' and other utilities. case $dst_arg in -* | [=\(\)!]) dst_arg=./$dst_arg;; esac shift;; -T) is_target_a_directory=never;; --version) echo "$0 (GNU Automake) $scriptversion"; exit $?;; --) shift break;; -*) echo "$0: invalid option: $1" >&2 exit 1;; *) break;; esac shift done # We allow the use of options -d and -T together, by making -d # take the precedence; this is for compatibility with GNU install. if test -n "$dir_arg"; then if test -n "$dst_arg"; then echo "$0: target directory not allowed when installing a directory." >&2 exit 1 fi fi if test $# -ne 0 && test -z "$dir_arg$dst_arg"; then # When -d is used, all remaining arguments are directories to create. # When -t is used, the destination is already specified. # Otherwise, the last argument is the destination. Remove it from $@. for arg do if test -n "$dst_arg"; then # $@ is not empty: it contains at least $arg. set fnord "$@" "$dst_arg" shift # fnord fi shift # arg dst_arg=$arg # Protect names problematic for 'test' and other utilities. case $dst_arg in -* | [=\(\)!]) dst_arg=./$dst_arg;; esac done fi if test $# -eq 0; then if test -z "$dir_arg"; then echo "$0: no input file specified." >&2 exit 1 fi # It's OK to call 'install-sh -d' without argument. # This can happen when creating conditional directories. exit 0 fi if test -z "$dir_arg"; then if test $# -gt 1 || test "$is_target_a_directory" = always; then if test ! -d "$dst_arg"; then echo "$0: $dst_arg: Is not a directory." >&2 exit 1 fi fi fi if test -z "$dir_arg"; then do_exit='(exit $ret); exit $ret' trap "ret=129; $do_exit" 1 trap "ret=130; $do_exit" 2 trap "ret=141; $do_exit" 13 trap "ret=143; $do_exit" 15 # Set umask so as not to create temps with too-generous modes. # However, 'strip' requires both read and write access to temps. case $mode in # Optimize common cases. *644) cp_umask=133;; *755) cp_umask=22;; *[0-7]) if test -z "$stripcmd"; then u_plus_rw= else u_plus_rw='% 200' fi cp_umask=`expr '(' 777 - $mode % 1000 ')' $u_plus_rw`;; *) if test -z "$stripcmd"; then u_plus_rw= else u_plus_rw=,u+rw fi cp_umask=$mode$u_plus_rw;; esac fi for src do # Protect names problematic for 'test' and other utilities. case $src in -* | [=\(\)!]) src=./$src;; esac if test -n "$dir_arg"; then dst=$src dstdir=$dst test -d "$dstdir" dstdir_status=$? # Don't chown directories that already exist. if test $dstdir_status = 0; then chowncmd="" fi else # Waiting for this to be detected by the "$cpprog $src $dsttmp" command # might cause directories to be created, which would be especially bad # if $src (and thus $dsttmp) contains '*'. if test ! -f "$src" && test ! -d "$src"; then echo "$0: $src does not exist." >&2 exit 1 fi if test -z "$dst_arg"; then echo "$0: no destination specified." >&2 exit 1 fi dst=$dst_arg # If destination is a directory, append the input filename. if test -d "$dst"; then if test "$is_target_a_directory" = never; then echo "$0: $dst_arg: Is a directory" >&2 exit 1 fi dstdir=$dst dstbase=`basename "$src"` case $dst in */) dst=$dst$dstbase;; *) dst=$dst/$dstbase;; esac dstdir_status=0 else dstdir=`dirname "$dst"` test -d "$dstdir" dstdir_status=$? fi fi case $dstdir in */) dstdirslash=$dstdir;; *) dstdirslash=$dstdir/;; esac obsolete_mkdir_used=false if test $dstdir_status != 0; then case $posix_mkdir in '') # With -d, create the new directory with the user-specified mode. # Otherwise, rely on $mkdir_umask. if test -n "$dir_arg"; then mkdir_mode=-m$mode else mkdir_mode= fi posix_mkdir=false # The $RANDOM variable is not portable (e.g., dash). Use it # here however when possible just to lower collision chance. tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$ trap ' ret=$? rmdir "$tmpdir/a/b" "$tmpdir/a" "$tmpdir" 2>/dev/null exit $ret ' 0 # Because "mkdir -p" follows existing symlinks and we likely work # directly in world-writable /tmp, make sure that the '$tmpdir' # directory is successfully created first before we actually test # 'mkdir -p'. if (umask $mkdir_umask && $mkdirprog $mkdir_mode "$tmpdir" && exec $mkdirprog $mkdir_mode -p -- "$tmpdir/a/b") >/dev/null 2>&1 then if test -z "$dir_arg" || { # Check for POSIX incompatibility with -m. # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or # other-writable bit of parent directory when it shouldn't. # FreeBSD 6.1 mkdir -m -p sets mode of existing directory. test_tmpdir="$tmpdir/a" ls_ld_tmpdir=`ls -ld "$test_tmpdir"` case $ls_ld_tmpdir in d????-?r-*) different_mode=700;; d????-?--*) different_mode=755;; *) false;; esac && $mkdirprog -m$different_mode -p -- "$test_tmpdir" && { ls_ld_tmpdir_1=`ls -ld "$test_tmpdir"` test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1" } } then posix_mkdir=: fi rmdir "$tmpdir/a/b" "$tmpdir/a" "$tmpdir" else # Remove any dirs left behind by ancient mkdir implementations. rmdir ./$mkdir_mode ./-p ./-- "$tmpdir" 2>/dev/null fi trap '' 0;; esac if $posix_mkdir && ( umask $mkdir_umask && $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir" ) then : else # mkdir does not conform to POSIX, # or it failed possibly due to a race condition. Create the # directory the slow way, step by step, checking for races as we go. case $dstdir in /*) prefix='/';; [-=\(\)!]*) prefix='./';; *) prefix='';; esac oIFS=$IFS IFS=/ set -f set fnord $dstdir shift set +f IFS=$oIFS prefixes= for d do test X"$d" = X && continue prefix=$prefix$d if test -d "$prefix"; then prefixes= else if $posix_mkdir; then (umask $mkdir_umask && $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break # Don't fail if two instances are running concurrently. test -d "$prefix" || exit 1 else case $prefix in *\'*) qprefix=`echo "$prefix" | sed "s/'/'\\\\\\\\''/g"`;; *) qprefix=$prefix;; esac prefixes="$prefixes '$qprefix'" fi fi prefix=$prefix/ done if test -n "$prefixes"; then # Don't fail if two instances are running concurrently. (umask $mkdir_umask && eval "\$doit_exec \$mkdirprog $prefixes") || test -d "$dstdir" || exit 1 obsolete_mkdir_used=true fi fi fi if test -n "$dir_arg"; then { test -z "$chowncmd" || $doit $chowncmd "$dst"; } && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } && { test "$obsolete_mkdir_used$chowncmd$chgrpcmd" = false || test -z "$chmodcmd" || $doit $chmodcmd $mode "$dst"; } || exit 1 else # Make a couple of temp file names in the proper directory. dsttmp=${dstdirslash}_inst.$$_ rmtmp=${dstdirslash}_rm.$$_ # Trap to clean up those temp files at exit. trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0 # Copy the file name to the temp name. (umask $cp_umask && { test -z "$stripcmd" || { # Create $dsttmp read-write so that cp doesn't create it read-only, # which would cause strip to fail. if test -z "$doit"; then : >"$dsttmp" # No need to fork-exec 'touch'. else $doit touch "$dsttmp" fi } } && $doit_exec $cpprog "$src" "$dsttmp") && # and set any options; do chmod last to preserve setuid bits. # # If any of these fail, we abort the whole thing. If we want to # ignore errors from any of these, just make sure not to ignore # errors from the above "$doit $cpprog $src $dsttmp" command. # { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } && { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } && { test -z "$chmodcmd" || $doit $chmodcmd $mode "$dsttmp"; } && # If -C, don't bother to copy if it wouldn't change the file. if $copy_on_change && old=`LC_ALL=C ls -dlL "$dst" 2>/dev/null` && new=`LC_ALL=C ls -dlL "$dsttmp" 2>/dev/null` && set -f && set X $old && old=:$2:$4:$5:$6 && set X $new && new=:$2:$4:$5:$6 && set +f && test "$old" = "$new" && $cmpprog "$dst" "$dsttmp" >/dev/null 2>&1 then rm -f "$dsttmp" else # If $backupsuffix is set, and the file being installed # already exists, attempt a backup. Don't worry if it fails, # e.g., if mv doesn't support -f. if test -n "$backupsuffix" && test -f "$dst"; then $doit $mvcmd -f "$dst" "$dst$backupsuffix" 2>/dev/null fi # Rename the file to the real destination. $doit $mvcmd -f "$dsttmp" "$dst" 2>/dev/null || # The rename failed, perhaps because mv can't rename something else # to itself, or perhaps because mv is so ancient that it does not # support -f. { # Now remove or move aside any old file at destination location. # We try this two ways since rm can't unlink itself on some # systems and the destination file might be busy for other # reasons. In this case, the final cleanup might fail but the new # file should still install successfully. { test ! -f "$dst" || $doit $rmcmd "$dst" 2>/dev/null || { $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null && { $doit $rmcmd "$rmtmp" 2>/dev/null; :; } } || { echo "$0: cannot unlink or rename $dst" >&2 (exit 1); exit 1 } } && # Now rename the file to the real destination. $doit $mvcmd "$dsttmp" "$dst" } fi || exit 1 trap '' 0 fi done # Local variables: # eval: (add-hook 'before-save-hook 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-time-zone: "UTC0" # time-stamp-end: "; # UTC" # End: screen-5.0.2/config.h.in0000664000175000017500000001416215224432734013500 0ustar alexalex/* config.h.in. Generated from configure.ac by autoheader. */ /* Enable Pluggable Authentication Modules support */ #undef ENABLE_PAM /* Enable built-in telnet client */ #undef ENABLE_TELNET /* Enable utmp support */ #undef ENABLE_UTMP /* Define to 1 if you have the header file. */ #undef HAVE_DIRENT_H /* Define to 1 if you have the 'execvpe' function. */ #undef HAVE_EXECVPE /* Define to 1 if you have the header file. */ #undef HAVE_INTTYPES_H /* Define to 1 if you have the header file. */ #undef HAVE_LANGINFO_H /* Define to 1 if you have the header file. */ #undef HAVE_LIBUTIL_H /* Define to 1 if you have the header file. */ #undef HAVE_MINIX_CONFIG_H /* system has openpty() defined */ #undef HAVE_OPENPTY /* Define to 1 if you have the header file. */ #undef HAVE_PTY_H /* Define to 1 if you have the 'setegid' function. */ #undef HAVE_SETEGID /* Define to 1 if you have the 'seteuid' function. */ #undef HAVE_SETEUID /* Define to 1 if you have the 'setresuid' function. */ #undef HAVE_SETRESUID /* Define to 1 if you have the 'setreuid' function. */ #undef HAVE_SETREUID /* Define to 1 if you have the header file. */ #undef HAVE_STDINT_H /* Define to 1 if you have the header file. */ #undef HAVE_STDIO_H /* Define to 1 if you have the header file. */ #undef HAVE_STDLIB_H /* Define to 1 if you have the header file. */ #undef HAVE_STRINGS_H /* Define to 1 if you have the header file. */ #undef HAVE_STRING_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_STAT_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_TYPES_H /* Define to 1 if you have the header file. */ #undef HAVE_UNISTD_H /* system has utempter helper binary */ #undef HAVE_UTEMPTER /* Define to 1 if you have the header file. */ #undef HAVE_UTIL_H /* Define to 1 if you have the header file. */ #undef HAVE_UTMPX_H /* utmpx struct has ut_exit field */ #undef HAVE_UT_EXIT /* utmpx struct has ut_host field */ #undef HAVE_UT_HOST /* Define to 1 if you have the header file. */ #undef HAVE_WCHAR_H /* Define to the address where bug reports for this package should be sent. */ #undef PACKAGE_BUGREPORT /* Define to the full name of this package. */ #undef PACKAGE_NAME /* Define to the full name and version of this package. */ #undef PACKAGE_STRING /* Define to the one symbol short name of this package. */ #undef PACKAGE_TARNAME /* Define to the home page for this package. */ #undef PACKAGE_URL /* Define to the version of this package. */ #undef PACKAGE_VERSION /* Default group for pty devices */ #undef PTY_GROUP /* Default mode for pty devices */ #undef PTY_MODE /* pty devices are on read only filesystem */ #undef PTY_ROFS /* Path to socket directory */ #undef SOCKET_DIR /* Define to 1 if all of the C89 standard headers exist (not just the ones required in a freestanding environment). This macro is provided for backward compatibility; new code need not use it. */ #undef STDC_HEADERS /* Path to system screenrc */ #undef SYSTEM_SCREENRC /* Enable extensions on AIX, Interix, z/OS. */ #ifndef _ALL_SOURCE # undef _ALL_SOURCE #endif /* Enable general extensions on macOS. */ #ifndef _DARWIN_C_SOURCE # undef _DARWIN_C_SOURCE #endif /* Enable general extensions on Solaris. */ #ifndef __EXTENSIONS__ # undef __EXTENSIONS__ #endif /* Enable GNU extensions on systems that have them. */ #ifndef _GNU_SOURCE # undef _GNU_SOURCE #endif /* Enable X/Open compliant socket functions that do not require linking with -lxnet on HP-UX 11.11. */ #ifndef _HPUX_ALT_XOPEN_SOCKET_API # undef _HPUX_ALT_XOPEN_SOCKET_API #endif /* Identify the host operating system as Minix. This macro does not affect the system headers' behavior. A future release of Autoconf may stop defining this macro. */ #ifndef _MINIX # undef _MINIX #endif /* Enable general extensions on NetBSD. Enable NetBSD compatibility extensions on Minix. */ #ifndef _NETBSD_SOURCE # undef _NETBSD_SOURCE #endif /* Enable OpenBSD compatibility extensions on NetBSD. Oddly enough, this does nothing on OpenBSD. */ #ifndef _OPENBSD_SOURCE # undef _OPENBSD_SOURCE #endif /* Define to 1 if needed for POSIX-compatible behavior. */ #ifndef _POSIX_SOURCE # undef _POSIX_SOURCE #endif /* Define to 2 if needed for POSIX-compatible behavior. */ #ifndef _POSIX_1_SOURCE # undef _POSIX_1_SOURCE #endif /* Enable POSIX-compatible threading on Solaris. */ #ifndef _POSIX_PTHREAD_SEMANTICS # undef _POSIX_PTHREAD_SEMANTICS #endif /* Enable extensions specified by ISO/IEC TS 18661-5:2014. */ #ifndef __STDC_WANT_IEC_60559_ATTRIBS_EXT__ # undef __STDC_WANT_IEC_60559_ATTRIBS_EXT__ #endif /* Enable extensions specified by ISO/IEC TS 18661-1:2014. */ #ifndef __STDC_WANT_IEC_60559_BFP_EXT__ # undef __STDC_WANT_IEC_60559_BFP_EXT__ #endif /* Enable extensions specified by ISO/IEC TS 18661-2:2015. */ #ifndef __STDC_WANT_IEC_60559_DFP_EXT__ # undef __STDC_WANT_IEC_60559_DFP_EXT__ #endif /* Enable extensions specified by C23 Annex F. */ #ifndef __STDC_WANT_IEC_60559_EXT__ # undef __STDC_WANT_IEC_60559_EXT__ #endif /* Enable extensions specified by ISO/IEC TS 18661-4:2015. */ #ifndef __STDC_WANT_IEC_60559_FUNCS_EXT__ # undef __STDC_WANT_IEC_60559_FUNCS_EXT__ #endif /* Enable extensions specified by C23 Annex H and ISO/IEC TS 18661-3:2015. */ #ifndef __STDC_WANT_IEC_60559_TYPES_EXT__ # undef __STDC_WANT_IEC_60559_TYPES_EXT__ #endif /* Enable extensions specified by ISO/IEC TR 24731-2:2010. */ #ifndef __STDC_WANT_LIB_EXT2__ # undef __STDC_WANT_LIB_EXT2__ #endif /* Enable extensions specified by ISO/IEC 24747:2009. */ #ifndef __STDC_WANT_MATH_SPEC_FUNCS__ # undef __STDC_WANT_MATH_SPEC_FUNCS__ #endif /* Enable extensions on HP NonStop. */ #ifndef _TANDEM_SOURCE # undef _TANDEM_SOURCE #endif /* Enable X/Open extensions. Define to 500 only if necessary to make mbstate_t available. */ #ifndef _XOPEN_SOURCE # undef _XOPEN_SOURCE #endif /* Major version of GNU screen */ #undef VERSION_MAJOR /* Minor version of GNU screen */ #undef VERSION_MINOR /* Micro revision of GNU screen */ #undef VERSION_REVISION screen-5.0.2/configure0000775000175000017500000054067015224432734013374 0ustar alexalex#! /bin/sh # Guess values for system-dependent variables and create Makefiles. # Generated by GNU Autoconf 2.72 for GNU Screen 5.0.2. # # Report bugs to . # # # Copyright (C) 1992-1996, 1998-2017, 2020-2023 Free Software Foundation, # Inc. # # # This configure script is free software; the Free Software Foundation # gives unlimited permission to copy, distribute and modify it. ## -------------------- ## ## M4sh Initialization. ## ## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test ${ZSH_VERSION+y} && (emulate sh) >/dev/null 2>&1 then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case e in #( e) case `(set -o) 2>/dev/null` in #( *posix*) : set -o posix ;; #( *) : ;; esac ;; esac fi # Reset variables that may have inherited troublesome values from # the environment. # IFS needs to be set, to space, tab, and newline, in precisely that order. # (If _AS_PATH_WALK were called with IFS unset, it would have the # side effect of setting IFS to empty, thus disabling word splitting.) # Quoting is to prevent editors from complaining about space-tab. as_nl=' ' export as_nl IFS=" "" $as_nl" PS1='$ ' PS2='> ' PS4='+ ' # Ensure predictable behavior from utilities with locale-dependent output. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # We cannot yet rely on "unset" to work, but we need these variables # to be unset--not just set to an empty or harmless value--now, to # avoid bugs in old shells (e.g. pre-3.0 UWIN ksh). This construct # also avoids known problems related to "unset" and subshell syntax # in other old shells (e.g. bash 2.01 and pdksh 5.2.14). for as_var in BASH_ENV ENV MAIL MAILPATH CDPATH do eval test \${$as_var+y} \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done # Ensure that fds 0, 1, and 2 are open. if (exec 3>&0) 2>/dev/null; then :; else exec 0&1) 2>/dev/null; then :; else exec 1>/dev/null; fi if (exec 3>&2) ; then :; else exec 2>/dev/null; fi # The user is always right. if ${PATH_SEPARATOR+false} :; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # Find who we are. Look in the path if we contain no directory separator. as_myself= case $0 in #(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac test -r "$as_dir$0" && as_myself=$as_dir$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as 'sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then printf "%s\n" "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # Use a proper internal environment variable to ensure we don't fall # into an infinite loop, continuously re-executing ourselves. if test x"${_as_can_reexec}" != xno && test "x$CONFIG_SHELL" != x; then _as_can_reexec=no; export _as_can_reexec; # We cannot yet assume a decent shell, so we have to provide a # neutralization value for shells without unset; and this also # works around shells that cannot unset nonexistent variables. # Preserve -v and -x to the replacement shell. BASH_ENV=/dev/null ENV=/dev/null (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV case $- in # (((( *v*x* | *x*v* ) as_opts=-vx ;; *v* ) as_opts=-v ;; *x* ) as_opts=-x ;; * ) as_opts= ;; esac exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} # Admittedly, this is quite paranoid, since all the known shells bail # out after a failed 'exec'. printf "%s\n" "$0: could not re-execute with $CONFIG_SHELL" >&2 exit 255 fi # We don't want this to propagate to other subprocesses. { _as_can_reexec=; unset _as_can_reexec;} if test "x$CONFIG_SHELL" = x; then as_bourne_compatible="if test \${ZSH_VERSION+y} && (emulate sh) >/dev/null 2>&1 then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which # is contrary to our usage. Disable this feature. alias -g '\${1+\"\$@\"}'='\"\$@\"' setopt NO_GLOB_SUBST else case e in #( e) case \`(set -o) 2>/dev/null\` in #( *posix*) : set -o posix ;; #( *) : ;; esac ;; esac fi " as_required="as_fn_return () { (exit \$1); } as_fn_success () { as_fn_return 0; } as_fn_failure () { as_fn_return 1; } as_fn_ret_success () { return 0; } as_fn_ret_failure () { return 1; } exitcode=0 as_fn_success || { exitcode=1; echo as_fn_success failed.; } as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; } as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; } as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; } if ( set x; as_fn_ret_success y && test x = \"\$1\" ) then : else case e in #( e) exitcode=1; echo positional parameters were not saved. ;; esac fi test x\$exitcode = x0 || exit 1 blah=\$(echo \$(echo blah)) test x\"\$blah\" = xblah || exit 1 test -x / || exit 1" as_suggested=" as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" && test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1" if (eval "$as_required") 2>/dev/null then : as_have_required=yes else case e in #( e) as_have_required=no ;; esac fi if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null then : else case e in #( e) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR as_found=false for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac as_found=: case $as_dir in #( /*) for as_base in sh bash ksh sh5; do # Try only shells that exist, to save several forks. as_shell=$as_dir$as_base if { test -f "$as_shell" || test -f "$as_shell.exe"; } && as_run=a "$as_shell" -c "$as_bourne_compatible""$as_required" 2>/dev/null then : CONFIG_SHELL=$as_shell as_have_required=yes if as_run=a "$as_shell" -c "$as_bourne_compatible""$as_suggested" 2>/dev/null then : break 2 fi fi done;; esac as_found=false done IFS=$as_save_IFS if $as_found then : else case e in #( e) if { test -f "$SHELL" || test -f "$SHELL.exe"; } && as_run=a "$SHELL" -c "$as_bourne_compatible""$as_required" 2>/dev/null then : CONFIG_SHELL=$SHELL as_have_required=yes fi ;; esac fi if test "x$CONFIG_SHELL" != x then : export CONFIG_SHELL # We cannot yet assume a decent shell, so we have to provide a # neutralization value for shells without unset; and this also # works around shells that cannot unset nonexistent variables. # Preserve -v and -x to the replacement shell. BASH_ENV=/dev/null ENV=/dev/null (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV case $- in # (((( *v*x* | *x*v* ) as_opts=-vx ;; *v* ) as_opts=-v ;; *x* ) as_opts=-x ;; * ) as_opts= ;; esac exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} # Admittedly, this is quite paranoid, since all the known shells bail # out after a failed 'exec'. printf "%s\n" "$0: could not re-execute with $CONFIG_SHELL" >&2 exit 255 fi if test x$as_have_required = xno then : printf "%s\n" "$0: This script requires a shell more modern than all" printf "%s\n" "$0: the shells that I found on your system." if test ${ZSH_VERSION+y} ; then printf "%s\n" "$0: In particular, zsh $ZSH_VERSION has bugs and should" printf "%s\n" "$0: be upgraded to zsh 4.3.4 or later." else printf "%s\n" "$0: Please tell bug-autoconf@gnu.org and $0: https://savannah.gnu.org/bugs/?group=screen about your $0: system, including any error possibly output before this $0: message. Then install a modern shell, or manually run $0: the script under such a shell if you do have one." fi exit 1 fi ;; esac fi fi SHELL=${CONFIG_SHELL-/bin/sh} export SHELL # Unset more variables known to interfere with behavior of common tools. CLICOLOR_FORCE= GREP_OPTIONS= unset CLICOLOR_FORCE GREP_OPTIONS ## --------------------- ## ## M4sh Shell Functions. ## ## --------------------- ## # as_fn_unset VAR # --------------- # Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset # as_fn_set_status STATUS # ----------------------- # Set $? to STATUS, without forking. as_fn_set_status () { return $1 } # as_fn_set_status # as_fn_exit STATUS # ----------------- # Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } # as_fn_exit # as_fn_mkdir_p # ------------- # Create "$as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`printf "%s\n" "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || printf "%s\n" X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" } # as_fn_mkdir_p # as_fn_executable_p FILE # ----------------------- # Test if FILE is an executable regular file. as_fn_executable_p () { test -f "$1" && test -x "$1" } # as_fn_executable_p # as_fn_append VAR VALUE # ---------------------- # Append the text in VALUE to the end of the definition contained in VAR. Take # advantage of any shell optimizations that allow amortized linear growth over # repeated appends, instead of the typical quadratic growth present in naive # implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null then : eval 'as_fn_append () { eval $1+=\$2 }' else case e in #( e) as_fn_append () { eval $1=\$$1\$2 } ;; esac fi # as_fn_append # as_fn_arith ARG... # ------------------ # Perform arithmetic evaluation on the ARGs, and store the result in the # global $as_val. Take advantage of shells that can avoid forks. The arguments # must be portable across $(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null then : eval 'as_fn_arith () { as_val=$(( $* )) }' else case e in #( e) as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } ;; esac fi # as_fn_arith # as_fn_error STATUS ERROR [LINENO LOG_FD] # ---------------------------------------- # Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are # provided, also output the error to LOG_FD, referencing LINENO. Then exit the # script with STATUS, using 1 if that was 0. as_fn_error () { as_status=$1; test $as_status -eq 0 && as_status=1 if test "$4"; then as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi printf "%s\n" "$as_me: error: $2" >&2 as_fn_exit $as_status } # as_fn_error if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || printf "%s\n" X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits as_lineno_1=$LINENO as_lineno_1a=$LINENO as_lineno_2=$LINENO as_lineno_2a=$LINENO eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" && test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || { # Blame Lee E. McMahon (1931-1989) for sed's syntax. :-) sed -n ' p /[$]LINENO/= ' <$as_myself | sed ' t clear :clear s/[$]LINENO.*/&-/ t lineno b :lineno N :loop s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/ t loop s/-\n.*// ' >$as_me.lineno && chmod +x "$as_me.lineno" || { printf "%s\n" "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; } # If we had to re-execute with $CONFIG_SHELL, we're ensured to have # already done that, so ensure we don't try to do so again and fall # in an infinite loop. This has already happened in practice. _as_can_reexec=no; export _as_can_reexec # Don't try to exec as it changes $[0], causing all sort of problems # (the dirname of $[0] is not the place where we might find the # original and so on. Autoconf is especially sensitive to this). . "./$as_me.lineno" # Exit status is that of the last command. exit } # Determine whether it's possible to make 'echo' print without a newline. # These variables are no longer used directly by Autoconf, but are AC_SUBSTed # for compatibility with existing Makefiles. ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in #((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac # For backward compatibility with old third-party macros, we provide # the shell variables $as_echo and $as_echo_n. New code should use # AS_ECHO(["message"]) and AS_ECHO_N(["message"]), respectively. as_echo='printf %s\n' as_echo_n='printf %s' rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both 'ln -s file dir' and 'ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; 'ln -s' creates a wrapper executable. # In both cases, we have to default to 'cp -pR'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -pR' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -pR' fi else as_ln_s='cp -pR' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null if mkdir -p . 2>/dev/null; then as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi as_test_x='test -x' as_executable_p=as_fn_executable_p # Sed expression to map a string onto a valid CPP name. as_sed_cpp="y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g" as_tr_cpp="eval sed '$as_sed_cpp'" # deprecated # Sed expression to map a string onto a valid variable name. as_sed_sh="y%*+%pp%;s%[^_$as_cr_alnum]%_%g" as_tr_sh="eval sed '$as_sed_sh'" # deprecated test -n "$DJDIR" || exec 7<&0 &1 # Name of the host. # hostname on some systems (SVR3.2, old GNU/Linux) returns a bogus exit status, # so uname gets run too. ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` # # Initializations. # ac_default_prefix=/usr/local ac_clean_files= ac_config_libobj_dir=. LIBOBJS= cross_compiling=no subdirs= MFLAGS= MAKEFLAGS= # Identity of this package. PACKAGE_NAME='GNU Screen' PACKAGE_TARNAME='screen' PACKAGE_VERSION='5.0.2' PACKAGE_STRING='GNU Screen 5.0.2' PACKAGE_BUGREPORT='https://savannah.gnu.org/bugs/?group=screen' PACKAGE_URL='https://www.gnu.org/software/screen/' # Factoring default headers for most tests. ac_includes_default="\ #include #ifdef HAVE_STDIO_H # include #endif #ifdef HAVE_STDLIB_H # include #endif #ifdef HAVE_STRING_H # include #endif #ifdef HAVE_INTTYPES_H # include #endif #ifdef HAVE_STDINT_H # include #endif #ifdef HAVE_STRINGS_H # include #endif #ifdef HAVE_SYS_TYPES_H # include #endif #ifdef HAVE_SYS_STAT_H # include #endif #ifdef HAVE_UNISTD_H # include #endif" ac_header_c_list= ac_subst_vars='LTLIBOBJS LIBOBJS INSTALL_DATA INSTALL_SCRIPT INSTALL_PROGRAM AWK OBJEXT EXEEXT ac_ct_CC CPPFLAGS LDFLAGS CFLAGS CC target_alias host_alias build_alias LIBS ECHO_T ECHO_N ECHO_C DEFS mandir localedir libdir psdir pdfdir dvidir htmldir infodir docdir oldincludedir includedir runstatedir localstatedir sharedstatedir sysconfdir datadir datarootdir libexecdir sbindir bindir program_transform_name prefix exec_prefix PACKAGE_URL PACKAGE_BUGREPORT PACKAGE_STRING PACKAGE_VERSION PACKAGE_TARNAME PACKAGE_NAME PATH_SEPARATOR SHELL' ac_subst_files='' ac_user_opts=' enable_option_checking enable_pam enable_utmp enable_telnet enable_socket_dir with_system_screenrc with_pty_mode with_pty_group with_pty_rofs ' ac_precious_vars='build_alias host_alias target_alias CC CFLAGS LDFLAGS LIBS CPPFLAGS' # Initialize some variables set by options. ac_init_help= ac_init_version=false ac_unrecognized_opts= ac_unrecognized_sep= # The variables have the same names as the options, with # dashes changed to underlines. cache_file=/dev/null exec_prefix=NONE no_create= no_recursion= prefix=NONE program_prefix=NONE program_suffix=NONE program_transform_name=s,x,x, silent= site= srcdir= verbose= x_includes=NONE x_libraries=NONE # Installation directory options. # These are left unexpanded so users can "make install exec_prefix=/foo" # and all the variables that are supposed to be based on exec_prefix # by default will actually change. # Use braces instead of parens because sh, perl, etc. also accept them. # (The list follows the same order as the GNU Coding Standards.) bindir='${exec_prefix}/bin' sbindir='${exec_prefix}/sbin' libexecdir='${exec_prefix}/libexec' datarootdir='${prefix}/share' datadir='${datarootdir}' sysconfdir='${prefix}/etc' sharedstatedir='${prefix}/com' localstatedir='${prefix}/var' runstatedir='${localstatedir}/run' includedir='${prefix}/include' oldincludedir='/usr/include' docdir='${datarootdir}/doc/${PACKAGE_TARNAME}' infodir='${datarootdir}/info' htmldir='${docdir}' dvidir='${docdir}' pdfdir='${docdir}' psdir='${docdir}' libdir='${exec_prefix}/lib' localedir='${datarootdir}/locale' mandir='${datarootdir}/man' ac_prev= ac_dashdash= for ac_option do # If the previous option needs an argument, assign it. if test -n "$ac_prev"; then eval $ac_prev=\$ac_option ac_prev= continue fi case $ac_option in *=?*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;; *=) ac_optarg= ;; *) ac_optarg=yes ;; esac case $ac_dashdash$ac_option in --) ac_dashdash=yes ;; -bindir | --bindir | --bindi | --bind | --bin | --bi) ac_prev=bindir ;; -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) bindir=$ac_optarg ;; -build | --build | --buil | --bui | --bu) ac_prev=build_alias ;; -build=* | --build=* | --buil=* | --bui=* | --bu=*) build_alias=$ac_optarg ;; -cache-file | --cache-file | --cache-fil | --cache-fi \ | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) ac_prev=cache_file ;; -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) cache_file=$ac_optarg ;; --config-cache | -C) cache_file=config.cache ;; -datadir | --datadir | --datadi | --datad) ac_prev=datadir ;; -datadir=* | --datadir=* | --datadi=* | --datad=*) datadir=$ac_optarg ;; -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \ | --dataroo | --dataro | --datar) ac_prev=datarootdir ;; -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \ | --dataroot=* | --dataroo=* | --dataro=* | --datar=*) datarootdir=$ac_optarg ;; -disable-* | --disable-*) ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid feature name: '$ac_useropt'" ac_useropt_orig=$ac_useropt ac_useropt=`printf "%s\n" "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval enable_$ac_useropt=no ;; -docdir | --docdir | --docdi | --doc | --do) ac_prev=docdir ;; -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*) docdir=$ac_optarg ;; -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv) ac_prev=dvidir ;; -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*) dvidir=$ac_optarg ;; -enable-* | --enable-*) ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid feature name: '$ac_useropt'" ac_useropt_orig=$ac_useropt ac_useropt=`printf "%s\n" "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval enable_$ac_useropt=\$ac_optarg ;; -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ | --exec | --exe | --ex) ac_prev=exec_prefix ;; -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ | --exec=* | --exe=* | --ex=*) exec_prefix=$ac_optarg ;; -gas | --gas | --ga | --g) # Obsolete; use --with-gas. with_gas=yes ;; -help | --help | --hel | --he | -h) ac_init_help=long ;; -help=r* | --help=r* | --hel=r* | --he=r* | -hr*) ac_init_help=recursive ;; -help=s* | --help=s* | --hel=s* | --he=s* | -hs*) ac_init_help=short ;; -host | --host | --hos | --ho) ac_prev=host_alias ;; -host=* | --host=* | --hos=* | --ho=*) host_alias=$ac_optarg ;; -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht) ac_prev=htmldir ;; -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \ | --ht=*) htmldir=$ac_optarg ;; -includedir | --includedir | --includedi | --included | --include \ | --includ | --inclu | --incl | --inc) ac_prev=includedir ;; -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ | --includ=* | --inclu=* | --incl=* | --inc=*) includedir=$ac_optarg ;; -infodir | --infodir | --infodi | --infod | --info | --inf) ac_prev=infodir ;; -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) infodir=$ac_optarg ;; -libdir | --libdir | --libdi | --libd) ac_prev=libdir ;; -libdir=* | --libdir=* | --libdi=* | --libd=*) libdir=$ac_optarg ;; -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ | --libexe | --libex | --libe) ac_prev=libexecdir ;; -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ | --libexe=* | --libex=* | --libe=*) libexecdir=$ac_optarg ;; -localedir | --localedir | --localedi | --localed | --locale) ac_prev=localedir ;; -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*) localedir=$ac_optarg ;; -localstatedir | --localstatedir | --localstatedi | --localstated \ | --localstate | --localstat | --localsta | --localst | --locals) ac_prev=localstatedir ;; -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*) localstatedir=$ac_optarg ;; -mandir | --mandir | --mandi | --mand | --man | --ma | --m) ac_prev=mandir ;; -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) mandir=$ac_optarg ;; -nfp | --nfp | --nf) # Obsolete; use --without-fp. with_fp=no ;; -no-create | --no-create | --no-creat | --no-crea | --no-cre \ | --no-cr | --no-c | -n) no_create=yes ;; -no-recursion | --no-recursion | --no-recursio | --no-recursi \ | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) no_recursion=yes ;; -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ | --oldin | --oldi | --old | --ol | --o) ac_prev=oldincludedir ;; -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) oldincludedir=$ac_optarg ;; -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) ac_prev=prefix ;; -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) prefix=$ac_optarg ;; -program-prefix | --program-prefix | --program-prefi | --program-pref \ | --program-pre | --program-pr | --program-p) ac_prev=program_prefix ;; -program-prefix=* | --program-prefix=* | --program-prefi=* \ | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) program_prefix=$ac_optarg ;; -program-suffix | --program-suffix | --program-suffi | --program-suff \ | --program-suf | --program-su | --program-s) ac_prev=program_suffix ;; -program-suffix=* | --program-suffix=* | --program-suffi=* \ | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) program_suffix=$ac_optarg ;; -program-transform-name | --program-transform-name \ | --program-transform-nam | --program-transform-na \ | --program-transform-n | --program-transform- \ | --program-transform | --program-transfor \ | --program-transfo | --program-transf \ | --program-trans | --program-tran \ | --progr-tra | --program-tr | --program-t) ac_prev=program_transform_name ;; -program-transform-name=* | --program-transform-name=* \ | --program-transform-nam=* | --program-transform-na=* \ | --program-transform-n=* | --program-transform-=* \ | --program-transform=* | --program-transfor=* \ | --program-transfo=* | --program-transf=* \ | --program-trans=* | --program-tran=* \ | --progr-tra=* | --program-tr=* | --program-t=*) program_transform_name=$ac_optarg ;; -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd) ac_prev=pdfdir ;; -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*) pdfdir=$ac_optarg ;; -psdir | --psdir | --psdi | --psd | --ps) ac_prev=psdir ;; -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*) psdir=$ac_optarg ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) silent=yes ;; -runstatedir | --runstatedir | --runstatedi | --runstated \ | --runstate | --runstat | --runsta | --runst | --runs \ | --run | --ru | --r) ac_prev=runstatedir ;; -runstatedir=* | --runstatedir=* | --runstatedi=* | --runstated=* \ | --runstate=* | --runstat=* | --runsta=* | --runst=* | --runs=* \ | --run=* | --ru=* | --r=*) runstatedir=$ac_optarg ;; -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) ac_prev=sbindir ;; -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ | --sbi=* | --sb=*) sbindir=$ac_optarg ;; -sharedstatedir | --sharedstatedir | --sharedstatedi \ | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ | --sharedst | --shareds | --shared | --share | --shar \ | --sha | --sh) ac_prev=sharedstatedir ;; -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ | --sha=* | --sh=*) sharedstatedir=$ac_optarg ;; -site | --site | --sit) ac_prev=site ;; -site=* | --site=* | --sit=*) site=$ac_optarg ;; -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) ac_prev=srcdir ;; -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) srcdir=$ac_optarg ;; -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ | --syscon | --sysco | --sysc | --sys | --sy) ac_prev=sysconfdir ;; -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) sysconfdir=$ac_optarg ;; -target | --target | --targe | --targ | --tar | --ta | --t) ac_prev=target_alias ;; -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) target_alias=$ac_optarg ;; -v | -verbose | --verbose | --verbos | --verbo | --verb) verbose=yes ;; -version | --version | --versio | --versi | --vers | -V) ac_init_version=: ;; -with-* | --with-*) ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid package name: '$ac_useropt'" ac_useropt_orig=$ac_useropt ac_useropt=`printf "%s\n" "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval with_$ac_useropt=\$ac_optarg ;; -without-* | --without-*) ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid package name: '$ac_useropt'" ac_useropt_orig=$ac_useropt ac_useropt=`printf "%s\n" "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval with_$ac_useropt=no ;; --x) # Obsolete; use --with-x. with_x=yes ;; -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ | --x-incl | --x-inc | --x-in | --x-i) ac_prev=x_includes ;; -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) x_includes=$ac_optarg ;; -x-libraries | --x-libraries | --x-librarie | --x-librari \ | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) ac_prev=x_libraries ;; -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) x_libraries=$ac_optarg ;; -*) as_fn_error $? "unrecognized option: '$ac_option' Try '$0 --help' for more information" ;; *=*) ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` # Reject names that are not valid shell variable names. case $ac_envvar in #( '' | [0-9]* | *[!_$as_cr_alnum]* ) as_fn_error $? "invalid variable name: '$ac_envvar'" ;; esac eval $ac_envvar=\$ac_optarg export $ac_envvar ;; *) # FIXME: should be removed in autoconf 3.0. printf "%s\n" "$as_me: WARNING: you should use --build, --host, --target" >&2 expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && printf "%s\n" "$as_me: WARNING: invalid host type: $ac_option" >&2 : "${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}" ;; esac done if test -n "$ac_prev"; then ac_option=--`echo $ac_prev | sed 's/_/-/g'` as_fn_error $? "missing argument to $ac_option" fi if test -n "$ac_unrecognized_opts"; then case $enable_option_checking in no) ;; fatal) as_fn_error $? "unrecognized options: $ac_unrecognized_opts" ;; *) printf "%s\n" "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;; esac fi # Check all directory arguments for consistency. for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \ datadir sysconfdir sharedstatedir localstatedir includedir \ oldincludedir docdir infodir htmldir dvidir pdfdir psdir \ libdir localedir mandir runstatedir do eval ac_val=\$$ac_var # Remove trailing slashes. case $ac_val in */ ) ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'` eval $ac_var=\$ac_val;; esac # Be sure to have absolute directory names. case $ac_val in [\\/$]* | ?:[\\/]* ) continue;; NONE | '' ) case $ac_var in *prefix ) continue;; esac;; esac as_fn_error $? "expected an absolute directory name for --$ac_var: $ac_val" done # There might be people who depend on the old broken behavior: '$host' # used to hold the argument of --host etc. # FIXME: To remove some day. build=$build_alias host=$host_alias target=$target_alias # FIXME: To remove some day. if test "x$host_alias" != x; then if test "x$build_alias" = x; then cross_compiling=maybe elif test "x$build_alias" != "x$host_alias"; then cross_compiling=yes fi fi ac_tool_prefix= test -n "$host_alias" && ac_tool_prefix=$host_alias- test "$silent" = yes && exec 6>/dev/null ac_pwd=`pwd` && test -n "$ac_pwd" && ac_ls_di=`ls -di .` && ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` || as_fn_error $? "working directory cannot be determined" test "X$ac_ls_di" = "X$ac_pwd_ls_di" || as_fn_error $? "pwd does not report name of working directory" # Find the source files, if location was not specified. if test -z "$srcdir"; then ac_srcdir_defaulted=yes # Try the directory containing this script, then the parent directory. ac_confdir=`$as_dirname -- "$as_myself" || $as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_myself" : 'X\(//\)[^/]' \| \ X"$as_myself" : 'X\(//\)$' \| \ X"$as_myself" : 'X\(/\)' \| . 2>/dev/null || printf "%s\n" X"$as_myself" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` srcdir=$ac_confdir if test ! -r "$srcdir/$ac_unique_file"; then srcdir=.. fi else ac_srcdir_defaulted=no fi if test ! -r "$srcdir/$ac_unique_file"; then test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .." as_fn_error $? "cannot find sources ($ac_unique_file) in $srcdir" fi ac_msg="sources are in $srcdir, but 'cd $srcdir' does not work" ac_abs_confdir=`( cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error $? "$ac_msg" pwd)` # When building in place, set srcdir=. if test "$ac_abs_confdir" = "$ac_pwd"; then srcdir=. fi # Remove unnecessary trailing slashes from srcdir. # Double slashes in file names in object file debugging info # mess up M-x gdb in Emacs. case $srcdir in */) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;; esac for ac_var in $ac_precious_vars; do eval ac_env_${ac_var}_set=\${${ac_var}+set} eval ac_env_${ac_var}_value=\$${ac_var} eval ac_cv_env_${ac_var}_set=\${${ac_var}+set} eval ac_cv_env_${ac_var}_value=\$${ac_var} done # # Report the --help message. # 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 GNU Screen 5.0.2 to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... To assign environment variables (e.g., CC, CFLAGS...), specify them as VAR=VALUE. See below for descriptions of some of the useful variables. Defaults for the options are specified in brackets. Configuration: -h, --help display this help and exit --help=short display options specific to this package --help=recursive display the short help of all the included packages -V, --version display version information and exit -q, --quiet, --silent do not print 'checking ...' messages --cache-file=FILE cache test results in FILE [disabled] -C, --config-cache alias for '--cache-file=config.cache' -n, --no-create do not create output files --srcdir=DIR find the sources in DIR [configure dir or '..'] Installation directories: --prefix=PREFIX install architecture-independent files in PREFIX [$ac_default_prefix] --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX [PREFIX] By default, 'make install' will install all the files in '$ac_default_prefix/bin', '$ac_default_prefix/lib' etc. You can specify an installation prefix other than '$ac_default_prefix' using '--prefix', for instance '--prefix=\$HOME'. For better control, use the options below. Fine tuning of the installation directories: --bindir=DIR user executables [EPREFIX/bin] --sbindir=DIR system admin executables [EPREFIX/sbin] --libexecdir=DIR program executables [EPREFIX/libexec] --sysconfdir=DIR read-only single-machine data [PREFIX/etc] --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] --localstatedir=DIR modifiable single-machine data [PREFIX/var] --runstatedir=DIR modifiable per-process data [LOCALSTATEDIR/run] --libdir=DIR object code libraries [EPREFIX/lib] --includedir=DIR C header files [PREFIX/include] --oldincludedir=DIR C header files for non-gcc [/usr/include] --datarootdir=DIR read-only arch.-independent data root [PREFIX/share] --datadir=DIR read-only architecture-independent data [DATAROOTDIR] --infodir=DIR info documentation [DATAROOTDIR/info] --localedir=DIR locale-dependent data [DATAROOTDIR/locale] --mandir=DIR man documentation [DATAROOTDIR/man] --docdir=DIR documentation root [DATAROOTDIR/doc/screen] --htmldir=DIR html documentation [DOCDIR] --dvidir=DIR dvi documentation [DOCDIR] --pdfdir=DIR pdf documentation [DOCDIR] --psdir=DIR ps documentation [DOCDIR] _ACEOF cat <<\_ACEOF _ACEOF fi if test -n "$ac_init_help"; then case $ac_init_help in short | recursive ) echo "Configuration of GNU Screen 5.0.2:";; esac cat <<\_ACEOF Optional Features: --disable-option-checking ignore unrecognized --enable/--with options --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) --enable-FEATURE[=ARG] include FEATURE [ARG=yes] --enable-pam enable PAM support (default: enabled) --enable-utmp enable utmp support (default: disabled) --enable-telnet enable telnet support (default: disabled) --enable-socket-dir enable global socket directory (default: disabled) Optional Packages: --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) --with-system_screenrc set location of system screenrc (default: /etc/screenrc) --with-pty-mode set pty mode (default: 0620) --with-pty-group set pty group (default: 5) --with-pty-rofs set rofs handling (default: no) Some influential environment variables: CC C compiler command CFLAGS C compiler flags LDFLAGS linker flags, e.g. -L if you have libraries in a nonstandard directory LIBS libraries to pass to the linker, e.g. -l CPPFLAGS (Objective) C/C++ preprocessor flags, e.g. -I if you have headers in a nonstandard directory Use these variables to override the choices made by 'configure' or to help it to find libraries and programs with nonstandard names/locations. Report bugs to . GNU Screen home page: . General help using GNU software: . _ACEOF ac_status=$? fi if test "$ac_init_help" = "recursive"; then # If there are subdirs, report their specific --help. for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue test -d "$ac_dir" || { cd "$srcdir" && ac_pwd=`pwd` && srcdir=. && test -d "$ac_dir"; } || continue ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`printf "%s\n" "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`printf "%s\n" "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix cd "$ac_dir" || { ac_status=$?; continue; } # Check for configure.gnu first; this name is used for a wrapper for # Metaconfig's "Configure" on case-insensitive file systems. if test -f "$ac_srcdir/configure.gnu"; then echo && $SHELL "$ac_srcdir/configure.gnu" --help=recursive elif test -f "$ac_srcdir/configure"; then echo && $SHELL "$ac_srcdir/configure" --help=recursive else printf "%s\n" "$as_me: WARNING: no configuration information is in $ac_dir" >&2 fi || ac_status=$? cd "$ac_pwd" || { ac_status=$?; break; } done fi test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF GNU Screen configure 5.0.2 generated by GNU Autoconf 2.72 Copyright (C) 2023 Free Software Foundation, Inc. This configure script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it. _ACEOF exit fi ## ------------------------ ## ## Autoconf initialization. ## ## ------------------------ ## # ac_fn_c_try_compile LINENO # -------------------------- # Try to compile conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext conftest.beam if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" printf "%s\n" "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext then : ac_retval=0 else case e in #( e) printf "%s\n" "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 ;; esac fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_compile # ac_fn_c_check_header_compile LINENO HEADER VAR INCLUDES # ------------------------------------------------------- # Tests whether HEADER exists and can be compiled using the include files in # INCLUDES, setting the cache variable VAR accordingly. ac_fn_c_check_header_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 printf %s "checking for $2... " >&6; } if eval test \${$3+y} then : printf %s "(cached) " >&6 else case e in #( e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 #include <$2> _ACEOF if ac_fn_c_try_compile "$LINENO" then : eval "$3=yes" else case e in #( e) eval "$3=no" ;; esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ;; esac fi eval ac_res=\$$3 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 printf "%s\n" "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_header_compile # ac_fn_c_try_link LINENO # ----------------------- # Try to link conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_link () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext conftest.beam conftest$ac_exeext if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" printf "%s\n" "$ac_try_echo"; } >&5 (eval "$ac_link") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && { test "$cross_compiling" = yes || test -x conftest$ac_exeext } then : ac_retval=0 else case e in #( e) printf "%s\n" "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 ;; esac fi # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would # interfere with the next link command; also delete a directory that is # left behind by Apple's compiler. We do this before executing the actions. rm -rf conftest.dSYM conftest_ipa8_conftest.oo eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_link # ac_fn_c_check_func LINENO FUNC VAR # ---------------------------------- # Tests whether FUNC exists, setting the cache variable VAR accordingly ac_fn_c_check_func () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 printf %s "checking for $2... " >&6; } if eval test \${$3+y} then : printf %s "(cached) " >&6 else case e in #( e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Define $2 to an innocuous variant, in case declares $2. For example, HP-UX 11i declares gettimeofday. */ #define $2 innocuous_$2 /* System header to define __stub macros and hopefully few prototypes, which can conflict with char $2 (void); below. */ #include #undef $2 /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char $2 (void); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ #if defined __stub_$2 || defined __stub___$2 choke me #endif int main (void) { return $2 (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO" then : eval "$3=yes" else case e in #( e) eval "$3=no" ;; esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext ;; esac fi eval ac_res=\$$3 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 printf "%s\n" "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_func ac_configure_args_raw= for ac_arg do case $ac_arg in *\'*) ac_arg=`printf "%s\n" "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; esac as_fn_append ac_configure_args_raw " '$ac_arg'" done case $ac_configure_args_raw in *$as_nl*) ac_safe_unquote= ;; *) ac_unsafe_z='|&;<>()$`\\"*?[ '' ' # This string ends in space, tab. ac_unsafe_a="$ac_unsafe_z#~" ac_safe_unquote="s/ '\\([^$ac_unsafe_a][^$ac_unsafe_z]*\\)'/ \\1/g" ac_configure_args_raw=` printf "%s\n" "$ac_configure_args_raw" | sed "$ac_safe_unquote"`;; esac 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 GNU Screen $as_me 5.0.2, which was generated by GNU Autoconf 2.72. Invocation command line was $ $0$ac_configure_args_raw _ACEOF exec 5>>config.log { cat <<_ASUNAME ## --------- ## ## Platform. ## ## --------- ## hostname = `(hostname || uname -n) 2>/dev/null | sed 1q` uname -m = `(uname -m) 2>/dev/null || echo unknown` uname -r = `(uname -r) 2>/dev/null || echo unknown` uname -s = `(uname -s) 2>/dev/null || echo unknown` uname -v = `(uname -v) 2>/dev/null || echo unknown` /usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown` /bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown` /bin/arch = `(/bin/arch) 2>/dev/null || echo unknown` /usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown` /usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown` /usr/bin/hostinfo = `(/usr/bin/hostinfo) 2>/dev/null || echo unknown` /bin/machine = `(/bin/machine) 2>/dev/null || echo unknown` /usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown` /bin/universe = `(/bin/universe) 2>/dev/null || echo unknown` _ASUNAME as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac printf "%s\n" "PATH: $as_dir" done IFS=$as_save_IFS } >&5 cat >&5 <<_ACEOF ## ----------- ## ## Core tests. ## ## ----------- ## _ACEOF # Keep a trace of the command line. # Strip out --no-create and --no-recursion so they do not pile up. # Strip out --silent because we don't want to record it for future runs. # Also quote any args containing shell meta-characters. # Make two passes to allow for proper duplicate-argument suppression. ac_configure_args= ac_configure_args0= ac_configure_args1= ac_must_keep_next=false for ac_pass in 1 2 do for ac_arg do case $ac_arg in -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) continue ;; *\'*) ac_arg=`printf "%s\n" "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; esac case $ac_pass in 1) as_fn_append ac_configure_args0 " '$ac_arg'" ;; 2) as_fn_append ac_configure_args1 " '$ac_arg'" if test $ac_must_keep_next = true; then ac_must_keep_next=false # Got value, back to normal. else case $ac_arg in *=* | --config-cache | -C | -disable-* | --disable-* \ | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \ | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \ | -with-* | --with-* | -without-* | --without-* | --x) case "$ac_configure_args0 " in "$ac_configure_args1"*" '$ac_arg' "* ) continue ;; esac ;; -* ) ac_must_keep_next=true ;; esac fi as_fn_append ac_configure_args " '$ac_arg'" ;; esac done done { ac_configure_args0=; unset ac_configure_args0;} { ac_configure_args1=; unset ac_configure_args1;} # When interrupted or exit'd, cleanup temporary files, and complete # config.log. We remove comments because anyway the quotes in there # would cause problems or look ugly. # WARNING: Use '\'' to represent an apostrophe within the trap. # WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug. trap 'exit_status=$? # Sanitize IFS. IFS=" "" $as_nl" # Save into config.log some information that might help in debugging. { echo printf "%s\n" "## ---------------- ## ## Cache variables. ## ## ---------------- ##" echo # The following way of writing the cache mishandles newlines in values, ( for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 printf "%s\n" "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #( *${as_nl}ac_space=\ *) sed -n \ "s/'\''/'\''\\\\'\'''\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p" ;; #( *) sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) echo printf "%s\n" "## ----------------- ## ## Output variables. ## ## ----------------- ##" echo for ac_var in $ac_subst_vars do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`printf "%s\n" "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac printf "%s\n" "$ac_var='\''$ac_val'\''" done | sort echo if test -n "$ac_subst_files"; then printf "%s\n" "## ------------------- ## ## File substitutions. ## ## ------------------- ##" echo for ac_var in $ac_subst_files do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`printf "%s\n" "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac printf "%s\n" "$ac_var='\''$ac_val'\''" done | sort echo fi if test -s confdefs.h; then printf "%s\n" "## ----------- ## ## confdefs.h. ## ## ----------- ##" echo cat confdefs.h echo fi test "$ac_signal" != 0 && printf "%s\n" "$as_me: caught signal $ac_signal" printf "%s\n" "$as_me: exit $exit_status" } >&5 rm -f core *.core core.conftest.* && rm -f -r conftest* confdefs* conf$$* $ac_clean_files && exit $exit_status ' 0 for ac_signal in 1 2 13 15; do trap 'ac_signal='$ac_signal'; as_fn_exit 1' $ac_signal done ac_signal=0 # confdefs.h avoids OS command line length limits that DEFS can exceed. rm -f -r conftest* confdefs.h printf "%s\n" "/* confdefs.h */" > confdefs.h # Predefined preprocessor variables. printf "%s\n" "#define PACKAGE_NAME \"$PACKAGE_NAME\"" >>confdefs.h printf "%s\n" "#define PACKAGE_TARNAME \"$PACKAGE_TARNAME\"" >>confdefs.h printf "%s\n" "#define PACKAGE_VERSION \"$PACKAGE_VERSION\"" >>confdefs.h printf "%s\n" "#define PACKAGE_STRING \"$PACKAGE_STRING\"" >>confdefs.h printf "%s\n" "#define PACKAGE_BUGREPORT \"$PACKAGE_BUGREPORT\"" >>confdefs.h printf "%s\n" "#define PACKAGE_URL \"$PACKAGE_URL\"" >>confdefs.h # Let the site file select an alternate cache file if it wants to. # Prefer an explicitly selected file to automatically selected ones. if test -n "$CONFIG_SITE"; then ac_site_files="$CONFIG_SITE" elif test "x$prefix" != xNONE; then ac_site_files="$prefix/share/config.site $prefix/etc/config.site" else ac_site_files="$ac_default_prefix/share/config.site $ac_default_prefix/etc/config.site" fi for ac_site_file in $ac_site_files do case $ac_site_file in #( */*) : ;; #( *) : ac_site_file=./$ac_site_file ;; esac if test -f "$ac_site_file" && test -r "$ac_site_file"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5 printf "%s\n" "$as_me: loading site script $ac_site_file" >&6;} sed 's/^/| /' "$ac_site_file" >&5 . "$ac_site_file" \ || { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in '$ac_pwd':" >&5 printf "%s\n" "$as_me: error: in '$ac_pwd':" >&2;} as_fn_error $? "failed to load site script $ac_site_file See 'config.log' for more details" "$LINENO" 5; } fi done if test -r "$cache_file"; then # Some versions of bash will fail to source /dev/null (special files # actually), so we avoid doing that. DJGPP emulates it as a regular file. if test /dev/null != "$cache_file" && test -f "$cache_file"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5 printf "%s\n" "$as_me: loading cache $cache_file" >&6;} case $cache_file in [\\/]* | ?:[\\/]* ) . "$cache_file";; *) . "./$cache_file";; esac fi else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5 printf "%s\n" "$as_me: creating cache $cache_file" >&6;} >$cache_file fi as_fn_append ac_header_c_list " stdio.h stdio_h HAVE_STDIO_H" # Test code for whether the C compiler supports C89 (global declarations) ac_c_conftest_c89_globals=' /* Does the compiler advertise C89 conformance? Do not test the value of __STDC__, because some compilers set it to 0 while being otherwise adequately conformant. */ #if !defined __STDC__ # error "Compiler does not advertise C89 conformance" #endif #include #include struct stat; /* Most of the following tests are stolen from RCS 5.7 src/conf.sh. */ struct buf { int x; }; struct buf * (*rcsopen) (struct buf *, struct stat *, int); static char *e (char **p, int i) { return p[i]; } static char *f (char * (*g) (char **, int), char **p, ...) { char *s; va_list v; va_start (v,p); s = g (p, va_arg (v,int)); va_end (v); return s; } /* C89 style stringification. */ #define noexpand_stringify(a) #a const char *stringified = noexpand_stringify(arbitrary+token=sequence); /* C89 style token pasting. Exercises some of the corner cases that e.g. old MSVC gets wrong, but not very hard. */ #define noexpand_concat(a,b) a##b #define expand_concat(a,b) noexpand_concat(a,b) extern int vA; extern int vbee; #define aye A #define bee B int *pvA = &expand_concat(v,aye); int *pvbee = &noexpand_concat(v,bee); /* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has function prototypes and stuff, but not \xHH hex character constants. These do not provoke an error unfortunately, instead are silently treated as an "x". The following induces an error, until -std is added to get proper ANSI mode. Curiously \x00 != x always comes out true, for an array size at least. It is necessary to write \x00 == 0 to get something that is true only with -std. */ int osf4_cc_array ['\''\x00'\'' == 0 ? 1 : -1]; /* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters inside strings and character constants. */ #define FOO(x) '\''x'\'' int xlc6_cc_array[FOO(a) == '\''x'\'' ? 1 : -1]; int test (int i, double x); struct s1 {int (*f) (int a);}; struct s2 {int (*f) (double a);}; int pairnames (int, char **, int *(*)(struct buf *, struct stat *, int), int, int);' # Test code for whether the C compiler supports C89 (body of main). ac_c_conftest_c89_main=' ok |= (argc == 0 || f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]); ' # Test code for whether the C compiler supports C99 (global declarations) ac_c_conftest_c99_globals=' /* Does the compiler advertise C99 conformance? */ #if !defined __STDC_VERSION__ || __STDC_VERSION__ < 199901L # error "Compiler does not advertise C99 conformance" #endif // See if C++-style comments work. #include extern int puts (const char *); extern int printf (const char *, ...); extern int dprintf (int, const char *, ...); extern void *malloc (size_t); extern void free (void *); // Check varargs macros. These examples are taken from C99 6.10.3.5. // dprintf is used instead of fprintf to avoid needing to declare // FILE and stderr. #define debug(...) dprintf (2, __VA_ARGS__) #define showlist(...) puts (#__VA_ARGS__) #define report(test,...) ((test) ? puts (#test) : printf (__VA_ARGS__)) static void test_varargs_macros (void) { int x = 1234; int y = 5678; debug ("Flag"); debug ("X = %d\n", x); showlist (The first, second, and third items.); report (x>y, "x is %d but y is %d", x, y); } // Check long long types. #define BIG64 18446744073709551615ull #define BIG32 4294967295ul #define BIG_OK (BIG64 / BIG32 == 4294967297ull && BIG64 % BIG32 == 0) #if !BIG_OK #error "your preprocessor is broken" #endif #if BIG_OK #else #error "your preprocessor is broken" #endif static long long int bignum = -9223372036854775807LL; static unsigned long long int ubignum = BIG64; struct incomplete_array { int datasize; double data[]; }; struct named_init { int number; const wchar_t *name; double average; }; typedef const char *ccp; static inline int test_restrict (ccp restrict text) { // Iterate through items via the restricted pointer. // Also check for declarations in for loops. for (unsigned int i = 0; *(text+i) != '\''\0'\''; ++i) continue; return 0; } // Check varargs and va_copy. static bool test_varargs (const char *format, ...) { va_list args; va_start (args, format); va_list args_copy; va_copy (args_copy, args); const char *str = ""; int number = 0; float fnumber = 0; while (*format) { switch (*format++) { case '\''s'\'': // string str = va_arg (args_copy, const char *); break; case '\''d'\'': // int number = va_arg (args_copy, int); break; case '\''f'\'': // float fnumber = va_arg (args_copy, double); break; default: break; } } va_end (args_copy); va_end (args); return *str && number && fnumber; } ' # Test code for whether the C compiler supports C99 (body of main). ac_c_conftest_c99_main=' // Check bool. _Bool success = false; success |= (argc != 0); // Check restrict. if (test_restrict ("String literal") == 0) success = true; char *restrict newvar = "Another string"; // Check varargs. success &= test_varargs ("s, d'\'' f .", "string", 65, 34.234); test_varargs_macros (); // Check flexible array members. struct incomplete_array *ia = malloc (sizeof (struct incomplete_array) + (sizeof (double) * 10)); ia->datasize = 10; for (int i = 0; i < ia->datasize; ++i) ia->data[i] = i * 1.234; // Work around memory leak warnings. free (ia); // Check named initializers. struct named_init ni = { .number = 34, .name = L"Test wide string", .average = 543.34343, }; ni.number = 58; int dynamic_array[ni.number]; dynamic_array[0] = argv[0][0]; dynamic_array[ni.number - 1] = 543; // work around unused variable warnings ok |= (!success || bignum == 0LL || ubignum == 0uLL || newvar[0] == '\''x'\'' || dynamic_array[ni.number - 1] != 543); ' # Test code for whether the C compiler supports C11 (global declarations) ac_c_conftest_c11_globals=' /* Does the compiler advertise C11 conformance? */ #if !defined __STDC_VERSION__ || __STDC_VERSION__ < 201112L # error "Compiler does not advertise C11 conformance" #endif // Check _Alignas. char _Alignas (double) aligned_as_double; char _Alignas (0) no_special_alignment; extern char aligned_as_int; char _Alignas (0) _Alignas (int) aligned_as_int; // Check _Alignof. enum { int_alignment = _Alignof (int), int_array_alignment = _Alignof (int[100]), char_alignment = _Alignof (char) }; _Static_assert (0 < -_Alignof (int), "_Alignof is signed"); // Check _Noreturn. int _Noreturn does_not_return (void) { for (;;) continue; } // Check _Static_assert. struct test_static_assert { int x; _Static_assert (sizeof (int) <= sizeof (long int), "_Static_assert does not work in struct"); long int y; }; // Check UTF-8 literals. #define u8 syntax error! char const utf8_literal[] = u8"happens to be ASCII" "another string"; // Check duplicate typedefs. typedef long *long_ptr; typedef long int *long_ptr; typedef long_ptr long_ptr; // Anonymous structures and unions -- taken from C11 6.7.2.1 Example 1. struct anonymous { union { struct { int i; int j; }; struct { int k; long int l; } w; }; int m; } v1; ' # Test code for whether the C compiler supports C11 (body of main). ac_c_conftest_c11_main=' _Static_assert ((offsetof (struct anonymous, i) == offsetof (struct anonymous, w.k)), "Anonymous union alignment botch"); v1.i = 2; v1.w.k = 5; ok |= v1.i != 5; ' # Test code for whether the C compiler supports C11 (complete). ac_c_conftest_c11_program="${ac_c_conftest_c89_globals} ${ac_c_conftest_c99_globals} ${ac_c_conftest_c11_globals} int main (int argc, char **argv) { int ok = 0; ${ac_c_conftest_c89_main} ${ac_c_conftest_c99_main} ${ac_c_conftest_c11_main} return ok; } " # Test code for whether the C compiler supports C99 (complete). ac_c_conftest_c99_program="${ac_c_conftest_c89_globals} ${ac_c_conftest_c99_globals} int main (int argc, char **argv) { int ok = 0; ${ac_c_conftest_c89_main} ${ac_c_conftest_c99_main} return ok; } " # Test code for whether the C compiler supports C89 (complete). ac_c_conftest_c89_program="${ac_c_conftest_c89_globals} int main (int argc, char **argv) { int ok = 0; ${ac_c_conftest_c89_main} return ok; } " as_fn_append ac_header_c_list " stdlib.h stdlib_h HAVE_STDLIB_H" as_fn_append ac_header_c_list " string.h string_h HAVE_STRING_H" as_fn_append ac_header_c_list " inttypes.h inttypes_h HAVE_INTTYPES_H" as_fn_append ac_header_c_list " stdint.h stdint_h HAVE_STDINT_H" as_fn_append ac_header_c_list " strings.h strings_h HAVE_STRINGS_H" as_fn_append ac_header_c_list " sys/stat.h sys_stat_h HAVE_SYS_STAT_H" as_fn_append ac_header_c_list " sys/types.h sys_types_h HAVE_SYS_TYPES_H" as_fn_append ac_header_c_list " unistd.h unistd_h HAVE_UNISTD_H" as_fn_append ac_header_c_list " wchar.h wchar_h HAVE_WCHAR_H" as_fn_append ac_header_c_list " minix/config.h minix_config_h HAVE_MINIX_CONFIG_H" # Auxiliary files required by this configure script. ac_aux_files="install-sh" # Locations in which to look for auxiliary files. ac_aux_dir_candidates="${srcdir}${PATH_SEPARATOR}${srcdir}/..${PATH_SEPARATOR}${srcdir}/../.." # Search for a directory containing all of the required auxiliary files, # $ac_aux_files, from the $PATH-style list $ac_aux_dir_candidates. # If we don't find one directory that contains all the files we need, # we report the set of missing files from the *first* directory in # $ac_aux_dir_candidates and give up. ac_missing_aux_files="" ac_first_candidate=: printf "%s\n" "$as_me:${as_lineno-$LINENO}: looking for aux files: $ac_aux_files" >&5 as_save_IFS=$IFS; IFS=$PATH_SEPARATOR as_found=false for as_dir in $ac_aux_dir_candidates do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac as_found=: printf "%s\n" "$as_me:${as_lineno-$LINENO}: trying $as_dir" >&5 ac_aux_dir_found=yes ac_install_sh= for ac_aux in $ac_aux_files do # As a special case, if "install-sh" is required, that requirement # can be satisfied by any of "install-sh", "install.sh", or "shtool", # and $ac_install_sh is set appropriately for whichever one is found. if test x"$ac_aux" = x"install-sh" then if test -f "${as_dir}install-sh"; then printf "%s\n" "$as_me:${as_lineno-$LINENO}: ${as_dir}install-sh found" >&5 ac_install_sh="${as_dir}install-sh -c" elif test -f "${as_dir}install.sh"; then printf "%s\n" "$as_me:${as_lineno-$LINENO}: ${as_dir}install.sh found" >&5 ac_install_sh="${as_dir}install.sh -c" elif test -f "${as_dir}shtool"; then printf "%s\n" "$as_me:${as_lineno-$LINENO}: ${as_dir}shtool found" >&5 ac_install_sh="${as_dir}shtool install -c" else ac_aux_dir_found=no if $ac_first_candidate; then ac_missing_aux_files="${ac_missing_aux_files} install-sh" else break fi fi else if test -f "${as_dir}${ac_aux}"; then printf "%s\n" "$as_me:${as_lineno-$LINENO}: ${as_dir}${ac_aux} found" >&5 else ac_aux_dir_found=no if $ac_first_candidate; then ac_missing_aux_files="${ac_missing_aux_files} ${ac_aux}" else break fi fi fi done if test "$ac_aux_dir_found" = yes; then ac_aux_dir="$as_dir" break fi ac_first_candidate=false as_found=false done IFS=$as_save_IFS if $as_found then : else case e in #( e) as_fn_error $? "cannot find required auxiliary files:$ac_missing_aux_files" "$LINENO" 5 ;; esac fi # These three variables are undocumented and unsupported, # and are intended to be withdrawn in a future Autoconf release. # They can cause serious problems if a builder's source tree is in a directory # whose full name contains unusual characters. if test -f "${ac_aux_dir}config.guess"; then ac_config_guess="$SHELL ${ac_aux_dir}config.guess" fi if test -f "${ac_aux_dir}config.sub"; then ac_config_sub="$SHELL ${ac_aux_dir}config.sub" fi if test -f "$ac_aux_dir/configure"; then ac_configure="$SHELL ${ac_aux_dir}configure" fi # Check that the precious variables saved in the cache have kept the same # value. ac_cache_corrupted=false for ac_var in $ac_precious_vars; do eval ac_old_set=\$ac_cv_env_${ac_var}_set eval ac_new_set=\$ac_env_${ac_var}_set eval ac_old_val=\$ac_cv_env_${ac_var}_value eval ac_new_val=\$ac_env_${ac_var}_value case $ac_old_set,$ac_new_set in set,) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: '$ac_var' was set to '$ac_old_val' in the previous run" >&5 printf "%s\n" "$as_me: error: '$ac_var' was set to '$ac_old_val' in the previous run" >&2;} ac_cache_corrupted=: ;; ,set) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: '$ac_var' was not set in the previous run" >&5 printf "%s\n" "$as_me: error: '$ac_var' was not set in the previous run" >&2;} ac_cache_corrupted=: ;; ,);; *) if test "x$ac_old_val" != "x$ac_new_val"; then # differences in whitespace do not lead to failure. ac_old_val_w=`echo x $ac_old_val` ac_new_val_w=`echo x $ac_new_val` if test "$ac_old_val_w" != "$ac_new_val_w"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: '$ac_var' has changed since the previous run:" >&5 printf "%s\n" "$as_me: error: '$ac_var' has changed since the previous run:" >&2;} ac_cache_corrupted=: else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in '$ac_var' since the previous run:" >&5 printf "%s\n" "$as_me: warning: ignoring whitespace changes in '$ac_var' since the previous run:" >&2;} eval $ac_var=\$ac_old_val fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: former value: '$ac_old_val'" >&5 printf "%s\n" "$as_me: former value: '$ac_old_val'" >&2;} { printf "%s\n" "$as_me:${as_lineno-$LINENO}: current value: '$ac_new_val'" >&5 printf "%s\n" "$as_me: current value: '$ac_new_val'" >&2;} fi;; esac # Pass precious variables to config.status. if test "$ac_new_set" = set; then case $ac_new_val in *\'*) ac_arg=$ac_var=`printf "%s\n" "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;; *) ac_arg=$ac_var=$ac_new_val ;; esac case " $ac_configure_args " in *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy. *) as_fn_append ac_configure_args " '$ac_arg'" ;; esac fi done if $ac_cache_corrupted; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in '$ac_pwd':" >&5 printf "%s\n" "$as_me: error: in '$ac_pwd':" >&2;} { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5 printf "%s\n" "$as_me: error: changes in the environment can compromise the build" >&2;} as_fn_error $? "run '${MAKE-make} distclean' and/or 'rm $cache_file' and start over" "$LINENO" 5 fi ## -------------------- ## ## Main body of script. ## ## -------------------- ## ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu ac_config_headers="$ac_config_headers config.h" cat >>confdefs.h <<_ACEOF #define VERSION_MAJOR `echo $PACKAGE_VERSION | cut -d . -f 1` _ACEOF cat >>confdefs.h <<_ACEOF #define VERSION_MINOR `echo $PACKAGE_VERSION | cut -d . -f 2 | cut -d - -f 1` _ACEOF cat >>confdefs.h <<_ACEOF #define VERSION_REVISION `echo $PACKAGE_VERSION | cut -d . -f 3 | cut -d - -f 1` _ACEOF ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. set dummy ${ac_tool_prefix}gcc; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_CC+y} then : printf %s "(cached) " >&6 else case e in #( e) if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}gcc" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi ;; esac fi CC=$ac_cv_prog_CC if test -n "$CC"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 printf "%s\n" "$CC" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi fi if test -z "$ac_cv_prog_CC"; then ac_ct_CC=$CC # Extract the first word of "gcc", so it can be a program name with args. set dummy gcc; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_ac_ct_CC+y} then : printf %s "(cached) " >&6 else case e in #( e) if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="gcc" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi ;; esac fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 printf "%s\n" "$ac_ct_CC" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi else CC="$ac_cv_prog_CC" fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. set dummy ${ac_tool_prefix}cc; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_CC+y} then : printf %s "(cached) " >&6 else case e in #( e) if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}cc" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi ;; esac fi CC=$ac_cv_prog_CC if test -n "$CC"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 printf "%s\n" "$CC" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi fi fi if test -z "$CC"; then # Extract the first word of "cc", so it can be a program name with args. set dummy cc; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_CC+y} then : printf %s "(cached) " >&6 else case e in #( e) if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else ac_prog_rejected=no as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then if test "$as_dir$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then ac_prog_rejected=yes continue fi ac_cv_prog_CC="cc" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS if test $ac_prog_rejected = yes; then # We found a bogon in the path, so make sure we never use it. set dummy $ac_cv_prog_CC shift if test $# != 0; then # We chose a different compiler from the bogus one. # However, it has the same basename, so the bogon will be chosen # first if we set CC to just the basename; use the full file name. shift ac_cv_prog_CC="$as_dir$ac_word${1+' '}$@" fi fi fi ;; esac fi CC=$ac_cv_prog_CC if test -n "$CC"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 printf "%s\n" "$CC" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then for ac_prog in cl.exe do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_CC+y} then : printf %s "(cached) " >&6 else case e in #( e) if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_CC="$ac_tool_prefix$ac_prog" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi ;; esac fi CC=$ac_cv_prog_CC if test -n "$CC"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 printf "%s\n" "$CC" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi test -n "$CC" && break done fi if test -z "$CC"; then ac_ct_CC=$CC for ac_prog in cl.exe do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_ac_ct_CC+y} then : printf %s "(cached) " >&6 else case e in #( e) if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="$ac_prog" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi ;; esac fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 printf "%s\n" "$ac_ct_CC" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi test -n "$ac_ct_CC" && break done if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi fi fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}clang", so it can be a program name with args. set dummy ${ac_tool_prefix}clang; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_CC+y} then : printf %s "(cached) " >&6 else case e in #( e) if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}clang" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi ;; esac fi CC=$ac_cv_prog_CC if test -n "$CC"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 printf "%s\n" "$CC" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi fi if test -z "$ac_cv_prog_CC"; then ac_ct_CC=$CC # Extract the first word of "clang", so it can be a program name with args. set dummy clang; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_ac_ct_CC+y} then : printf %s "(cached) " >&6 else case e in #( e) if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="clang" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi ;; esac fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 printf "%s\n" "$ac_ct_CC" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi else CC="$ac_cv_prog_CC" fi fi test -z "$CC" && { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in '$ac_pwd':" >&5 printf "%s\n" "$as_me: error: in '$ac_pwd':" >&2;} as_fn_error $? "no acceptable C compiler found in \$PATH See 'config.log' for more details" "$LINENO" 5; } # Provide some information about the compiler. printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5 set X $ac_compile ac_compiler=$2 for ac_option in --version -v -V -qversion -version; do { { ac_try="$ac_compiler $ac_option >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" printf "%s\n" "$ac_try_echo"; } >&5 (eval "$ac_compiler $ac_option >&5") 2>conftest.err ac_status=$? if test -s conftest.err; then sed '10a\ ... rest of stderr output deleted ... 10q' conftest.err >conftest.er1 cat conftest.er1 >&5 fi rm -f conftest.er1 conftest.err printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } done cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main (void) { ; return 0; } _ACEOF ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out" # Try to create an executable without -o first, disregard a.out. # It will help us diagnose broken compilers, and finding out an intuition # of exeext. { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the C compiler works" >&5 printf %s "checking whether the C compiler works... " >&6; } ac_link_default=`printf "%s\n" "$ac_link" | sed 's/ -o *conftest[^ ]*//'` # The possible output files: ac_files="a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*" ac_rmfiles= for ac_file in $ac_files do case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; * ) ac_rmfiles="$ac_rmfiles $ac_file";; esac done rm -f $ac_rmfiles if { { ac_try="$ac_link_default" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" printf "%s\n" "$ac_try_echo"; } >&5 (eval "$ac_link_default") 2>&5 ac_status=$? printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } then : # Autoconf-2.13 could set the ac_cv_exeext variable to 'no'. # So ignore a value of 'no', otherwise this would lead to 'EXEEXT = no' # in a Makefile. We should not override ac_cv_exeext if it was cached, # so that the user can short-circuit this test for compilers unknown to # Autoconf. for ac_file in $ac_files '' do test -f "$ac_file" || continue case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; [ab].out ) # We found the default executable, but exeext='' is most # certainly right. break;; *.* ) if test ${ac_cv_exeext+y} && test "$ac_cv_exeext" != no; then :; else ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` fi # We set ac_cv_exeext here because the later test for it is not # safe: cross compilers may not add the suffix if given an '-o' # argument, so we may need to know it at that point already. # Even if this section looks crufty: it has the advantage of # actually working. break;; * ) break;; esac done test "$ac_cv_exeext" = no && ac_cv_exeext= else case e in #( e) ac_file='' ;; esac fi if test -z "$ac_file" then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } printf "%s\n" "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in '$ac_pwd':" >&5 printf "%s\n" "$as_me: error: in '$ac_pwd':" >&2;} as_fn_error 77 "C compiler cannot create executables See 'config.log' for more details" "$LINENO" 5; } else case e in #( e) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 printf "%s\n" "yes" >&6; } ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for C compiler default output file name" >&5 printf %s "checking for C compiler default output file name... " >&6; } { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5 printf "%s\n" "$ac_file" >&6; } ac_exeext=$ac_cv_exeext rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out ac_clean_files=$ac_clean_files_save { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5 printf %s "checking for suffix of executables... " >&6; } if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" printf "%s\n" "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } then : # If both 'conftest.exe' and 'conftest' are 'present' (well, observable) # catch 'conftest.exe'. For instance with Cygwin, 'ls conftest' will # work properly (i.e., refer to 'conftest.exe'), while it won't with # 'rm'. for ac_file in conftest.exe conftest conftest.*; do test -f "$ac_file" || continue case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` break;; * ) break;; esac done else case e in #( e) { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in '$ac_pwd':" >&5 printf "%s\n" "$as_me: error: in '$ac_pwd':" >&2;} as_fn_error $? "cannot compute suffix of executables: cannot compile and link See 'config.log' for more details" "$LINENO" 5; } ;; esac fi rm -f conftest conftest$ac_cv_exeext { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5 printf "%s\n" "$ac_cv_exeext" >&6; } rm -f conftest.$ac_ext EXEEXT=$ac_cv_exeext ac_exeext=$EXEEXT cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main (void) { FILE *f = fopen ("conftest.out", "w"); if (!f) return 1; return ferror (f) || fclose (f) != 0; ; return 0; } _ACEOF ac_clean_files="$ac_clean_files conftest.out" # Check that the compiler produces executables we can run. If not, either # the compiler is broken, or we cross compile. { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5 printf %s "checking whether we are cross compiling... " >&6; } if test "$cross_compiling" != yes; then { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" printf "%s\n" "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } if { ac_try='./conftest$ac_cv_exeext' { { case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" printf "%s\n" "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; }; then cross_compiling=no else if test "$cross_compiling" = maybe; then cross_compiling=yes else { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in '$ac_pwd':" >&5 printf "%s\n" "$as_me: error: in '$ac_pwd':" >&2;} as_fn_error 77 "cannot run C compiled programs. If you meant to cross compile, use '--host'. See 'config.log' for more details" "$LINENO" 5; } fi fi fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5 printf "%s\n" "$cross_compiling" >&6; } rm -f conftest.$ac_ext conftest$ac_cv_exeext \ conftest.o conftest.obj conftest.out ac_clean_files=$ac_clean_files_save { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5 printf %s "checking for suffix of object files... " >&6; } if test ${ac_cv_objext+y} then : printf %s "(cached) " >&6 else case e in #( e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main (void) { ; return 0; } _ACEOF rm -f conftest.o conftest.obj if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" printf "%s\n" "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>&5 ac_status=$? printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } then : for ac_file in conftest.o conftest.obj conftest.*; do test -f "$ac_file" || continue; case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM ) ;; *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'` break;; esac done else case e in #( e) printf "%s\n" "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in '$ac_pwd':" >&5 printf "%s\n" "$as_me: error: in '$ac_pwd':" >&2;} as_fn_error $? "cannot compute suffix of object files: cannot compile See 'config.log' for more details" "$LINENO" 5; } ;; esac fi rm -f conftest.$ac_cv_objext conftest.$ac_ext ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5 printf "%s\n" "$ac_cv_objext" >&6; } OBJEXT=$ac_cv_objext ac_objext=$OBJEXT { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the compiler supports GNU C" >&5 printf %s "checking whether the compiler supports GNU C... " >&6; } if test ${ac_cv_c_compiler_gnu+y} then : printf %s "(cached) " >&6 else case e in #( e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main (void) { #ifndef __GNUC__ choke me #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : ac_compiler_gnu=yes else case e in #( e) ac_compiler_gnu=no ;; esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ac_cv_c_compiler_gnu=$ac_compiler_gnu ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5 printf "%s\n" "$ac_cv_c_compiler_gnu" >&6; } ac_compiler_gnu=$ac_cv_c_compiler_gnu if test $ac_compiler_gnu = yes; then GCC=yes else GCC= fi ac_test_CFLAGS=${CFLAGS+y} ac_save_CFLAGS=$CFLAGS { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5 printf %s "checking whether $CC accepts -g... " >&6; } if test ${ac_cv_prog_cc_g+y} then : printf %s "(cached) " >&6 else case e in #( e) ac_save_c_werror_flag=$ac_c_werror_flag ac_c_werror_flag=yes ac_cv_prog_cc_g=no CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main (void) { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : ac_cv_prog_cc_g=yes else case e in #( e) CFLAGS="" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main (void) { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : else case e in #( e) ac_c_werror_flag=$ac_save_c_werror_flag CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main (void) { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : ac_cv_prog_cc_g=yes fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ;; esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ;; esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ac_c_werror_flag=$ac_save_c_werror_flag ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5 printf "%s\n" "$ac_cv_prog_cc_g" >&6; } if test $ac_test_CFLAGS; then CFLAGS=$ac_save_CFLAGS elif test $ac_cv_prog_cc_g = yes; then if test "$GCC" = yes; then CFLAGS="-g -O2" else CFLAGS="-g" fi else if test "$GCC" = yes; then CFLAGS="-O2" else CFLAGS= fi fi ac_prog_cc_stdc=no if test x$ac_prog_cc_stdc = xno then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $CC option to enable C11 features" >&5 printf %s "checking for $CC option to enable C11 features... " >&6; } if test ${ac_cv_prog_cc_c11+y} then : printf %s "(cached) " >&6 else case e in #( e) ac_cv_prog_cc_c11=no ac_save_CC=$CC cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_c_conftest_c11_program _ACEOF for ac_arg in '' -std=gnu11 do CC="$ac_save_CC $ac_arg" if ac_fn_c_try_compile "$LINENO" then : ac_cv_prog_cc_c11=$ac_arg fi rm -f core conftest.err conftest.$ac_objext conftest.beam test "x$ac_cv_prog_cc_c11" != "xno" && break done rm -f conftest.$ac_ext CC=$ac_save_CC ;; esac fi if test "x$ac_cv_prog_cc_c11" = xno then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 printf "%s\n" "unsupported" >&6; } else case e in #( e) if test "x$ac_cv_prog_cc_c11" = x then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 printf "%s\n" "none needed" >&6; } else case e in #( e) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c11" >&5 printf "%s\n" "$ac_cv_prog_cc_c11" >&6; } CC="$CC $ac_cv_prog_cc_c11" ;; esac fi ac_cv_prog_cc_stdc=$ac_cv_prog_cc_c11 ac_prog_cc_stdc=c11 ;; esac fi fi if test x$ac_prog_cc_stdc = xno then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $CC option to enable C99 features" >&5 printf %s "checking for $CC option to enable C99 features... " >&6; } if test ${ac_cv_prog_cc_c99+y} then : printf %s "(cached) " >&6 else case e in #( e) ac_cv_prog_cc_c99=no ac_save_CC=$CC cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_c_conftest_c99_program _ACEOF for ac_arg in '' -std=gnu99 -std=c99 -c99 -qlanglvl=extc1x -qlanglvl=extc99 -AC99 -D_STDC_C99= do CC="$ac_save_CC $ac_arg" if ac_fn_c_try_compile "$LINENO" then : ac_cv_prog_cc_c99=$ac_arg fi rm -f core conftest.err conftest.$ac_objext conftest.beam test "x$ac_cv_prog_cc_c99" != "xno" && break done rm -f conftest.$ac_ext CC=$ac_save_CC ;; esac fi if test "x$ac_cv_prog_cc_c99" = xno then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 printf "%s\n" "unsupported" >&6; } else case e in #( e) if test "x$ac_cv_prog_cc_c99" = x then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 printf "%s\n" "none needed" >&6; } else case e in #( e) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c99" >&5 printf "%s\n" "$ac_cv_prog_cc_c99" >&6; } CC="$CC $ac_cv_prog_cc_c99" ;; esac fi ac_cv_prog_cc_stdc=$ac_cv_prog_cc_c99 ac_prog_cc_stdc=c99 ;; esac fi fi if test x$ac_prog_cc_stdc = xno then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $CC option to enable C89 features" >&5 printf %s "checking for $CC option to enable C89 features... " >&6; } if test ${ac_cv_prog_cc_c89+y} then : printf %s "(cached) " >&6 else case e in #( e) ac_cv_prog_cc_c89=no ac_save_CC=$CC cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_c_conftest_c89_program _ACEOF for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" do CC="$ac_save_CC $ac_arg" if ac_fn_c_try_compile "$LINENO" then : ac_cv_prog_cc_c89=$ac_arg fi rm -f core conftest.err conftest.$ac_objext conftest.beam test "x$ac_cv_prog_cc_c89" != "xno" && break done rm -f conftest.$ac_ext CC=$ac_save_CC ;; esac fi if test "x$ac_cv_prog_cc_c89" = xno then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 printf "%s\n" "unsupported" >&6; } else case e in #( e) if test "x$ac_cv_prog_cc_c89" = x then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 printf "%s\n" "none needed" >&6; } else case e in #( e) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 printf "%s\n" "$ac_cv_prog_cc_c89" >&6; } CC="$CC $ac_cv_prog_cc_c89" ;; esac fi ac_cv_prog_cc_stdc=$ac_cv_prog_cc_c89 ac_prog_cc_stdc=c89 ;; esac fi fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu ac_header= ac_cache= for ac_item in $ac_header_c_list do if test $ac_cache; then ac_fn_c_check_header_compile "$LINENO" $ac_header ac_cv_header_$ac_cache "$ac_includes_default" if eval test \"x\$ac_cv_header_$ac_cache\" = xyes; then printf "%s\n" "#define $ac_item 1" >> confdefs.h fi ac_header= ac_cache= elif test $ac_header; then ac_cache=$ac_item else ac_header=$ac_item fi done if test $ac_cv_header_stdlib_h = yes && test $ac_cv_header_string_h = yes then : printf "%s\n" "#define STDC_HEADERS 1" >>confdefs.h fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether it is safe to define __EXTENSIONS__" >&5 printf %s "checking whether it is safe to define __EXTENSIONS__... " >&6; } if test ${ac_cv_safe_to_define___extensions__+y} then : printf %s "(cached) " >&6 else case e in #( e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ # define __EXTENSIONS__ 1 $ac_includes_default int main (void) { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : ac_cv_safe_to_define___extensions__=yes else case e in #( e) ac_cv_safe_to_define___extensions__=no ;; esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_safe_to_define___extensions__" >&5 printf "%s\n" "$ac_cv_safe_to_define___extensions__" >&6; } { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether _XOPEN_SOURCE should be defined" >&5 printf %s "checking whether _XOPEN_SOURCE should be defined... " >&6; } if test ${ac_cv_should_define__xopen_source+y} then : printf %s "(cached) " >&6 else case e in #( e) ac_cv_should_define__xopen_source=no if test $ac_cv_header_wchar_h = yes then : cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include mbstate_t x; int main (void) { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : else case e in #( e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #define _XOPEN_SOURCE 500 #include mbstate_t x; int main (void) { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : ac_cv_should_define__xopen_source=yes fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ;; esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext fi ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_should_define__xopen_source" >&5 printf "%s\n" "$ac_cv_should_define__xopen_source" >&6; } printf "%s\n" "#define _ALL_SOURCE 1" >>confdefs.h printf "%s\n" "#define _DARWIN_C_SOURCE 1" >>confdefs.h printf "%s\n" "#define _GNU_SOURCE 1" >>confdefs.h printf "%s\n" "#define _HPUX_ALT_XOPEN_SOCKET_API 1" >>confdefs.h printf "%s\n" "#define _NETBSD_SOURCE 1" >>confdefs.h printf "%s\n" "#define _OPENBSD_SOURCE 1" >>confdefs.h printf "%s\n" "#define _POSIX_PTHREAD_SEMANTICS 1" >>confdefs.h printf "%s\n" "#define __STDC_WANT_IEC_60559_ATTRIBS_EXT__ 1" >>confdefs.h printf "%s\n" "#define __STDC_WANT_IEC_60559_BFP_EXT__ 1" >>confdefs.h printf "%s\n" "#define __STDC_WANT_IEC_60559_DFP_EXT__ 1" >>confdefs.h printf "%s\n" "#define __STDC_WANT_IEC_60559_EXT__ 1" >>confdefs.h printf "%s\n" "#define __STDC_WANT_IEC_60559_FUNCS_EXT__ 1" >>confdefs.h printf "%s\n" "#define __STDC_WANT_IEC_60559_TYPES_EXT__ 1" >>confdefs.h printf "%s\n" "#define __STDC_WANT_LIB_EXT2__ 1" >>confdefs.h printf "%s\n" "#define __STDC_WANT_MATH_SPEC_FUNCS__ 1" >>confdefs.h printf "%s\n" "#define _TANDEM_SOURCE 1" >>confdefs.h if test $ac_cv_header_minix_config_h = yes then : MINIX=yes printf "%s\n" "#define _MINIX 1" >>confdefs.h printf "%s\n" "#define _POSIX_SOURCE 1" >>confdefs.h printf "%s\n" "#define _POSIX_1_SOURCE 2" >>confdefs.h else case e in #( e) MINIX= ;; esac fi if test $ac_cv_safe_to_define___extensions__ = yes then : printf "%s\n" "#define __EXTENSIONS__ 1" >>confdefs.h fi if test $ac_cv_should_define__xopen_source = yes then : printf "%s\n" "#define _XOPEN_SOURCE 500" >>confdefs.h fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. set dummy ${ac_tool_prefix}gcc; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_CC+y} then : printf %s "(cached) " >&6 else case e in #( e) if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}gcc" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi ;; esac fi CC=$ac_cv_prog_CC if test -n "$CC"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 printf "%s\n" "$CC" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi fi if test -z "$ac_cv_prog_CC"; then ac_ct_CC=$CC # Extract the first word of "gcc", so it can be a program name with args. set dummy gcc; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_ac_ct_CC+y} then : printf %s "(cached) " >&6 else case e in #( e) if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="gcc" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi ;; esac fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 printf "%s\n" "$ac_ct_CC" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi else CC="$ac_cv_prog_CC" fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. set dummy ${ac_tool_prefix}cc; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_CC+y} then : printf %s "(cached) " >&6 else case e in #( e) if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}cc" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi ;; esac fi CC=$ac_cv_prog_CC if test -n "$CC"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 printf "%s\n" "$CC" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi fi fi if test -z "$CC"; then # Extract the first word of "cc", so it can be a program name with args. set dummy cc; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_CC+y} then : printf %s "(cached) " >&6 else case e in #( e) if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else ac_prog_rejected=no as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then if test "$as_dir$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then ac_prog_rejected=yes continue fi ac_cv_prog_CC="cc" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS if test $ac_prog_rejected = yes; then # We found a bogon in the path, so make sure we never use it. set dummy $ac_cv_prog_CC shift if test $# != 0; then # We chose a different compiler from the bogus one. # However, it has the same basename, so the bogon will be chosen # first if we set CC to just the basename; use the full file name. shift ac_cv_prog_CC="$as_dir$ac_word${1+' '}$@" fi fi fi ;; esac fi CC=$ac_cv_prog_CC if test -n "$CC"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 printf "%s\n" "$CC" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then for ac_prog in cl.exe do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_CC+y} then : printf %s "(cached) " >&6 else case e in #( e) if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_CC="$ac_tool_prefix$ac_prog" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi ;; esac fi CC=$ac_cv_prog_CC if test -n "$CC"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 printf "%s\n" "$CC" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi test -n "$CC" && break done fi if test -z "$CC"; then ac_ct_CC=$CC for ac_prog in cl.exe do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_ac_ct_CC+y} then : printf %s "(cached) " >&6 else case e in #( e) if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="$ac_prog" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi ;; esac fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 printf "%s\n" "$ac_ct_CC" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi test -n "$ac_ct_CC" && break done if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi fi fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}clang", so it can be a program name with args. set dummy ${ac_tool_prefix}clang; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_CC+y} then : printf %s "(cached) " >&6 else case e in #( e) if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}clang" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi ;; esac fi CC=$ac_cv_prog_CC if test -n "$CC"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 printf "%s\n" "$CC" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi fi if test -z "$ac_cv_prog_CC"; then ac_ct_CC=$CC # Extract the first word of "clang", so it can be a program name with args. set dummy clang; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_ac_ct_CC+y} then : printf %s "(cached) " >&6 else case e in #( e) if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="clang" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi ;; esac fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 printf "%s\n" "$ac_ct_CC" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi else CC="$ac_cv_prog_CC" fi fi test -z "$CC" && { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in '$ac_pwd':" >&5 printf "%s\n" "$as_me: error: in '$ac_pwd':" >&2;} as_fn_error $? "no acceptable C compiler found in \$PATH See 'config.log' for more details" "$LINENO" 5; } # Provide some information about the compiler. printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5 set X $ac_compile ac_compiler=$2 for ac_option in --version -v -V -qversion -version; do { { ac_try="$ac_compiler $ac_option >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" printf "%s\n" "$ac_try_echo"; } >&5 (eval "$ac_compiler $ac_option >&5") 2>conftest.err ac_status=$? if test -s conftest.err; then sed '10a\ ... rest of stderr output deleted ... 10q' conftest.err >conftest.er1 cat conftest.er1 >&5 fi rm -f conftest.er1 conftest.err printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } done { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the compiler supports GNU C" >&5 printf %s "checking whether the compiler supports GNU C... " >&6; } if test ${ac_cv_c_compiler_gnu+y} then : printf %s "(cached) " >&6 else case e in #( e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main (void) { #ifndef __GNUC__ choke me #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : ac_compiler_gnu=yes else case e in #( e) ac_compiler_gnu=no ;; esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ac_cv_c_compiler_gnu=$ac_compiler_gnu ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5 printf "%s\n" "$ac_cv_c_compiler_gnu" >&6; } ac_compiler_gnu=$ac_cv_c_compiler_gnu if test $ac_compiler_gnu = yes; then GCC=yes else GCC= fi ac_test_CFLAGS=${CFLAGS+y} ac_save_CFLAGS=$CFLAGS { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5 printf %s "checking whether $CC accepts -g... " >&6; } if test ${ac_cv_prog_cc_g+y} then : printf %s "(cached) " >&6 else case e in #( e) ac_save_c_werror_flag=$ac_c_werror_flag ac_c_werror_flag=yes ac_cv_prog_cc_g=no CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main (void) { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : ac_cv_prog_cc_g=yes else case e in #( e) CFLAGS="" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main (void) { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : else case e in #( e) ac_c_werror_flag=$ac_save_c_werror_flag CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main (void) { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : ac_cv_prog_cc_g=yes fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ;; esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ;; esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ac_c_werror_flag=$ac_save_c_werror_flag ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5 printf "%s\n" "$ac_cv_prog_cc_g" >&6; } if test $ac_test_CFLAGS; then CFLAGS=$ac_save_CFLAGS elif test $ac_cv_prog_cc_g = yes; then if test "$GCC" = yes; then CFLAGS="-g -O2" else CFLAGS="-g" fi else if test "$GCC" = yes; then CFLAGS="-O2" else CFLAGS= fi fi ac_prog_cc_stdc=no if test x$ac_prog_cc_stdc = xno then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $CC option to enable C11 features" >&5 printf %s "checking for $CC option to enable C11 features... " >&6; } if test ${ac_cv_prog_cc_c11+y} then : printf %s "(cached) " >&6 else case e in #( e) ac_cv_prog_cc_c11=no ac_save_CC=$CC cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_c_conftest_c11_program _ACEOF for ac_arg in '' -std=gnu11 do CC="$ac_save_CC $ac_arg" if ac_fn_c_try_compile "$LINENO" then : ac_cv_prog_cc_c11=$ac_arg fi rm -f core conftest.err conftest.$ac_objext conftest.beam test "x$ac_cv_prog_cc_c11" != "xno" && break done rm -f conftest.$ac_ext CC=$ac_save_CC ;; esac fi if test "x$ac_cv_prog_cc_c11" = xno then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 printf "%s\n" "unsupported" >&6; } else case e in #( e) if test "x$ac_cv_prog_cc_c11" = x then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 printf "%s\n" "none needed" >&6; } else case e in #( e) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c11" >&5 printf "%s\n" "$ac_cv_prog_cc_c11" >&6; } CC="$CC $ac_cv_prog_cc_c11" ;; esac fi ac_cv_prog_cc_stdc=$ac_cv_prog_cc_c11 ac_prog_cc_stdc=c11 ;; esac fi fi if test x$ac_prog_cc_stdc = xno then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $CC option to enable C99 features" >&5 printf %s "checking for $CC option to enable C99 features... " >&6; } if test ${ac_cv_prog_cc_c99+y} then : printf %s "(cached) " >&6 else case e in #( e) ac_cv_prog_cc_c99=no ac_save_CC=$CC cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_c_conftest_c99_program _ACEOF for ac_arg in '' -std=gnu99 -std=c99 -c99 -qlanglvl=extc1x -qlanglvl=extc99 -AC99 -D_STDC_C99= do CC="$ac_save_CC $ac_arg" if ac_fn_c_try_compile "$LINENO" then : ac_cv_prog_cc_c99=$ac_arg fi rm -f core conftest.err conftest.$ac_objext conftest.beam test "x$ac_cv_prog_cc_c99" != "xno" && break done rm -f conftest.$ac_ext CC=$ac_save_CC ;; esac fi if test "x$ac_cv_prog_cc_c99" = xno then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 printf "%s\n" "unsupported" >&6; } else case e in #( e) if test "x$ac_cv_prog_cc_c99" = x then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 printf "%s\n" "none needed" >&6; } else case e in #( e) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c99" >&5 printf "%s\n" "$ac_cv_prog_cc_c99" >&6; } CC="$CC $ac_cv_prog_cc_c99" ;; esac fi ac_cv_prog_cc_stdc=$ac_cv_prog_cc_c99 ac_prog_cc_stdc=c99 ;; esac fi fi if test x$ac_prog_cc_stdc = xno then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $CC option to enable C89 features" >&5 printf %s "checking for $CC option to enable C89 features... " >&6; } if test ${ac_cv_prog_cc_c89+y} then : printf %s "(cached) " >&6 else case e in #( e) ac_cv_prog_cc_c89=no ac_save_CC=$CC cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_c_conftest_c89_program _ACEOF for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" do CC="$ac_save_CC $ac_arg" if ac_fn_c_try_compile "$LINENO" then : ac_cv_prog_cc_c89=$ac_arg fi rm -f core conftest.err conftest.$ac_objext conftest.beam test "x$ac_cv_prog_cc_c89" != "xno" && break done rm -f conftest.$ac_ext CC=$ac_save_CC ;; esac fi if test "x$ac_cv_prog_cc_c89" = xno then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 printf "%s\n" "unsupported" >&6; } else case e in #( e) if test "x$ac_cv_prog_cc_c89" = x then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 printf "%s\n" "none needed" >&6; } else case e in #( e) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 printf "%s\n" "$ac_cv_prog_cc_c89" >&6; } CC="$CC $ac_cv_prog_cc_c89" ;; esac fi ac_cv_prog_cc_stdc=$ac_cv_prog_cc_c89 ac_prog_cc_stdc=c89 ;; esac fi fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu for ac_prog in gawk mawk nawk awk do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_AWK+y} then : printf %s "(cached) " >&6 else case e in #( e) if test -n "$AWK"; then ac_cv_prog_AWK="$AWK" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_AWK="$ac_prog" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi ;; esac fi AWK=$ac_cv_prog_AWK if test -n "$AWK"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $AWK" >&5 printf "%s\n" "$AWK" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi test -n "$AWK" && break done # Find a good install program. We prefer a C program (faster), # so one script is as good as another. But avoid the broken or # incompatible versions: # SysV /etc/install, /usr/sbin/install # SunOS /usr/etc/install # IRIX /sbin/install # AIX /bin/install # AmigaOS /C/install, which installs bootblocks on floppy discs # AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag # AFS /usr/afsws/bin/install, which mishandles nonexistent args # SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" # OS/2's system install, which has a completely different semantic # ./install, which can be erroneously created by make from ./install.sh. # Reject install programs that cannot install multiple files. { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for a BSD-compatible install" >&5 printf %s "checking for a BSD-compatible install... " >&6; } if test -z "$INSTALL"; then if test ${ac_cv_path_install+y} then : printf %s "(cached) " >&6 else case e in #( e) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac # Account for fact that we put trailing slashes in our PATH walk. case $as_dir in #(( ./ | /[cC]/* | \ /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \ ?:[\\/]os2[\\/]install[\\/]* | ?:[\\/]OS2[\\/]INSTALL[\\/]* | \ /usr/ucb/* ) ;; *) # OSF1 and SCO ODT 3.0 have their own names for install. # Don't use installbsd from OSF since it installs stuff as root # by default. for ac_prog in ginstall scoinst install; do for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_prog$ac_exec_ext"; then if test $ac_prog = install && grep dspmsg "$as_dir$ac_prog$ac_exec_ext" >/dev/null 2>&1; then # AIX install. It has an incompatible calling convention. : elif test $ac_prog = install && grep pwplus "$as_dir$ac_prog$ac_exec_ext" >/dev/null 2>&1; then # program-specific install script used by HP pwplus--don't use. : else rm -rf conftest.one conftest.two conftest.dir echo one > conftest.one echo two > conftest.two mkdir conftest.dir if "$as_dir$ac_prog$ac_exec_ext" -c conftest.one conftest.two "`pwd`/conftest.dir/" && test -s conftest.one && test -s conftest.two && test -s conftest.dir/conftest.one && test -s conftest.dir/conftest.two then ac_cv_path_install="$as_dir$ac_prog$ac_exec_ext -c" break 3 fi fi fi done done ;; esac done IFS=$as_save_IFS rm -rf conftest.one conftest.two conftest.dir ;; esac fi if test ${ac_cv_path_install+y}; then INSTALL=$ac_cv_path_install else # As a last resort, use the slow shell script. Don't cache a # value for INSTALL within a source directory, because that will # break other packages using the cache if that directory is # removed, or if the value is a relative name. INSTALL=$ac_install_sh fi fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $INSTALL" >&5 printf "%s\n" "$INSTALL" >&6; } # Use test -z because SunOS4 sh mishandles braces in ${var-val}. # It thinks the first close brace ends the variable substitution. test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}' test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}' test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' ac_fn_c_check_func "$LINENO" "execvpe" "ac_cv_func_execvpe" if test "x$ac_cv_func_execvpe" = xyes then : printf "%s\n" "#define HAVE_EXECVPE 1" >>confdefs.h fi ac_fn_c_check_func "$LINENO" "seteuid" "ac_cv_func_seteuid" if test "x$ac_cv_func_seteuid" = xyes then : printf "%s\n" "#define HAVE_SETEUID 1" >>confdefs.h fi ac_fn_c_check_func "$LINENO" "setegid" "ac_cv_func_setegid" if test "x$ac_cv_func_setegid" = xyes then : printf "%s\n" "#define HAVE_SETEGID 1" >>confdefs.h fi ac_fn_c_check_func "$LINENO" "setreuid" "ac_cv_func_setreuid" if test "x$ac_cv_func_setreuid" = xyes then : printf "%s\n" "#define HAVE_SETREUID 1" >>confdefs.h fi ac_fn_c_check_func "$LINENO" "setresuid" "ac_cv_func_setresuid" if test "x$ac_cv_func_setresuid" = xyes then : printf "%s\n" "#define HAVE_SETRESUID 1" >>confdefs.h fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for library containing tgetent" >&5 printf %s "checking for library containing tgetent... " >&6; } if test ${ac_cv_search_tgetent+y} then : printf %s "(cached) " >&6 else case e in #( e) ac_func_search_save_LIBS=$LIBS cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. The 'extern "C"' is for builds by C++ compilers; although this is not generally supported in C code supporting it here has little cost and some practical benefit (sr 110532). */ #ifdef __cplusplus extern "C" #endif char tgetent (void); int main (void) { return tgetent (); ; return 0; } _ACEOF for ac_lib in '' curses termcap termlib ncursesw tinfow ncurses tinfo do if test -z "$ac_lib"; then ac_res="none required" else ac_res=-l$ac_lib LIBS="-l$ac_lib $ac_func_search_save_LIBS" fi if ac_fn_c_try_link "$LINENO" then : ac_cv_search_tgetent=$ac_res fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext if test ${ac_cv_search_tgetent+y} then : break fi done if test ${ac_cv_search_tgetent+y} then : else case e in #( e) ac_cv_search_tgetent=no ;; esac fi rm conftest.$ac_ext LIBS=$ac_func_search_save_LIBS ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_tgetent" >&5 printf "%s\n" "$ac_cv_search_tgetent" >&6; } ac_res=$ac_cv_search_tgetent if test "$ac_res" != no then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" else case e in #( e) as_fn_error $? "unable to find tgetent() function" "$LINENO" 5 ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for library containing crypt" >&5 printf %s "checking for library containing crypt... " >&6; } if test ${ac_cv_search_crypt+y} then : printf %s "(cached) " >&6 else case e in #( e) ac_func_search_save_LIBS=$LIBS cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. The 'extern "C"' is for builds by C++ compilers; although this is not generally supported in C code supporting it here has little cost and some practical benefit (sr 110532). */ #ifdef __cplusplus extern "C" #endif char crypt (void); int main (void) { return crypt (); ; return 0; } _ACEOF for ac_lib in '' crypt do if test -z "$ac_lib"; then ac_res="none required" else ac_res=-l$ac_lib LIBS="-l$ac_lib $ac_func_search_save_LIBS" fi if ac_fn_c_try_link "$LINENO" then : ac_cv_search_crypt=$ac_res fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext if test ${ac_cv_search_crypt+y} then : break fi done if test ${ac_cv_search_crypt+y} then : else case e in #( e) ac_cv_search_crypt=no ;; esac fi rm conftest.$ac_ext LIBS=$ac_func_search_save_LIBS ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_crypt" >&5 printf "%s\n" "$ac_cv_search_crypt" >&6; } ac_res=$ac_cv_search_crypt if test "$ac_res" != no then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" else case e in #( e) as_fn_error $? "unable to find crypt() function" "$LINENO" 5 ;; esac fi ac_fn_c_check_header_compile "$LINENO" "pty.h" "ac_cv_header_pty_h" "$ac_includes_default" if test "x$ac_cv_header_pty_h" = xyes then : printf "%s\n" "#define HAVE_PTY_H 1" >>confdefs.h fi ac_fn_c_check_header_compile "$LINENO" "util.h" "ac_cv_header_util_h" "$ac_includes_default" if test "x$ac_cv_header_util_h" = xyes then : printf "%s\n" "#define HAVE_UTIL_H 1" >>confdefs.h fi ac_fn_c_check_header_compile "$LINENO" "libutil.h" "ac_cv_header_libutil_h" "$ac_includes_default" if test "x$ac_cv_header_libutil_h" = xyes then : printf "%s\n" "#define HAVE_LIBUTIL_H 1" >>confdefs.h fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for library containing openpty" >&5 printf %s "checking for library containing openpty... " >&6; } if test ${ac_cv_search_openpty+y} then : printf %s "(cached) " >&6 else case e in #( e) ac_func_search_save_LIBS=$LIBS cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. The 'extern "C"' is for builds by C++ compilers; although this is not generally supported in C code supporting it here has little cost and some practical benefit (sr 110532). */ #ifdef __cplusplus extern "C" #endif char openpty (void); int main (void) { return openpty (); ; return 0; } _ACEOF for ac_lib in '' util openpty bsd do if test -z "$ac_lib"; then ac_res="none required" else ac_res=-l$ac_lib LIBS="-l$ac_lib $ac_func_search_save_LIBS" fi if ac_fn_c_try_link "$LINENO" then : ac_cv_search_openpty=$ac_res fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext if test ${ac_cv_search_openpty+y} then : break fi done if test ${ac_cv_search_openpty+y} then : else case e in #( e) ac_cv_search_openpty=no ;; esac fi rm conftest.$ac_ext LIBS=$ac_func_search_save_LIBS ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_openpty" >&5 printf "%s\n" "$ac_cv_search_openpty" >&6; } ac_res=$ac_cv_search_openpty if test "$ac_res" != no then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" printf "%s\n" "#define HAVE_OPENPTY 1" >>confdefs.h else case e in #( e) as_fn_error $? "unable to find openpty() function" "$LINENO" 5 ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for library containing socket" >&5 printf %s "checking for library containing socket... " >&6; } if test ${ac_cv_search_socket+y} then : printf %s "(cached) " >&6 else case e in #( e) ac_func_search_save_LIBS=$LIBS cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. The 'extern "C"' is for builds by C++ compilers; although this is not generally supported in C code supporting it here has little cost and some practical benefit (sr 110532). */ #ifdef __cplusplus extern "C" #endif char socket (void); int main (void) { return socket (); ; return 0; } _ACEOF for ac_lib in '' network do if test -z "$ac_lib"; then ac_res="none required" else ac_res=-l$ac_lib LIBS="-l$ac_lib $ac_func_search_save_LIBS" fi if ac_fn_c_try_link "$LINENO" then : ac_cv_search_socket=$ac_res fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext if test ${ac_cv_search_socket+y} then : break fi done if test ${ac_cv_search_socket+y} then : else case e in #( e) ac_cv_search_socket=no ;; esac fi rm conftest.$ac_ext LIBS=$ac_func_search_save_LIBS ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_socket" >&5 printf "%s\n" "$ac_cv_search_socket" >&6; } ac_res=$ac_cv_search_socket if test "$ac_res" != no then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" else case e in #( e) as_fn_error $? "unable to find socket() function" "$LINENO" 5 ;; esac fi ac_fn_c_check_header_compile "$LINENO" "langinfo.h" "ac_cv_header_langinfo_h" "$ac_includes_default" if test "x$ac_cv_header_langinfo_h" = xyes then : printf "%s\n" "#define HAVE_LANGINFO_H 1" >>confdefs.h fi ac_fn_c_check_header_compile "$LINENO" "dirent.h" "ac_cv_header_dirent_h" "$ac_includes_default" if test "x$ac_cv_header_dirent_h" = xyes then : printf "%s\n" "#define HAVE_DIRENT_H 1" >>confdefs.h fi # Check whether --enable-pam was given. if test ${enable_pam+y} then : enableval=$enable_pam; enable_pam=$enableval else case e in #( e) enable_pam=yes ;; esac fi # Check whether --enable-utmp was given. if test ${enable_utmp+y} then : enableval=$enable_utmp; enable_utmp=$enableval else case e in #( e) enable_utmp=no ;; esac fi # Check whether --enable-telnet was given. if test ${enable_telnet+y} then : enableval=$enable_telnet; enable_telnet=$enableval else case e in #( e) enable_telnet=no ;; esac fi # Check whether --enable-socket-dir was given. if test ${enable_socket_dir+y} then : enableval=$enable_socket_dir; enable_socket_dir=$enableval else case e in #( e) enable_socket_dir=no ;; esac fi # Check whether --with-system_screenrc was given. if test ${with_system_screenrc+y} then : withval=$with_system_screenrc; with_system_screenrc=$withval else case e in #( e) with_system_screenrc=/etc/screenrc ;; esac fi # Check whether --with-pty-mode was given. if test ${with_pty_mode+y} then : withval=$with_pty_mode; with_pty_mode=$withval else case e in #( e) with_pty_mode=0620 ;; esac fi # Check whether --with-pty-group was given. if test ${with_pty_group+y} then : withval=$with_pty_group; with_pty_group=$withval else case e in #( e) with_pty_group=5 ;; esac fi # Check whether --with-pty-rofs was given. if test ${with_pty_rofs+y} then : withval=$with_pty_rofs; with_pty_rofs=$withval else case e in #( e) with_pty_rofs=no ;; esac fi if test "x$enable_pam" = "xyes" then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for PAM support" >&5 printf %s "checking for PAM support... " >&6; } oldlibs="$LIBS" LIBS="$LIBS -lpam" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main (void) { pam_start(0, 0, 0, 0); pam_authenticate(0, 0); pam_end(0,0); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO" then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 printf "%s\n" "yes" >&6; }; printf "%s\n" "#define ENABLE_PAM 1" >>confdefs.h else case e in #( e) as_fn_error $? "no" "$LINENO" 5;LIBS="$oldlibs" ;; esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext fi if test "x$enable_utmp" = "xyes" then : for ac_header in utmpx.h do : ac_fn_c_check_header_compile "$LINENO" "utmpx.h" "ac_cv_header_utmpx_h" "$ac_includes_default" if test "x$ac_cv_header_utmpx_h" = xyes then : printf "%s\n" "#define HAVE_UTMPX_H 1" >>confdefs.h have_utmpx=yes else case e in #( e) have_utmpx=no ;; esac fi done if test "x$have_utmpx" != "xyes" then : as_fn_error $? "Missing utmpx.h" "$LINENO" 5 fi ac_fn_c_check_header_compile "$LINENO" "utempter.h" "ac_cv_header_utempter_h" "$ac_includes_default" if test "x$ac_cv_header_utempter_h" = xyes then : have_utempter=yes else case e in #( e) have_utempter=no ;; esac fi if test "x$have_utempter" = "xyes" then : printf "%s\n" "#define HAVE_UTEMPTER 1" >>confdefs.h LIBS="$LIBS -lutempter" fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if utmpx struct has ut_host field" >&5 printf %s "checking if utmpx struct has ut_host field... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main (void) { struct utmpx u; u.ut_host[0] = 0; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 printf "%s\n" "yes" >&6; } printf "%s\n" "#define HAVE_UT_HOST 1" >>confdefs.h else case e in #( e) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } ;; esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if utmpx struct has ut_exit field" >&5 printf %s "checking if utmpx struct has ut_exit field... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main (void) { struct utmpx u; u.ut_exit.e_exit; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 printf "%s\n" "yes" >&6; } printf "%s\n" "#define HAVE_UT_EXIT 1" >>confdefs.h else case e in #( e) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } ;; esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext printf "%s\n" "#define ENABLE_UTMP 1" >>confdefs.h fi if test "x$enable_telnet" = "xyes" then : printf "%s\n" "#define ENABLE_TELNET 1" >>confdefs.h fi if test "x$enable_socket_dir" != "xno" then : if test "x$enable_socket_dir" = "xyes" then : enable_socket_dir="/run/screen" fi printf "%s\n" "#define SOCKET_DIR \"$enable_socket_dir\"" >>confdefs.h fi printf "%s\n" "#define SYSTEM_SCREENRC \"$with_system_screenrc\"" >>confdefs.h printf "%s\n" "#define PTY_MODE $with_pty_mode" >>confdefs.h printf "%s\n" "#define PTY_GROUP $with_pty_group" >>confdefs.h if test "x$with_pty_rofs" = "xyes" then : printf "%s\n" "#define PTY_ROFS 1" >>confdefs.h fi ac_config_files="$ac_config_files Makefile doc/Makefile" cat >confcache <<\_ACEOF # This file is a shell script that caches the results of configure # tests run on this system so they can be shared between configure # scripts and configure runs, see configure's option --config-cache. # It is not useful on other systems. If it contains results you don't # want to keep, you may remove or edit it. # # config.status only pays attention to the cache file if you give it # the --recheck option to rerun configure. # # 'ac_cv_env_foo' variables (set or unset) will be overridden when # loading this file, other *unset* 'ac_cv_foo' will be assigned the # following values. _ACEOF # The following way of writing the cache mishandles newlines in values, # but we know of no workaround that is simple, portable, and efficient. # So, we kill variables containing newlines. # Ultrix sh set writes to stderr and can't be redirected directly, # and sets the high bit in the cache file unless we assign to the vars. ( for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 printf "%s\n" "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space=' '; set) 2>&1` in #( *${as_nl}ac_space=\ *) # 'set' does not quote correctly, so add quotes: double-quote # substitution turns \\\\ into \\, and sed turns \\ into \. sed -n \ "s/'/'\\\\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" ;; #( *) # 'set' quotes correctly as required by POSIX, so do not add quotes. sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) | sed ' /^ac_cv_env_/b end t clear :clear s/^\([^=]*\)=\(.*[{}].*\)$/test ${\1+y} || &/ t end s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ :end' >>confcache if diff "$cache_file" confcache >/dev/null 2>&1; then :; else if test -w "$cache_file"; then if test "x$cache_file" != "x/dev/null"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5 printf "%s\n" "$as_me: updating cache $cache_file" >&6;} if test ! -f "$cache_file" || test -h "$cache_file"; then cat confcache >"$cache_file" else case $cache_file in #( */* | ?:*) mv -f confcache "$cache_file"$$ && mv -f "$cache_file"$$ "$cache_file" ;; #( *) mv -f confcache "$cache_file" ;; esac fi fi else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5 printf "%s\n" "$as_me: not updating unwritable cache $cache_file" >&6;} fi fi rm -f confcache test "x$prefix" = xNONE && prefix=$ac_default_prefix # Let make expand exec_prefix. test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' DEFS=-DHAVE_CONFIG_H ac_libobjs= ac_ltlibobjs= U= for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue # 1. Remove the extension, and $U if already installed. ac_script='s/\$U\././;s/\.o$//;s/\.obj$//' ac_i=`printf "%s\n" "$ac_i" | sed "$ac_script"` # 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR # will be set to the directory where LIBOBJS objects are built. as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext" as_fn_append ac_ltlibobjs " \${LIBOBJDIR}$ac_i"'$U.lo' done LIBOBJS=$ac_libobjs LTLIBOBJS=$ac_ltlibobjs : "${CONFIG_STATUS=./config.status}" ac_write_fail=0 ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files $CONFIG_STATUS" { printf "%s\n" "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5 printf "%s\n" "$as_me: creating $CONFIG_STATUS" >&6;} as_write_fail=0 cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1 #! $SHELL # Generated by $as_me. # Run this file to recreate the current configuration. # Compiler output produced by configure, useful for debugging # configure, is in config.log if it exists. debug=false ac_cs_recheck=false ac_cs_silent=false SHELL=\${CONFIG_SHELL-$SHELL} export SHELL _ASEOF cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1 ## -------------------- ## ## M4sh Initialization. ## ## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test ${ZSH_VERSION+y} && (emulate sh) >/dev/null 2>&1 then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case e in #( e) case `(set -o) 2>/dev/null` in #( *posix*) : set -o posix ;; #( *) : ;; esac ;; esac fi # Reset variables that may have inherited troublesome values from # the environment. # IFS needs to be set, to space, tab, and newline, in precisely that order. # (If _AS_PATH_WALK were called with IFS unset, it would have the # side effect of setting IFS to empty, thus disabling word splitting.) # Quoting is to prevent editors from complaining about space-tab. as_nl=' ' export as_nl IFS=" "" $as_nl" PS1='$ ' PS2='> ' PS4='+ ' # Ensure predictable behavior from utilities with locale-dependent output. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # We cannot yet rely on "unset" to work, but we need these variables # to be unset--not just set to an empty or harmless value--now, to # avoid bugs in old shells (e.g. pre-3.0 UWIN ksh). This construct # also avoids known problems related to "unset" and subshell syntax # in other old shells (e.g. bash 2.01 and pdksh 5.2.14). for as_var in BASH_ENV ENV MAIL MAILPATH CDPATH do eval test \${$as_var+y} \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done # Ensure that fds 0, 1, and 2 are open. if (exec 3>&0) 2>/dev/null; then :; else exec 0&1) 2>/dev/null; then :; else exec 1>/dev/null; fi if (exec 3>&2) ; then :; else exec 2>/dev/null; fi # The user is always right. if ${PATH_SEPARATOR+false} :; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # Find who we are. Look in the path if we contain no directory separator. as_myself= case $0 in #(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac test -r "$as_dir$0" && as_myself=$as_dir$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as 'sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then printf "%s\n" "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # as_fn_error STATUS ERROR [LINENO LOG_FD] # ---------------------------------------- # Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are # provided, also output the error to LOG_FD, referencing LINENO. Then exit the # script with STATUS, using 1 if that was 0. as_fn_error () { as_status=$1; test $as_status -eq 0 && as_status=1 if test "$4"; then as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi printf "%s\n" "$as_me: error: $2" >&2 as_fn_exit $as_status } # as_fn_error # as_fn_set_status STATUS # ----------------------- # Set $? to STATUS, without forking. as_fn_set_status () { return $1 } # as_fn_set_status # as_fn_exit STATUS # ----------------- # Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } # as_fn_exit # as_fn_unset VAR # --------------- # Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset # as_fn_append VAR VALUE # ---------------------- # Append the text in VALUE to the end of the definition contained in VAR. Take # advantage of any shell optimizations that allow amortized linear growth over # repeated appends, instead of the typical quadratic growth present in naive # implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null then : eval 'as_fn_append () { eval $1+=\$2 }' else case e in #( e) as_fn_append () { eval $1=\$$1\$2 } ;; esac fi # as_fn_append # as_fn_arith ARG... # ------------------ # Perform arithmetic evaluation on the ARGs, and store the result in the # global $as_val. Take advantage of shells that can avoid forks. The arguments # must be portable across $(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null then : eval 'as_fn_arith () { as_val=$(( $* )) }' else case e in #( e) as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } ;; esac fi # as_fn_arith if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || printf "%s\n" X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits # Determine whether it's possible to make 'echo' print without a newline. # These variables are no longer used directly by Autoconf, but are AC_SUBSTed # for compatibility with existing Makefiles. ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in #((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac # For backward compatibility with old third-party macros, we provide # the shell variables $as_echo and $as_echo_n. New code should use # AS_ECHO(["message"]) and AS_ECHO_N(["message"]), respectively. as_echo='printf %s\n' as_echo_n='printf %s' rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both 'ln -s file dir' and 'ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; 'ln -s' creates a wrapper executable. # In both cases, we have to default to 'cp -pR'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -pR' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -pR' fi else as_ln_s='cp -pR' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null # as_fn_mkdir_p # ------------- # Create "$as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`printf "%s\n" "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || printf "%s\n" X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" } # as_fn_mkdir_p if mkdir -p . 2>/dev/null; then as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi # as_fn_executable_p FILE # ----------------------- # Test if FILE is an executable regular file. as_fn_executable_p () { test -f "$1" && test -x "$1" } # as_fn_executable_p as_test_x='test -x' as_executable_p=as_fn_executable_p # Sed expression to map a string onto a valid CPP name. as_sed_cpp="y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g" as_tr_cpp="eval sed '$as_sed_cpp'" # deprecated # Sed expression to map a string onto a valid variable name. as_sed_sh="y%*+%pp%;s%[^_$as_cr_alnum]%_%g" as_tr_sh="eval sed '$as_sed_sh'" # deprecated exec 6>&1 ## ----------------------------------- ## ## Main body of $CONFIG_STATUS script. ## ## ----------------------------------- ## _ASEOF test $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1 cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # Save the log message, to keep $0 and so on meaningful, and to # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log=" This file was extended by GNU Screen $as_me 5.0.2, which was generated by GNU Autoconf 2.72. Invocation command line was CONFIG_FILES = $CONFIG_FILES CONFIG_HEADERS = $CONFIG_HEADERS CONFIG_LINKS = $CONFIG_LINKS CONFIG_COMMANDS = $CONFIG_COMMANDS $ $0 $@ on `(hostname || uname -n) 2>/dev/null | sed 1q` " _ACEOF case $ac_config_files in *" "*) set x $ac_config_files; shift; ac_config_files=$*;; esac case $ac_config_headers in *" "*) set x $ac_config_headers; shift; ac_config_headers=$*;; esac cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 # Files that config.status was made for. config_files="$ac_config_files" config_headers="$ac_config_headers" _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 ac_cs_usage="\ '$as_me' instantiates files and other configuration actions from templates according to the current configuration. Unless the files and actions are specified as TAGs, all are instantiated by default. Usage: $0 [OPTION]... [TAG]... -h, --help print this help, then exit -V, --version print version number and configuration settings, then exit --config print configuration, then exit -q, --quiet, --silent do not print progress messages -d, --debug don't remove temporary files --recheck update $as_me by reconfiguring in the same conditions --file=FILE[:TEMPLATE] instantiate the configuration file FILE --header=FILE[:TEMPLATE] instantiate the configuration header FILE Configuration files: $config_files Configuration headers: $config_headers Report bugs to . GNU Screen home page: . General help using GNU software: ." _ACEOF ac_cs_config=`printf "%s\n" "$ac_configure_args" | sed "$ac_safe_unquote"` ac_cs_config_escaped=`printf "%s\n" "$ac_cs_config" | sed "s/^ //; s/'/'\\\\\\\\''/g"` cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_cs_config='$ac_cs_config_escaped' ac_cs_version="\\ GNU Screen config.status 5.0.2 configured by $0, generated by GNU Autoconf 2.72, with options \\"\$ac_cs_config\\" Copyright (C) 2023 Free Software Foundation, Inc. This config.status script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it." ac_pwd='$ac_pwd' srcdir='$srcdir' INSTALL='$INSTALL' AWK='$AWK' test -n "\$AWK" || AWK=awk _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # The default lists apply if the user does not specify any file. ac_need_defaults=: while test $# != 0 do case $1 in --*=?*) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'` ac_shift=: ;; --*=) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg= ac_shift=: ;; *) ac_option=$1 ac_optarg=$2 ac_shift=shift ;; esac case $ac_option in # Handling of the options. -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) ac_cs_recheck=: ;; --version | --versio | --versi | --vers | --ver | --ve | --v | -V ) printf "%s\n" "$ac_cs_version"; exit ;; --config | --confi | --conf | --con | --co | --c ) printf "%s\n" "$ac_cs_config"; exit ;; --debug | --debu | --deb | --de | --d | -d ) debug=: ;; --file | --fil | --fi | --f ) $ac_shift case $ac_optarg in *\'*) ac_optarg=`printf "%s\n" "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; '') as_fn_error $? "missing file argument" ;; esac as_fn_append CONFIG_FILES " '$ac_optarg'" ac_need_defaults=false;; --header | --heade | --head | --hea ) $ac_shift case $ac_optarg in *\'*) ac_optarg=`printf "%s\n" "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; esac as_fn_append CONFIG_HEADERS " '$ac_optarg'" ac_need_defaults=false;; --he | --h) # Conflict between --help and --header as_fn_error $? "ambiguous option: '$1' Try '$0 --help' for more information.";; --help | --hel | -h ) printf "%s\n" "$ac_cs_usage"; exit ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil | --si | --s) ac_cs_silent=: ;; # This is an error. -*) as_fn_error $? "unrecognized option: '$1' Try '$0 --help' for more information." ;; *) as_fn_append ac_config_targets " $1" ac_need_defaults=false ;; esac shift done ac_configure_extra_args= if $ac_cs_silent; then exec 6>/dev/null ac_configure_extra_args="$ac_configure_extra_args --silent" fi _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 if \$ac_cs_recheck; then set X $SHELL '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion shift \printf "%s\n" "running CONFIG_SHELL=$SHELL \$*" >&6 CONFIG_SHELL='$SHELL' export CONFIG_SHELL exec "\$@" fi _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 exec 5>>config.log { echo sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX ## Running $as_me. ## _ASBOX printf "%s\n" "$ac_log" } >&5 _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # Handling of arguments. for ac_config_target in $ac_config_targets do case $ac_config_target in "config.h") CONFIG_HEADERS="$CONFIG_HEADERS config.h" ;; "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;; "doc/Makefile") CONFIG_FILES="$CONFIG_FILES doc/Makefile" ;; *) as_fn_error $? "invalid argument: '$ac_config_target'" "$LINENO" 5;; esac done # If the user did not use the arguments to specify the items to instantiate, # then the envvar interface is used. Set only those that are not. # We use the long form for the default assignment because of an extremely # bizarre bug on SunOS 4.1.3. if $ac_need_defaults; then test ${CONFIG_FILES+y} || CONFIG_FILES=$config_files test ${CONFIG_HEADERS+y} || CONFIG_HEADERS=$config_headers fi # Have a temporary directory for convenience. Make it in the build tree # simply because there is no reason against having it here, and in addition, # creating and moving files from /tmp can sometimes cause problems. # Hook for its removal unless debugging. # Note that there is a small window in which the directory will not be cleaned: # after its creation but before its name has been assigned to '$tmp'. $debug || { tmp= ac_tmp= trap 'exit_status=$? : "${ac_tmp:=$tmp}" { test ! -d "$ac_tmp" || rm -fr "$ac_tmp"; } && exit $exit_status ' 0 trap 'as_fn_exit 1' 1 2 13 15 } # Create a (secure) tmp directory for tmp files. { tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` && test -d "$tmp" } || { tmp=./conf$$-$RANDOM (umask 077 && mkdir "$tmp") } || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5 ac_tmp=$tmp # Set up the scripts for CONFIG_FILES section. # No need to generate them if there are no CONFIG_FILES. # This happens for instance with './config.status config.h'. if test -n "$CONFIG_FILES"; then ac_cr=`echo X | tr X '\015'` # On cygwin, bash can eat \r inside `` if the user requested igncr. # But we know of no other shell where ac_cr would be empty at this # point, so we can use a bashism as a fallback. if test "x$ac_cr" = x; then eval ac_cr=\$\'\\r\' fi ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' /dev/null` if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then ac_cs_awk_cr='\\r' else ac_cs_awk_cr=$ac_cr fi echo 'BEGIN {' >"$ac_tmp/subs1.awk" && _ACEOF { echo "cat >conf$$subs.awk <<_ACEOF" && echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' && echo "_ACEOF" } >conf$$subs.sh || as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_num=`echo "$ac_subst_vars" | grep -c '^'` ac_delim='%!_!# ' for ac_last_try in false false false false false :; do . ./conf$$subs.sh || as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X` if test $ac_delim_n = $ac_delim_num; then break elif $ac_last_try; then as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 else ac_delim="$ac_delim!$ac_delim _$ac_delim!! " fi done rm -f conf$$subs.sh cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 cat >>"\$ac_tmp/subs1.awk" <<\\_ACAWK && _ACEOF sed -n ' h s/^/S["/; s/!.*/"]=/ p g s/^[^!]*!// :repl t repl s/'"$ac_delim"'$// t delim :nl h s/\(.\{148\}\)..*/\1/ t more1 s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/ p n b repl :more1 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t nl :delim h s/\(.\{148\}\)..*/\1/ t more2 s/["\\]/\\&/g; s/^/"/; s/$/"/ p b :more2 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t delim ' >$CONFIG_STATUS || ac_write_fail=1 rm -f conf$$subs.awk cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 _ACAWK cat >>"\$ac_tmp/subs1.awk" <<_ACAWK && for (key in S) S_is_set[key] = 1 FS = "" } { line = $ 0 nfields = split(line, field, "@") substed = 0 len = length(field[1]) for (i = 2; i < nfields; i++) { key = field[i] keylen = length(key) if (S_is_set[key]) { value = S[key] line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3) len += length(value) + length(field[++i]) substed = 1 } else len += 1 + keylen } print line } _ACAWK _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g" else cat fi < "$ac_tmp/subs1.awk" > "$ac_tmp/subs.awk" \ || as_fn_error $? "could not setup config files machinery" "$LINENO" 5 _ACEOF # VPATH may cause trouble with some makes, so we remove sole $(srcdir), # ${srcdir} and @srcdir@ entries from VPATH if srcdir is ".", strip leading and # trailing colons and then remove the whole line if VPATH becomes empty # (actually we leave an empty line to preserve line numbers). if test "x$srcdir" = x.; then ac_vpsub='/^[ ]*VPATH[ ]*=[ ]*/{ h s/// s/^/:/ s/[ ]*$/:/ s/:\$(srcdir):/:/g s/:\${srcdir}:/:/g s/:@srcdir@:/:/g s/^:*// s/:*$// x s/\(=[ ]*\).*/\1/ G s/\n// s/^[^=]*=[ ]*$// }' fi cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 fi # test -n "$CONFIG_FILES" # Set up the scripts for CONFIG_HEADERS section. # No need to generate them if there are no CONFIG_HEADERS. # This happens for instance with './config.status Makefile'. if test -n "$CONFIG_HEADERS"; then cat >"$ac_tmp/defines.awk" <<\_ACAWK || BEGIN { _ACEOF # Transform confdefs.h into an awk script 'defines.awk', embedded as # here-document in config.status, that substitutes the proper values into # config.h.in to produce config.h. # Create a delimiter string that does not exist in confdefs.h, to ease # handling of long lines. ac_delim='%!_!# ' for ac_last_try in false false :; do ac_tt=`sed -n "/$ac_delim/p" confdefs.h` if test -z "$ac_tt"; then break elif $ac_last_try; then as_fn_error $? "could not make $CONFIG_HEADERS" "$LINENO" 5 else ac_delim="$ac_delim!$ac_delim _$ac_delim!! " fi done # For the awk script, D is an array of macro values keyed by name, # likewise P contains macro parameters if any. Preserve backslash # newline sequences. ac_word_re=[_$as_cr_Letters][_$as_cr_alnum]* sed -n ' s/.\{148\}/&'"$ac_delim"'/g t rset :rset s/^[ ]*#[ ]*define[ ][ ]*/ / t def d :def s/\\$// t bsnl s/["\\]/\\&/g s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ D["\1"]=" \3"/p s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2"/p d :bsnl s/["\\]/\\&/g s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ D["\1"]=" \3\\\\\\n"\\/p t cont s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2\\\\\\n"\\/p t cont d :cont n s/.\{148\}/&'"$ac_delim"'/g t clear :clear s/\\$// t bsnlc s/["\\]/\\&/g; s/^/"/; s/$/"/p d :bsnlc s/["\\]/\\&/g; s/^/"/; s/$/\\\\\\n"\\/p b cont ' >$CONFIG_STATUS || ac_write_fail=1 cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 for (key in D) D_is_set[key] = 1 FS = "" } /^[\t ]*#[\t ]*(define|undef)[\t ]+$ac_word_re([\t (]|\$)/ { line = \$ 0 split(line, arg, " ") if (arg[1] == "#") { defundef = arg[2] mac1 = arg[3] } else { defundef = substr(arg[1], 2) mac1 = arg[2] } split(mac1, mac2, "(") #) macro = mac2[1] prefix = substr(line, 1, index(line, defundef) - 1) if (D_is_set[macro]) { # Preserve the white space surrounding the "#". print prefix "define", macro P[macro] D[macro] next } else { # Replace #undef with comments. This is necessary, for example, # in the case of _POSIX_SOURCE, which is predefined and required # on some systems where configure will not decide to define it. if (defundef == "undef") { print "/*", prefix defundef, macro, "*/" next } } } { print } _ACAWK _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 as_fn_error $? "could not setup config headers machinery" "$LINENO" 5 fi # test -n "$CONFIG_HEADERS" eval set X " :F $CONFIG_FILES :H $CONFIG_HEADERS " shift for ac_tag do case $ac_tag in :[FHLC]) ac_mode=$ac_tag; continue;; esac case $ac_mode$ac_tag in :[FHL]*:*);; :L* | :C*:*) as_fn_error $? "invalid tag '$ac_tag'" "$LINENO" 5;; :[FH]-) ac_tag=-:-;; :[FH]*) ac_tag=$ac_tag:$ac_tag.in;; esac ac_save_IFS=$IFS IFS=: set x $ac_tag IFS=$ac_save_IFS shift ac_file=$1 shift case $ac_mode in :L) ac_source=$1;; :[FH]) ac_file_inputs= for ac_f do case $ac_f in -) ac_f="$ac_tmp/stdin";; *) # Look for the file first in the build tree, then in the source tree # (if the path is not absolute). The absolute path cannot be DOS-style, # because $ac_f cannot contain ':'. test -f "$ac_f" || case $ac_f in [\\/$]*) false;; *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";; esac || as_fn_error 1 "cannot find input file: '$ac_f'" "$LINENO" 5;; esac case $ac_f in *\'*) ac_f=`printf "%s\n" "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac as_fn_append ac_file_inputs " '$ac_f'" done # Let's still pretend it is 'configure' which instantiates (i.e., don't # use $as_me), people would be surprised to read: # /* config.h. Generated by config.status. */ configure_input='Generated from '` printf "%s\n" "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g' `' by configure.' if test x"$ac_file" != x-; then configure_input="$ac_file. $configure_input" { printf "%s\n" "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5 printf "%s\n" "$as_me: creating $ac_file" >&6;} fi # Neutralize special characters interpreted by sed in replacement strings. case $configure_input in #( *\&* | *\|* | *\\* ) ac_sed_conf_input=`printf "%s\n" "$configure_input" | sed 's/[\\\\&|]/\\\\&/g'`;; #( *) ac_sed_conf_input=$configure_input;; esac case $ac_tag in *:-:* | *:-) cat >"$ac_tmp/stdin" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; esac ;; esac ac_dir=`$as_dirname -- "$ac_file" || $as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$ac_file" : 'X\(//\)[^/]' \| \ X"$ac_file" : 'X\(//\)$' \| \ X"$ac_file" : 'X\(/\)' \| . 2>/dev/null || printf "%s\n" X"$ac_file" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` as_dir="$ac_dir"; as_fn_mkdir_p ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`printf "%s\n" "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`printf "%s\n" "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix case $ac_mode in :F) # # CONFIG_FILE # case $INSTALL in [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;; *) ac_INSTALL=$ac_top_build_prefix$INSTALL ;; esac _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # If the template does not know about datarootdir, expand it. # FIXME: This hack should be removed a few years after 2.60. ac_datarootdir_hack=; ac_datarootdir_seen= ac_sed_dataroot=' /datarootdir/ { p q } /@datadir@/p /@docdir@/p /@infodir@/p /@localedir@/p /@mandir@/p' case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in *datarootdir*) ac_datarootdir_seen=yes;; *@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 printf "%s\n" "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;} _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_datarootdir_hack=' s&@datadir@&$datadir&g s&@docdir@&$docdir&g s&@infodir@&$infodir&g s&@localedir@&$localedir&g s&@mandir@&$mandir&g s&\\\${datarootdir}&$datarootdir&g' ;; esac _ACEOF # Neutralize VPATH when '$srcdir' = '.'. # Shell code in configure.ac might set extrasub. # FIXME: do we really want to maintain this feature? cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_sed_extra="$ac_vpsub $extrasub _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 :t /@[a-zA-Z_][a-zA-Z_0-9]*@/!b s|@configure_input@|$ac_sed_conf_input|;t t s&@top_builddir@&$ac_top_builddir_sub&;t t s&@top_build_prefix@&$ac_top_build_prefix&;t t s&@srcdir@&$ac_srcdir&;t t s&@abs_srcdir@&$ac_abs_srcdir&;t t s&@top_srcdir@&$ac_top_srcdir&;t t s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t s&@builddir@&$ac_builddir&;t t s&@abs_builddir@&$ac_abs_builddir&;t t s&@abs_top_builddir@&$ac_abs_top_builddir&;t t s&@INSTALL@&$ac_INSTALL&;t t $ac_datarootdir_hack " eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$ac_tmp/subs.awk" \ >$ac_tmp/out || as_fn_error $? "could not create $ac_file" "$LINENO" 5 test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && { ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_out"; } && { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' \ "$ac_tmp/out"`; test -z "$ac_out"; } && { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable 'datarootdir' which seems to be undefined. Please make sure it is defined" >&5 printf "%s\n" "$as_me: WARNING: $ac_file contains a reference to the variable 'datarootdir' which seems to be undefined. Please make sure it is defined" >&2;} rm -f "$ac_tmp/stdin" case $ac_file in -) cat "$ac_tmp/out" && rm -f "$ac_tmp/out";; *) rm -f "$ac_file" && mv "$ac_tmp/out" "$ac_file";; esac \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; :H) # # CONFIG_HEADER # if test x"$ac_file" != x-; then { printf "%s\n" "/* $configure_input */" >&1 \ && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" } >"$ac_tmp/config.h" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 if diff "$ac_file" "$ac_tmp/config.h" >/dev/null 2>&1; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: $ac_file is unchanged" >&5 printf "%s\n" "$as_me: $ac_file is unchanged" >&6;} else rm -f "$ac_file" mv "$ac_tmp/config.h" "$ac_file" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 fi else printf "%s\n" "/* $configure_input */" >&1 \ && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" \ || as_fn_error $? "could not create -" "$LINENO" 5 fi ;; esac done # for ac_tag as_fn_exit 0 _ACEOF ac_clean_files=$ac_clean_files_save test $ac_write_fail = 0 || as_fn_error $? "write failure creating $CONFIG_STATUS" "$LINENO" 5 # configure is writing to config.log, and then calls config.status. # config.status does its own redirection, appending to config.log. # Unfortunately, on DOS this fails, as config.log is still kept open # by configure, so config.status won't be able to write to it; its # output is simply discarded. So we exec the FD to /dev/null, # effectively closing config.log, so it can be properly (re)opened and # appended to by config.status. When coming back to configure, we # need to make the FD available again. if test "$no_create" != yes; then ac_cs_success=: ac_config_status_args= test "$silent" = yes && ac_config_status_args="$ac_config_status_args --quiet" exec 5>/dev/null $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false exec 5>>config.log # Use ||, not &&, to avoid exiting from the if with $? = 1, which # would make configure fail if this is the last instruction. $ac_cs_success || as_fn_exit 1 fi if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5 printf "%s\n" "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;} fi echo "" echo "Configuration:" echo "" echo " PAM support: .............................. $enable_pam" echo " telnet support: ........................... $enable_telnet" echo " utmp support: ............................. $enable_utmp" echo " global socket directory: .................. $enable_socket_dir" echo "" echo " system screenrc location: ................. $with_system_screenrc" echo " pty mode: ................................. $with_pty_mode" echo " pty group: ................................ $with_pty_group" echo " pty on read only file system: ............. $with_pty_rofs" echo "" if test "x$enable_pam" != "xyes" then : echo "!!! WARNING !!!" echo "YOU ARE DISABLING PAM SUPPORT!" echo "FOR screen TO WORK IT WILL NEED TO RUN AS SUID root BINARY" echo "THIS CONFIGURATION IS _HIGHLY_ NOT RECOMMENDED!" echo "!!! WARNING !!!" fi screen-5.0.2/autom4te.cache/0000755000175000017500000000000015224432734014253 5ustar alexalexscreen-5.0.2/autom4te.cache/traces.20000664000175000017500000007321015224432734015624 0ustar alexalexm4trace:configure.ac:1: -1- AC_INIT([GNU Screen], [5.0.2], [https://savannah.gnu.org/bugs/?group=screen], [screen], [https://www.gnu.org/software/screen/]) m4trace:configure.ac:1: -1- m4_pattern_forbid([^_?A[CHUM]_]) m4trace:configure.ac:1: -1- m4_pattern_forbid([_AC_]) m4trace:configure.ac:1: -1- m4_pattern_forbid([^LIBOBJS$], [do not use LIBOBJS directly, use AC_LIBOBJ (see section 'AC_LIBOBJ vs LIBOBJS']) m4trace:configure.ac:1: -1- m4_pattern_allow([^AS_FLAGS$]) m4trace:configure.ac:1: -1- m4_pattern_forbid([^_?m4_]) m4trace:configure.ac:1: -1- m4_pattern_forbid([^dnl$]) m4trace:configure.ac:1: -1- m4_pattern_forbid([^_?AS_]) m4trace:configure.ac:1: -1- AC_SUBST([SHELL]) m4trace:configure.ac:1: -1- AC_SUBST_TRACE([SHELL]) m4trace:configure.ac:1: -1- m4_pattern_allow([^SHELL$]) m4trace:configure.ac:1: -1- AC_SUBST([PATH_SEPARATOR]) m4trace:configure.ac:1: -1- AC_SUBST_TRACE([PATH_SEPARATOR]) m4trace:configure.ac:1: -1- m4_pattern_allow([^PATH_SEPARATOR$]) m4trace:configure.ac:1: -1- AC_SUBST([PACKAGE_NAME], [m4_ifdef([AC_PACKAGE_NAME], ['AC_PACKAGE_NAME'])]) m4trace:configure.ac:1: -1- AC_SUBST_TRACE([PACKAGE_NAME]) m4trace:configure.ac:1: -1- m4_pattern_allow([^PACKAGE_NAME$]) m4trace:configure.ac:1: -1- AC_SUBST([PACKAGE_TARNAME], [m4_ifdef([AC_PACKAGE_TARNAME], ['AC_PACKAGE_TARNAME'])]) m4trace:configure.ac:1: -1- AC_SUBST_TRACE([PACKAGE_TARNAME]) m4trace:configure.ac:1: -1- m4_pattern_allow([^PACKAGE_TARNAME$]) m4trace:configure.ac:1: -1- AC_SUBST([PACKAGE_VERSION], [m4_ifdef([AC_PACKAGE_VERSION], ['AC_PACKAGE_VERSION'])]) m4trace:configure.ac:1: -1- AC_SUBST_TRACE([PACKAGE_VERSION]) m4trace:configure.ac:1: -1- m4_pattern_allow([^PACKAGE_VERSION$]) m4trace:configure.ac:1: -1- AC_SUBST([PACKAGE_STRING], [m4_ifdef([AC_PACKAGE_STRING], ['AC_PACKAGE_STRING'])]) m4trace:configure.ac:1: -1- AC_SUBST_TRACE([PACKAGE_STRING]) m4trace:configure.ac:1: -1- m4_pattern_allow([^PACKAGE_STRING$]) m4trace:configure.ac:1: -1- AC_SUBST([PACKAGE_BUGREPORT], [m4_ifdef([AC_PACKAGE_BUGREPORT], ['AC_PACKAGE_BUGREPORT'])]) m4trace:configure.ac:1: -1- AC_SUBST_TRACE([PACKAGE_BUGREPORT]) m4trace:configure.ac:1: -1- m4_pattern_allow([^PACKAGE_BUGREPORT$]) m4trace:configure.ac:1: -1- AC_SUBST([PACKAGE_URL], [m4_ifdef([AC_PACKAGE_URL], ['AC_PACKAGE_URL'])]) m4trace:configure.ac:1: -1- AC_SUBST_TRACE([PACKAGE_URL]) m4trace:configure.ac:1: -1- m4_pattern_allow([^PACKAGE_URL$]) m4trace:configure.ac:1: -1- AC_SUBST([exec_prefix], [NONE]) m4trace:configure.ac:1: -1- AC_SUBST_TRACE([exec_prefix]) m4trace:configure.ac:1: -1- m4_pattern_allow([^exec_prefix$]) m4trace:configure.ac:1: -1- AC_SUBST([prefix], [NONE]) m4trace:configure.ac:1: -1- AC_SUBST_TRACE([prefix]) m4trace:configure.ac:1: -1- m4_pattern_allow([^prefix$]) m4trace:configure.ac:1: -1- AC_SUBST([program_transform_name], [s,x,x,]) m4trace:configure.ac:1: -1- AC_SUBST_TRACE([program_transform_name]) m4trace:configure.ac:1: -1- m4_pattern_allow([^program_transform_name$]) m4trace:configure.ac:1: -1- AC_SUBST([bindir], ['${exec_prefix}/bin']) m4trace:configure.ac:1: -1- AC_SUBST_TRACE([bindir]) m4trace:configure.ac:1: -1- m4_pattern_allow([^bindir$]) m4trace:configure.ac:1: -1- AC_SUBST([sbindir], ['${exec_prefix}/sbin']) m4trace:configure.ac:1: -1- AC_SUBST_TRACE([sbindir]) m4trace:configure.ac:1: -1- m4_pattern_allow([^sbindir$]) m4trace:configure.ac:1: -1- AC_SUBST([libexecdir], ['${exec_prefix}/libexec']) m4trace:configure.ac:1: -1- AC_SUBST_TRACE([libexecdir]) m4trace:configure.ac:1: -1- m4_pattern_allow([^libexecdir$]) m4trace:configure.ac:1: -1- AC_SUBST([datarootdir], ['${prefix}/share']) m4trace:configure.ac:1: -1- AC_SUBST_TRACE([datarootdir]) m4trace:configure.ac:1: -1- m4_pattern_allow([^datarootdir$]) m4trace:configure.ac:1: -1- AC_SUBST([datadir], ['${datarootdir}']) m4trace:configure.ac:1: -1- AC_SUBST_TRACE([datadir]) m4trace:configure.ac:1: -1- m4_pattern_allow([^datadir$]) m4trace:configure.ac:1: -1- AC_SUBST([sysconfdir], ['${prefix}/etc']) m4trace:configure.ac:1: -1- AC_SUBST_TRACE([sysconfdir]) m4trace:configure.ac:1: -1- m4_pattern_allow([^sysconfdir$]) m4trace:configure.ac:1: -1- AC_SUBST([sharedstatedir], ['${prefix}/com']) m4trace:configure.ac:1: -1- AC_SUBST_TRACE([sharedstatedir]) m4trace:configure.ac:1: -1- m4_pattern_allow([^sharedstatedir$]) m4trace:configure.ac:1: -1- AC_SUBST([localstatedir], ['${prefix}/var']) m4trace:configure.ac:1: -1- AC_SUBST_TRACE([localstatedir]) m4trace:configure.ac:1: -1- m4_pattern_allow([^localstatedir$]) m4trace:configure.ac:1: -1- AC_SUBST([runstatedir], ['${localstatedir}/run']) m4trace:configure.ac:1: -1- AC_SUBST_TRACE([runstatedir]) m4trace:configure.ac:1: -1- m4_pattern_allow([^runstatedir$]) m4trace:configure.ac:1: -1- AC_SUBST([includedir], ['${prefix}/include']) m4trace:configure.ac:1: -1- AC_SUBST_TRACE([includedir]) m4trace:configure.ac:1: -1- m4_pattern_allow([^includedir$]) m4trace:configure.ac:1: -1- AC_SUBST([oldincludedir], ['/usr/include']) m4trace:configure.ac:1: -1- AC_SUBST_TRACE([oldincludedir]) m4trace:configure.ac:1: -1- m4_pattern_allow([^oldincludedir$]) m4trace:configure.ac:1: -1- AC_SUBST([docdir], [m4_ifset([AC_PACKAGE_TARNAME], ['${datarootdir}/doc/${PACKAGE_TARNAME}'], ['${datarootdir}/doc/${PACKAGE}'])]) m4trace:configure.ac:1: -1- AC_SUBST_TRACE([docdir]) m4trace:configure.ac:1: -1- m4_pattern_allow([^docdir$]) m4trace:configure.ac:1: -1- AC_SUBST([infodir], ['${datarootdir}/info']) m4trace:configure.ac:1: -1- AC_SUBST_TRACE([infodir]) m4trace:configure.ac:1: -1- m4_pattern_allow([^infodir$]) m4trace:configure.ac:1: -1- AC_SUBST([htmldir], ['${docdir}']) m4trace:configure.ac:1: -1- AC_SUBST_TRACE([htmldir]) m4trace:configure.ac:1: -1- m4_pattern_allow([^htmldir$]) m4trace:configure.ac:1: -1- AC_SUBST([dvidir], ['${docdir}']) m4trace:configure.ac:1: -1- AC_SUBST_TRACE([dvidir]) m4trace:configure.ac:1: -1- m4_pattern_allow([^dvidir$]) m4trace:configure.ac:1: -1- AC_SUBST([pdfdir], ['${docdir}']) m4trace:configure.ac:1: -1- AC_SUBST_TRACE([pdfdir]) m4trace:configure.ac:1: -1- m4_pattern_allow([^pdfdir$]) m4trace:configure.ac:1: -1- AC_SUBST([psdir], ['${docdir}']) m4trace:configure.ac:1: -1- AC_SUBST_TRACE([psdir]) m4trace:configure.ac:1: -1- m4_pattern_allow([^psdir$]) m4trace:configure.ac:1: -1- AC_SUBST([libdir], ['${exec_prefix}/lib']) m4trace:configure.ac:1: -1- AC_SUBST_TRACE([libdir]) m4trace:configure.ac:1: -1- m4_pattern_allow([^libdir$]) m4trace:configure.ac:1: -1- AC_SUBST([localedir], ['${datarootdir}/locale']) m4trace:configure.ac:1: -1- AC_SUBST_TRACE([localedir]) m4trace:configure.ac:1: -1- m4_pattern_allow([^localedir$]) m4trace:configure.ac:1: -1- AC_SUBST([mandir], ['${datarootdir}/man']) m4trace:configure.ac:1: -1- AC_SUBST_TRACE([mandir]) m4trace:configure.ac:1: -1- m4_pattern_allow([^mandir$]) m4trace:configure.ac:1: -1- AC_DEFINE_TRACE_LITERAL([PACKAGE_NAME]) m4trace:configure.ac:1: -1- m4_pattern_allow([^PACKAGE_NAME$]) m4trace:configure.ac:1: -1- AH_OUTPUT([PACKAGE_NAME], [/* Define to the full name of this package. */ @%:@undef PACKAGE_NAME]) m4trace:configure.ac:1: -1- AC_DEFINE_TRACE_LITERAL([PACKAGE_TARNAME]) m4trace:configure.ac:1: -1- m4_pattern_allow([^PACKAGE_TARNAME$]) m4trace:configure.ac:1: -1- AH_OUTPUT([PACKAGE_TARNAME], [/* Define to the one symbol short name of this package. */ @%:@undef PACKAGE_TARNAME]) m4trace:configure.ac:1: -1- AC_DEFINE_TRACE_LITERAL([PACKAGE_VERSION]) m4trace:configure.ac:1: -1- m4_pattern_allow([^PACKAGE_VERSION$]) m4trace:configure.ac:1: -1- AH_OUTPUT([PACKAGE_VERSION], [/* Define to the version of this package. */ @%:@undef PACKAGE_VERSION]) m4trace:configure.ac:1: -1- AC_DEFINE_TRACE_LITERAL([PACKAGE_STRING]) m4trace:configure.ac:1: -1- m4_pattern_allow([^PACKAGE_STRING$]) m4trace:configure.ac:1: -1- AH_OUTPUT([PACKAGE_STRING], [/* Define to the full name and version of this package. */ @%:@undef PACKAGE_STRING]) m4trace:configure.ac:1: -1- AC_DEFINE_TRACE_LITERAL([PACKAGE_BUGREPORT]) m4trace:configure.ac:1: -1- m4_pattern_allow([^PACKAGE_BUGREPORT$]) m4trace:configure.ac:1: -1- AH_OUTPUT([PACKAGE_BUGREPORT], [/* Define to the address where bug reports for this package should be sent. */ @%:@undef PACKAGE_BUGREPORT]) m4trace:configure.ac:1: -1- AC_DEFINE_TRACE_LITERAL([PACKAGE_URL]) m4trace:configure.ac:1: -1- m4_pattern_allow([^PACKAGE_URL$]) m4trace:configure.ac:1: -1- AH_OUTPUT([PACKAGE_URL], [/* Define to the home page for this package. */ @%:@undef PACKAGE_URL]) m4trace:configure.ac:1: -1- AC_SUBST([DEFS]) m4trace:configure.ac:1: -1- AC_SUBST_TRACE([DEFS]) m4trace:configure.ac:1: -1- m4_pattern_allow([^DEFS$]) m4trace:configure.ac:1: -1- AC_SUBST([ECHO_C]) m4trace:configure.ac:1: -1- AC_SUBST_TRACE([ECHO_C]) m4trace:configure.ac:1: -1- m4_pattern_allow([^ECHO_C$]) m4trace:configure.ac:1: -1- AC_SUBST([ECHO_N]) m4trace:configure.ac:1: -1- AC_SUBST_TRACE([ECHO_N]) m4trace:configure.ac:1: -1- m4_pattern_allow([^ECHO_N$]) m4trace:configure.ac:1: -1- AC_SUBST([ECHO_T]) m4trace:configure.ac:1: -1- AC_SUBST_TRACE([ECHO_T]) m4trace:configure.ac:1: -1- m4_pattern_allow([^ECHO_T$]) m4trace:configure.ac:1: -1- AC_SUBST([LIBS]) m4trace:configure.ac:1: -1- AC_SUBST_TRACE([LIBS]) m4trace:configure.ac:1: -1- m4_pattern_allow([^LIBS$]) m4trace:configure.ac:1: -1- AC_SUBST([build_alias]) m4trace:configure.ac:1: -1- AC_SUBST_TRACE([build_alias]) m4trace:configure.ac:1: -1- m4_pattern_allow([^build_alias$]) m4trace:configure.ac:1: -1- AC_SUBST([host_alias]) m4trace:configure.ac:1: -1- AC_SUBST_TRACE([host_alias]) m4trace:configure.ac:1: -1- m4_pattern_allow([^host_alias$]) m4trace:configure.ac:1: -1- AC_SUBST([target_alias]) m4trace:configure.ac:1: -1- AC_SUBST_TRACE([target_alias]) m4trace:configure.ac:1: -1- m4_pattern_allow([^target_alias$]) m4trace:configure.ac:4: -1- AC_CONFIG_HEADERS([config.h]) m4trace:configure.ac:7: -1- AC_DEFINE_TRACE_LITERAL([VERSION_MAJOR]) m4trace:configure.ac:7: -1- m4_pattern_allow([^VERSION_MAJOR$]) m4trace:configure.ac:7: -1- AH_OUTPUT([VERSION_MAJOR], [/* Major version of GNU screen */ @%:@undef VERSION_MAJOR]) m4trace:configure.ac:10: -1- AC_DEFINE_TRACE_LITERAL([VERSION_MINOR]) m4trace:configure.ac:10: -1- m4_pattern_allow([^VERSION_MINOR$]) m4trace:configure.ac:10: -1- AH_OUTPUT([VERSION_MINOR], [/* Minor version of GNU screen */ @%:@undef VERSION_MINOR]) m4trace:configure.ac:13: -1- AC_DEFINE_TRACE_LITERAL([VERSION_REVISION]) m4trace:configure.ac:13: -1- m4_pattern_allow([^VERSION_REVISION$]) m4trace:configure.ac:13: -1- AH_OUTPUT([VERSION_REVISION], [/* Micro revision of GNU screen */ @%:@undef VERSION_REVISION]) m4trace:configure.ac:18: -1- AH_OUTPUT([HAVE_EXECVPE], [/* system has execvpe() defined */ @%:@undef HAVE_EXECVPE]) m4trace:configure.ac:19: -1- AH_OUTPUT([HAVE_OPENPTY], [/* system has openpty() defined */ @%:@undef HAVE_OPENPTY]) m4trace:configure.ac:22: -1- AH_OUTPUT([ENABLE_UTMP], [/* Enable utmp support */ @%:@undef ENABLE_UTMP]) m4trace:configure.ac:23: -1- AH_OUTPUT([HAVE_UTEMPTER], [/* system has utempter helper binary */ @%:@undef HAVE_UTEMPTER]) m4trace:configure.ac:24: -1- AH_OUTPUT([HAVE_UT_EXIT], [/* utmpx struct has ut_exit field */ @%:@undef HAVE_UT_EXIT]) m4trace:configure.ac:25: -1- AH_OUTPUT([HAVE_UT_HOST], [/* utmpx struct has ut_host field */ @%:@undef HAVE_UT_HOST]) m4trace:configure.ac:28: -1- AH_OUTPUT([ENABLE_PAM], [/* Enable Pluggable Authentication Modules support */ @%:@undef ENABLE_PAM]) m4trace:configure.ac:31: -1- AH_OUTPUT([ENABLE_TELNET], [/* Enable built-in telnet client */ @%:@undef ENABLE_TELNET]) m4trace:configure.ac:34: -1- AH_OUTPUT([SOCKET_DIR], [/* Path to socket directory */ @%:@undef SOCKET_DIR]) m4trace:configure.ac:37: -1- AH_OUTPUT([SYSTEM_SCREENRC], [/* Path to system screenrc */ @%:@undef SYSTEM_SCREENRC]) m4trace:configure.ac:40: -1- AH_OUTPUT([PTY_MODE], [/* Default mode for pty devices */ @%:@undef PTY_MODE]) m4trace:configure.ac:41: -1- AH_OUTPUT([PTY_GROUP], [/* Default group for pty devices */ @%:@undef PTY_GROUP]) m4trace:configure.ac:42: -1- AH_OUTPUT([PTY_ROFS], [/* pty devices are on read only filesystem */ @%:@undef PTY_ROFS]) m4trace:configure.ac:49: -1- AH_OUTPUT([USE_SYSTEM_EXTENSIONS], [/* Enable extensions on AIX, Interix, z/OS. */ #ifndef _ALL_SOURCE # undef _ALL_SOURCE #endif /* Enable general extensions on macOS. */ #ifndef _DARWIN_C_SOURCE # undef _DARWIN_C_SOURCE #endif /* Enable general extensions on Solaris. */ #ifndef __EXTENSIONS__ # undef __EXTENSIONS__ #endif /* Enable GNU extensions on systems that have them. */ #ifndef _GNU_SOURCE # undef _GNU_SOURCE #endif /* Enable X/Open compliant socket functions that do not require linking with -lxnet on HP-UX 11.11. */ #ifndef _HPUX_ALT_XOPEN_SOCKET_API # undef _HPUX_ALT_XOPEN_SOCKET_API #endif /* Identify the host operating system as Minix. This macro does not affect the system headers\' behavior. A future release of Autoconf may stop defining this macro. */ #ifndef _MINIX # undef _MINIX #endif /* Enable general extensions on NetBSD. Enable NetBSD compatibility extensions on Minix. */ #ifndef _NETBSD_SOURCE # undef _NETBSD_SOURCE #endif /* Enable OpenBSD compatibility extensions on NetBSD. Oddly enough, this does nothing on OpenBSD. */ #ifndef _OPENBSD_SOURCE # undef _OPENBSD_SOURCE #endif /* Define to 1 if needed for POSIX-compatible behavior. */ #ifndef _POSIX_SOURCE # undef _POSIX_SOURCE #endif /* Define to 2 if needed for POSIX-compatible behavior. */ #ifndef _POSIX_1_SOURCE # undef _POSIX_1_SOURCE #endif /* Enable POSIX-compatible threading on Solaris. */ #ifndef _POSIX_PTHREAD_SEMANTICS # undef _POSIX_PTHREAD_SEMANTICS #endif /* Enable extensions specified by ISO/IEC TS 18661-5:2014. */ #ifndef __STDC_WANT_IEC_60559_ATTRIBS_EXT__ # undef __STDC_WANT_IEC_60559_ATTRIBS_EXT__ #endif /* Enable extensions specified by ISO/IEC TS 18661-1:2014. */ #ifndef __STDC_WANT_IEC_60559_BFP_EXT__ # undef __STDC_WANT_IEC_60559_BFP_EXT__ #endif /* Enable extensions specified by ISO/IEC TS 18661-2:2015. */ #ifndef __STDC_WANT_IEC_60559_DFP_EXT__ # undef __STDC_WANT_IEC_60559_DFP_EXT__ #endif /* Enable extensions specified by C23 Annex F. */ #ifndef __STDC_WANT_IEC_60559_EXT__ # undef __STDC_WANT_IEC_60559_EXT__ #endif /* Enable extensions specified by ISO/IEC TS 18661-4:2015. */ #ifndef __STDC_WANT_IEC_60559_FUNCS_EXT__ # undef __STDC_WANT_IEC_60559_FUNCS_EXT__ #endif /* Enable extensions specified by C23 Annex H and ISO/IEC TS 18661-3:2015. */ #ifndef __STDC_WANT_IEC_60559_TYPES_EXT__ # undef __STDC_WANT_IEC_60559_TYPES_EXT__ #endif /* Enable extensions specified by ISO/IEC TR 24731-2:2010. */ #ifndef __STDC_WANT_LIB_EXT2__ # undef __STDC_WANT_LIB_EXT2__ #endif /* Enable extensions specified by ISO/IEC 24747:2009. */ #ifndef __STDC_WANT_MATH_SPEC_FUNCS__ # undef __STDC_WANT_MATH_SPEC_FUNCS__ #endif /* Enable extensions on HP NonStop. */ #ifndef _TANDEM_SOURCE # undef _TANDEM_SOURCE #endif /* Enable X/Open extensions. Define to 500 only if necessary to make mbstate_t available. */ #ifndef _XOPEN_SOURCE # undef _XOPEN_SOURCE #endif ]) m4trace:configure.ac:49: -1- AH_OUTPUT([HAVE_STDIO_H], [/* Define to 1 if you have the header file. */ @%:@undef HAVE_STDIO_H]) m4trace:configure.ac:49: -1- AC_SUBST([CC]) m4trace:configure.ac:49: -1- AC_SUBST_TRACE([CC]) m4trace:configure.ac:49: -1- m4_pattern_allow([^CC$]) m4trace:configure.ac:49: -1- AC_SUBST([CFLAGS]) m4trace:configure.ac:49: -1- AC_SUBST_TRACE([CFLAGS]) m4trace:configure.ac:49: -1- m4_pattern_allow([^CFLAGS$]) m4trace:configure.ac:49: -1- AC_SUBST([LDFLAGS]) m4trace:configure.ac:49: -1- AC_SUBST_TRACE([LDFLAGS]) m4trace:configure.ac:49: -1- m4_pattern_allow([^LDFLAGS$]) m4trace:configure.ac:49: -1- AC_SUBST([LIBS]) m4trace:configure.ac:49: -1- AC_SUBST_TRACE([LIBS]) m4trace:configure.ac:49: -1- m4_pattern_allow([^LIBS$]) m4trace:configure.ac:49: -1- AC_SUBST([CPPFLAGS]) m4trace:configure.ac:49: -1- AC_SUBST_TRACE([CPPFLAGS]) m4trace:configure.ac:49: -1- m4_pattern_allow([^CPPFLAGS$]) m4trace:configure.ac:49: -1- AC_SUBST([CC]) m4trace:configure.ac:49: -1- AC_SUBST_TRACE([CC]) m4trace:configure.ac:49: -1- m4_pattern_allow([^CC$]) m4trace:configure.ac:49: -1- AC_SUBST([CC]) m4trace:configure.ac:49: -1- AC_SUBST_TRACE([CC]) m4trace:configure.ac:49: -1- m4_pattern_allow([^CC$]) m4trace:configure.ac:49: -1- AC_SUBST([CC]) m4trace:configure.ac:49: -1- AC_SUBST_TRACE([CC]) m4trace:configure.ac:49: -1- m4_pattern_allow([^CC$]) m4trace:configure.ac:49: -1- AC_SUBST([CC]) m4trace:configure.ac:49: -1- AC_SUBST_TRACE([CC]) m4trace:configure.ac:49: -1- m4_pattern_allow([^CC$]) m4trace:configure.ac:49: -1- AC_SUBST([ac_ct_CC]) m4trace:configure.ac:49: -1- AC_SUBST_TRACE([ac_ct_CC]) m4trace:configure.ac:49: -1- m4_pattern_allow([^ac_ct_CC$]) m4trace:configure.ac:49: -1- AC_SUBST([CC]) m4trace:configure.ac:49: -1- AC_SUBST_TRACE([CC]) m4trace:configure.ac:49: -1- m4_pattern_allow([^CC$]) m4trace:configure.ac:49: -1- AC_SUBST([EXEEXT], [$ac_cv_exeext]) m4trace:configure.ac:49: -1- AC_SUBST_TRACE([EXEEXT]) m4trace:configure.ac:49: -1- m4_pattern_allow([^EXEEXT$]) m4trace:configure.ac:49: -1- AC_SUBST([OBJEXT], [$ac_cv_objext]) m4trace:configure.ac:49: -1- AC_SUBST_TRACE([OBJEXT]) m4trace:configure.ac:49: -1- m4_pattern_allow([^OBJEXT$]) m4trace:configure.ac:49: -1- AH_OUTPUT([HAVE_STDLIB_H], [/* Define to 1 if you have the header file. */ @%:@undef HAVE_STDLIB_H]) m4trace:configure.ac:49: -1- AH_OUTPUT([HAVE_STRING_H], [/* Define to 1 if you have the header file. */ @%:@undef HAVE_STRING_H]) m4trace:configure.ac:49: -1- AH_OUTPUT([HAVE_INTTYPES_H], [/* Define to 1 if you have the header file. */ @%:@undef HAVE_INTTYPES_H]) m4trace:configure.ac:49: -1- AH_OUTPUT([HAVE_STDINT_H], [/* Define to 1 if you have the header file. */ @%:@undef HAVE_STDINT_H]) m4trace:configure.ac:49: -1- AH_OUTPUT([HAVE_STRINGS_H], [/* Define to 1 if you have the header file. */ @%:@undef HAVE_STRINGS_H]) m4trace:configure.ac:49: -1- AH_OUTPUT([HAVE_SYS_STAT_H], [/* Define to 1 if you have the header file. */ @%:@undef HAVE_SYS_STAT_H]) m4trace:configure.ac:49: -1- AH_OUTPUT([HAVE_SYS_TYPES_H], [/* Define to 1 if you have the header file. */ @%:@undef HAVE_SYS_TYPES_H]) m4trace:configure.ac:49: -1- AH_OUTPUT([HAVE_UNISTD_H], [/* Define to 1 if you have the header file. */ @%:@undef HAVE_UNISTD_H]) m4trace:configure.ac:49: -1- AC_DEFINE_TRACE_LITERAL([STDC_HEADERS]) m4trace:configure.ac:49: -1- m4_pattern_allow([^STDC_HEADERS$]) m4trace:configure.ac:49: -1- AH_OUTPUT([STDC_HEADERS], [/* Define to 1 if all of the C89 standard headers exist (not just the ones required in a freestanding environment). This macro is provided for backward compatibility; new code need not use it. */ @%:@undef STDC_HEADERS]) m4trace:configure.ac:49: -1- AH_OUTPUT([HAVE_WCHAR_H], [/* Define to 1 if you have the header file. */ @%:@undef HAVE_WCHAR_H]) m4trace:configure.ac:49: -1- AH_OUTPUT([HAVE_MINIX_CONFIG_H], [/* Define to 1 if you have the header file. */ @%:@undef HAVE_MINIX_CONFIG_H]) m4trace:configure.ac:49: -1- AC_DEFINE_TRACE_LITERAL([_ALL_SOURCE]) m4trace:configure.ac:49: -1- m4_pattern_allow([^_ALL_SOURCE$]) m4trace:configure.ac:49: -1- AC_DEFINE_TRACE_LITERAL([_DARWIN_C_SOURCE]) m4trace:configure.ac:49: -1- m4_pattern_allow([^_DARWIN_C_SOURCE$]) m4trace:configure.ac:49: -1- AC_DEFINE_TRACE_LITERAL([_GNU_SOURCE]) m4trace:configure.ac:49: -1- m4_pattern_allow([^_GNU_SOURCE$]) m4trace:configure.ac:49: -1- AC_DEFINE_TRACE_LITERAL([_HPUX_ALT_XOPEN_SOCKET_API]) m4trace:configure.ac:49: -1- m4_pattern_allow([^_HPUX_ALT_XOPEN_SOCKET_API$]) m4trace:configure.ac:49: -1- AC_DEFINE_TRACE_LITERAL([_NETBSD_SOURCE]) m4trace:configure.ac:49: -1- m4_pattern_allow([^_NETBSD_SOURCE$]) m4trace:configure.ac:49: -1- AC_DEFINE_TRACE_LITERAL([_OPENBSD_SOURCE]) m4trace:configure.ac:49: -1- m4_pattern_allow([^_OPENBSD_SOURCE$]) m4trace:configure.ac:49: -1- AC_DEFINE_TRACE_LITERAL([_POSIX_PTHREAD_SEMANTICS]) m4trace:configure.ac:49: -1- m4_pattern_allow([^_POSIX_PTHREAD_SEMANTICS$]) m4trace:configure.ac:49: -1- AC_DEFINE_TRACE_LITERAL([__STDC_WANT_IEC_60559_ATTRIBS_EXT__]) m4trace:configure.ac:49: -1- m4_pattern_allow([^__STDC_WANT_IEC_60559_ATTRIBS_EXT__$]) m4trace:configure.ac:49: -1- AC_DEFINE_TRACE_LITERAL([__STDC_WANT_IEC_60559_BFP_EXT__]) m4trace:configure.ac:49: -1- m4_pattern_allow([^__STDC_WANT_IEC_60559_BFP_EXT__$]) m4trace:configure.ac:49: -1- AC_DEFINE_TRACE_LITERAL([__STDC_WANT_IEC_60559_DFP_EXT__]) m4trace:configure.ac:49: -1- m4_pattern_allow([^__STDC_WANT_IEC_60559_DFP_EXT__$]) m4trace:configure.ac:49: -1- AC_DEFINE_TRACE_LITERAL([__STDC_WANT_IEC_60559_EXT__]) m4trace:configure.ac:49: -1- m4_pattern_allow([^__STDC_WANT_IEC_60559_EXT__$]) m4trace:configure.ac:49: -1- AC_DEFINE_TRACE_LITERAL([__STDC_WANT_IEC_60559_FUNCS_EXT__]) m4trace:configure.ac:49: -1- m4_pattern_allow([^__STDC_WANT_IEC_60559_FUNCS_EXT__$]) m4trace:configure.ac:49: -1- AC_DEFINE_TRACE_LITERAL([__STDC_WANT_IEC_60559_TYPES_EXT__]) m4trace:configure.ac:49: -1- m4_pattern_allow([^__STDC_WANT_IEC_60559_TYPES_EXT__$]) m4trace:configure.ac:49: -1- AC_DEFINE_TRACE_LITERAL([__STDC_WANT_LIB_EXT2__]) m4trace:configure.ac:49: -1- m4_pattern_allow([^__STDC_WANT_LIB_EXT2__$]) m4trace:configure.ac:49: -1- AC_DEFINE_TRACE_LITERAL([__STDC_WANT_MATH_SPEC_FUNCS__]) m4trace:configure.ac:49: -1- m4_pattern_allow([^__STDC_WANT_MATH_SPEC_FUNCS__$]) m4trace:configure.ac:49: -1- AC_DEFINE_TRACE_LITERAL([_TANDEM_SOURCE]) m4trace:configure.ac:49: -1- m4_pattern_allow([^_TANDEM_SOURCE$]) m4trace:configure.ac:49: -1- AC_DEFINE_TRACE_LITERAL([_MINIX]) m4trace:configure.ac:49: -1- m4_pattern_allow([^_MINIX$]) m4trace:configure.ac:49: -1- AC_DEFINE_TRACE_LITERAL([_POSIX_SOURCE]) m4trace:configure.ac:49: -1- m4_pattern_allow([^_POSIX_SOURCE$]) m4trace:configure.ac:49: -1- AC_DEFINE_TRACE_LITERAL([_POSIX_1_SOURCE]) m4trace:configure.ac:49: -1- m4_pattern_allow([^_POSIX_1_SOURCE$]) m4trace:configure.ac:49: -1- AC_DEFINE_TRACE_LITERAL([__EXTENSIONS__]) m4trace:configure.ac:49: -1- m4_pattern_allow([^__EXTENSIONS__$]) m4trace:configure.ac:49: -1- AC_DEFINE_TRACE_LITERAL([_XOPEN_SOURCE]) m4trace:configure.ac:49: -1- m4_pattern_allow([^_XOPEN_SOURCE$]) m4trace:configure.ac:50: -1- AC_SUBST([CC]) m4trace:configure.ac:50: -1- AC_SUBST_TRACE([CC]) m4trace:configure.ac:50: -1- m4_pattern_allow([^CC$]) m4trace:configure.ac:50: -1- AC_SUBST([CFLAGS]) m4trace:configure.ac:50: -1- AC_SUBST_TRACE([CFLAGS]) m4trace:configure.ac:50: -1- m4_pattern_allow([^CFLAGS$]) m4trace:configure.ac:50: -1- AC_SUBST([LDFLAGS]) m4trace:configure.ac:50: -1- AC_SUBST_TRACE([LDFLAGS]) m4trace:configure.ac:50: -1- m4_pattern_allow([^LDFLAGS$]) m4trace:configure.ac:50: -1- AC_SUBST([LIBS]) m4trace:configure.ac:50: -1- AC_SUBST_TRACE([LIBS]) m4trace:configure.ac:50: -1- m4_pattern_allow([^LIBS$]) m4trace:configure.ac:50: -1- AC_SUBST([CPPFLAGS]) m4trace:configure.ac:50: -1- AC_SUBST_TRACE([CPPFLAGS]) m4trace:configure.ac:50: -1- m4_pattern_allow([^CPPFLAGS$]) m4trace:configure.ac:50: -1- AC_SUBST([CC]) m4trace:configure.ac:50: -1- AC_SUBST_TRACE([CC]) m4trace:configure.ac:50: -1- m4_pattern_allow([^CC$]) m4trace:configure.ac:50: -1- AC_SUBST([CC]) m4trace:configure.ac:50: -1- AC_SUBST_TRACE([CC]) m4trace:configure.ac:50: -1- m4_pattern_allow([^CC$]) m4trace:configure.ac:50: -1- AC_SUBST([CC]) m4trace:configure.ac:50: -1- AC_SUBST_TRACE([CC]) m4trace:configure.ac:50: -1- m4_pattern_allow([^CC$]) m4trace:configure.ac:50: -1- AC_SUBST([CC]) m4trace:configure.ac:50: -1- AC_SUBST_TRACE([CC]) m4trace:configure.ac:50: -1- m4_pattern_allow([^CC$]) m4trace:configure.ac:50: -1- AC_SUBST([ac_ct_CC]) m4trace:configure.ac:50: -1- AC_SUBST_TRACE([ac_ct_CC]) m4trace:configure.ac:50: -1- m4_pattern_allow([^ac_ct_CC$]) m4trace:configure.ac:50: -1- AC_SUBST([CC]) m4trace:configure.ac:50: -1- AC_SUBST_TRACE([CC]) m4trace:configure.ac:50: -1- m4_pattern_allow([^CC$]) m4trace:configure.ac:51: -1- AC_SUBST([AWK]) m4trace:configure.ac:51: -1- AC_SUBST_TRACE([AWK]) m4trace:configure.ac:51: -1- m4_pattern_allow([^AWK$]) m4trace:configure.ac:52: -1- AC_REQUIRE_AUX_FILE([install-sh]) m4trace:configure.ac:52: -1- AC_SUBST([INSTALL_PROGRAM]) m4trace:configure.ac:52: -1- AC_SUBST_TRACE([INSTALL_PROGRAM]) m4trace:configure.ac:52: -1- m4_pattern_allow([^INSTALL_PROGRAM$]) m4trace:configure.ac:52: -1- AC_SUBST([INSTALL_SCRIPT]) m4trace:configure.ac:52: -1- AC_SUBST_TRACE([INSTALL_SCRIPT]) m4trace:configure.ac:52: -1- m4_pattern_allow([^INSTALL_SCRIPT$]) m4trace:configure.ac:52: -1- AC_SUBST([INSTALL_DATA]) m4trace:configure.ac:52: -1- AC_SUBST_TRACE([INSTALL_DATA]) m4trace:configure.ac:52: -1- m4_pattern_allow([^INSTALL_DATA$]) m4trace:configure.ac:60: -1- AH_OUTPUT([HAVE_EXECVPE], [/* Define to 1 if you have the \'execvpe\' function. */ @%:@undef HAVE_EXECVPE]) m4trace:configure.ac:60: -1- AC_DEFINE_TRACE_LITERAL([HAVE_EXECVPE]) m4trace:configure.ac:60: -1- m4_pattern_allow([^HAVE_EXECVPE$]) m4trace:configure.ac:63: -1- AH_OUTPUT([HAVE_SETEUID], [/* Define to 1 if you have the \'seteuid\' function. */ @%:@undef HAVE_SETEUID]) m4trace:configure.ac:63: -1- AC_DEFINE_TRACE_LITERAL([HAVE_SETEUID]) m4trace:configure.ac:63: -1- m4_pattern_allow([^HAVE_SETEUID$]) m4trace:configure.ac:63: -1- AH_OUTPUT([HAVE_SETEGID], [/* Define to 1 if you have the \'setegid\' function. */ @%:@undef HAVE_SETEGID]) m4trace:configure.ac:63: -1- AC_DEFINE_TRACE_LITERAL([HAVE_SETEGID]) m4trace:configure.ac:63: -1- m4_pattern_allow([^HAVE_SETEGID$]) m4trace:configure.ac:63: -1- AH_OUTPUT([HAVE_SETREUID], [/* Define to 1 if you have the \'setreuid\' function. */ @%:@undef HAVE_SETREUID]) m4trace:configure.ac:63: -1- AC_DEFINE_TRACE_LITERAL([HAVE_SETREUID]) m4trace:configure.ac:63: -1- m4_pattern_allow([^HAVE_SETREUID$]) m4trace:configure.ac:63: -1- AH_OUTPUT([HAVE_SETRESUID], [/* Define to 1 if you have the \'setresuid\' function. */ @%:@undef HAVE_SETRESUID]) m4trace:configure.ac:63: -1- AC_DEFINE_TRACE_LITERAL([HAVE_SETRESUID]) m4trace:configure.ac:63: -1- m4_pattern_allow([^HAVE_SETRESUID$]) m4trace:configure.ac:76: -1- AH_OUTPUT([HAVE_PTY_H], [/* Define to 1 if you have the header file. */ @%:@undef HAVE_PTY_H]) m4trace:configure.ac:76: -1- AC_DEFINE_TRACE_LITERAL([HAVE_PTY_H]) m4trace:configure.ac:76: -1- m4_pattern_allow([^HAVE_PTY_H$]) m4trace:configure.ac:76: -1- AH_OUTPUT([HAVE_UTIL_H], [/* Define to 1 if you have the header file. */ @%:@undef HAVE_UTIL_H]) m4trace:configure.ac:76: -1- AC_DEFINE_TRACE_LITERAL([HAVE_UTIL_H]) m4trace:configure.ac:76: -1- m4_pattern_allow([^HAVE_UTIL_H$]) m4trace:configure.ac:76: -1- AH_OUTPUT([HAVE_LIBUTIL_H], [/* Define to 1 if you have the header file. */ @%:@undef HAVE_LIBUTIL_H]) m4trace:configure.ac:76: -1- AC_DEFINE_TRACE_LITERAL([HAVE_LIBUTIL_H]) m4trace:configure.ac:76: -1- m4_pattern_allow([^HAVE_LIBUTIL_H$]) m4trace:configure.ac:77: -1- AC_DEFINE_TRACE_LITERAL([HAVE_OPENPTY]) m4trace:configure.ac:77: -1- m4_pattern_allow([^HAVE_OPENPTY$]) m4trace:configure.ac:89: -1- AH_OUTPUT([HAVE_LANGINFO_H], [/* Define to 1 if you have the header file. */ @%:@undef HAVE_LANGINFO_H]) m4trace:configure.ac:89: -1- AC_DEFINE_TRACE_LITERAL([HAVE_LANGINFO_H]) m4trace:configure.ac:89: -1- m4_pattern_allow([^HAVE_LANGINFO_H$]) m4trace:configure.ac:92: -1- AH_OUTPUT([HAVE_DIRENT_H], [/* Define to 1 if you have the header file. */ @%:@undef HAVE_DIRENT_H]) m4trace:configure.ac:92: -1- AC_DEFINE_TRACE_LITERAL([HAVE_DIRENT_H]) m4trace:configure.ac:92: -1- m4_pattern_allow([^HAVE_DIRENT_H$]) m4trace:configure.ac:134: -1- AC_DEFINE_TRACE_LITERAL([ENABLE_PAM]) m4trace:configure.ac:134: -1- m4_pattern_allow([^ENABLE_PAM$]) m4trace:configure.ac:148: -1- AH_OUTPUT([HAVE_UTMPX_H], [/* Define to 1 if you have the header file. */ @%:@undef HAVE_UTMPX_H]) m4trace:configure.ac:148: -1- AC_DEFINE_TRACE_LITERAL([HAVE_UTMPX_H]) m4trace:configure.ac:148: -1- m4_pattern_allow([^HAVE_UTMPX_H$]) m4trace:configure.ac:148: -1- AC_DEFINE_TRACE_LITERAL([HAVE_UTEMPTER]) m4trace:configure.ac:148: -1- m4_pattern_allow([^HAVE_UTEMPTER$]) m4trace:configure.ac:148: -1- AC_DEFINE_TRACE_LITERAL([HAVE_UT_HOST]) m4trace:configure.ac:148: -1- m4_pattern_allow([^HAVE_UT_HOST$]) m4trace:configure.ac:148: -1- AC_DEFINE_TRACE_LITERAL([HAVE_UT_EXIT]) m4trace:configure.ac:148: -1- m4_pattern_allow([^HAVE_UT_EXIT$]) m4trace:configure.ac:148: -1- AC_DEFINE_TRACE_LITERAL([ENABLE_UTMP]) m4trace:configure.ac:148: -1- m4_pattern_allow([^ENABLE_UTMP$]) m4trace:configure.ac:178: -1- AC_DEFINE_TRACE_LITERAL([ENABLE_TELNET]) m4trace:configure.ac:178: -1- m4_pattern_allow([^ENABLE_TELNET$]) m4trace:configure.ac:184: -1- AC_DEFINE_TRACE_LITERAL([SOCKET_DIR]) m4trace:configure.ac:184: -1- m4_pattern_allow([^SOCKET_DIR$]) m4trace:configure.ac:192: -1- AC_DEFINE_TRACE_LITERAL([SYSTEM_SCREENRC]) m4trace:configure.ac:192: -1- m4_pattern_allow([^SYSTEM_SCREENRC$]) m4trace:configure.ac:195: -1- AC_DEFINE_TRACE_LITERAL([PTY_MODE]) m4trace:configure.ac:195: -1- m4_pattern_allow([^PTY_MODE$]) m4trace:configure.ac:198: -1- AC_DEFINE_TRACE_LITERAL([PTY_GROUP]) m4trace:configure.ac:198: -1- m4_pattern_allow([^PTY_GROUP$]) m4trace:configure.ac:201: -1- AC_DEFINE_TRACE_LITERAL([PTY_ROFS]) m4trace:configure.ac:201: -1- m4_pattern_allow([^PTY_ROFS$]) m4trace:configure.ac:209: -1- AC_CONFIG_FILES([Makefile doc/Makefile]) m4trace:configure.ac:210: -1- AC_SUBST([LIB@&t@OBJS], [$ac_libobjs]) m4trace:configure.ac:210: -1- AC_SUBST_TRACE([LIB@&t@OBJS]) m4trace:configure.ac:210: -1- m4_pattern_allow([^LIB@&t@OBJS$]) m4trace:configure.ac:210: -1- AC_SUBST([LTLIBOBJS], [$ac_ltlibobjs]) m4trace:configure.ac:210: -1- AC_SUBST_TRACE([LTLIBOBJS]) m4trace:configure.ac:210: -1- m4_pattern_allow([^LTLIBOBJS$]) m4trace:configure.ac:210: -1- AC_SUBST_TRACE([top_builddir]) m4trace:configure.ac:210: -1- AC_SUBST_TRACE([top_build_prefix]) m4trace:configure.ac:210: -1- AC_SUBST_TRACE([srcdir]) m4trace:configure.ac:210: -1- AC_SUBST_TRACE([abs_srcdir]) m4trace:configure.ac:210: -1- AC_SUBST_TRACE([top_srcdir]) m4trace:configure.ac:210: -1- AC_SUBST_TRACE([abs_top_srcdir]) m4trace:configure.ac:210: -1- AC_SUBST_TRACE([builddir]) m4trace:configure.ac:210: -1- AC_SUBST_TRACE([abs_builddir]) m4trace:configure.ac:210: -1- AC_SUBST_TRACE([abs_top_builddir]) m4trace:configure.ac:210: -1- AC_SUBST_TRACE([INSTALL]) screen-5.0.2/autom4te.cache/output.20000664000175000017500000054303115224432734015706 0ustar alexalex@%:@! /bin/sh @%:@ Guess values for system-dependent variables and create Makefiles. @%:@ Generated by GNU Autoconf 2.72 for GNU Screen 5.0.2. @%:@ @%:@ Report bugs to . @%:@ @%:@ @%:@ Copyright (C) 1992-1996, 1998-2017, 2020-2023 Free Software Foundation, @%:@ Inc. @%:@ @%:@ @%:@ This configure script is free software; the Free Software Foundation @%:@ gives unlimited permission to copy, distribute and modify it. ## -------------------- ## ## M4sh Initialization. ## ## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test ${ZSH_VERSION+y} && (emulate sh) >/dev/null 2>&1 then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case e in @%:@( e) case `(set -o) 2>/dev/null` in @%:@( *posix*) : set -o posix ;; @%:@( *) : ;; esac ;; esac fi # Reset variables that may have inherited troublesome values from # the environment. # IFS needs to be set, to space, tab, and newline, in precisely that order. # (If _AS_PATH_WALK were called with IFS unset, it would have the # side effect of setting IFS to empty, thus disabling word splitting.) # Quoting is to prevent editors from complaining about space-tab. as_nl=' ' export as_nl IFS=" "" $as_nl" PS1='$ ' PS2='> ' PS4='+ ' # Ensure predictable behavior from utilities with locale-dependent output. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # We cannot yet rely on "unset" to work, but we need these variables # to be unset--not just set to an empty or harmless value--now, to # avoid bugs in old shells (e.g. pre-3.0 UWIN ksh). This construct # also avoids known problems related to "unset" and subshell syntax # in other old shells (e.g. bash 2.01 and pdksh 5.2.14). for as_var in BASH_ENV ENV MAIL MAILPATH CDPATH do eval test \${$as_var+y} \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done # Ensure that fds 0, 1, and 2 are open. if (exec 3>&0) 2>/dev/null; then :; else exec 0&1) 2>/dev/null; then :; else exec 1>/dev/null; fi if (exec 3>&2) ; then :; else exec 2>/dev/null; fi # The user is always right. if ${PATH_SEPARATOR+false} :; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # Find who we are. Look in the path if we contain no directory separator. as_myself= case $0 in @%:@(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in @%:@((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac test -r "$as_dir$0" && as_myself=$as_dir$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as 'sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then printf "%s\n" "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # Use a proper internal environment variable to ensure we don't fall # into an infinite loop, continuously re-executing ourselves. if test x"${_as_can_reexec}" != xno && test "x$CONFIG_SHELL" != x; then _as_can_reexec=no; export _as_can_reexec; # We cannot yet assume a decent shell, so we have to provide a # neutralization value for shells without unset; and this also # works around shells that cannot unset nonexistent variables. # Preserve -v and -x to the replacement shell. BASH_ENV=/dev/null ENV=/dev/null (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV case $- in @%:@ (((( *v*x* | *x*v* ) as_opts=-vx ;; *v* ) as_opts=-v ;; *x* ) as_opts=-x ;; * ) as_opts= ;; esac exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} # Admittedly, this is quite paranoid, since all the known shells bail # out after a failed 'exec'. printf "%s\n" "$0: could not re-execute with $CONFIG_SHELL" >&2 exit 255 fi # We don't want this to propagate to other subprocesses. { _as_can_reexec=; unset _as_can_reexec;} if test "x$CONFIG_SHELL" = x; then as_bourne_compatible="if test \${ZSH_VERSION+y} && (emulate sh) >/dev/null 2>&1 then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which # is contrary to our usage. Disable this feature. alias -g '\${1+\"\$@\"}'='\"\$@\"' setopt NO_GLOB_SUBST else case e in @%:@( e) case \`(set -o) 2>/dev/null\` in @%:@( *posix*) : set -o posix ;; @%:@( *) : ;; esac ;; esac fi " as_required="as_fn_return () { (exit \$1); } as_fn_success () { as_fn_return 0; } as_fn_failure () { as_fn_return 1; } as_fn_ret_success () { return 0; } as_fn_ret_failure () { return 1; } exitcode=0 as_fn_success || { exitcode=1; echo as_fn_success failed.; } as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; } as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; } as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; } if ( set x; as_fn_ret_success y && test x = \"\$1\" ) then : else case e in @%:@( e) exitcode=1; echo positional parameters were not saved. ;; esac fi test x\$exitcode = x0 || exit 1 blah=\$(echo \$(echo blah)) test x\"\$blah\" = xblah || exit 1 test -x / || exit 1" as_suggested=" as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" && test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1" if (eval "$as_required") 2>/dev/null then : as_have_required=yes else case e in @%:@( e) as_have_required=no ;; esac fi if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null then : else case e in @%:@( e) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR as_found=false for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH do IFS=$as_save_IFS case $as_dir in @%:@((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac as_found=: case $as_dir in @%:@( /*) for as_base in sh bash ksh sh5; do # Try only shells that exist, to save several forks. as_shell=$as_dir$as_base if { test -f "$as_shell" || test -f "$as_shell.exe"; } && as_run=a "$as_shell" -c "$as_bourne_compatible""$as_required" 2>/dev/null then : CONFIG_SHELL=$as_shell as_have_required=yes if as_run=a "$as_shell" -c "$as_bourne_compatible""$as_suggested" 2>/dev/null then : break 2 fi fi done;; esac as_found=false done IFS=$as_save_IFS if $as_found then : else case e in @%:@( e) if { test -f "$SHELL" || test -f "$SHELL.exe"; } && as_run=a "$SHELL" -c "$as_bourne_compatible""$as_required" 2>/dev/null then : CONFIG_SHELL=$SHELL as_have_required=yes fi ;; esac fi if test "x$CONFIG_SHELL" != x then : export CONFIG_SHELL # We cannot yet assume a decent shell, so we have to provide a # neutralization value for shells without unset; and this also # works around shells that cannot unset nonexistent variables. # Preserve -v and -x to the replacement shell. BASH_ENV=/dev/null ENV=/dev/null (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV case $- in @%:@ (((( *v*x* | *x*v* ) as_opts=-vx ;; *v* ) as_opts=-v ;; *x* ) as_opts=-x ;; * ) as_opts= ;; esac exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} # Admittedly, this is quite paranoid, since all the known shells bail # out after a failed 'exec'. printf "%s\n" "$0: could not re-execute with $CONFIG_SHELL" >&2 exit 255 fi if test x$as_have_required = xno then : printf "%s\n" "$0: This script requires a shell more modern than all" printf "%s\n" "$0: the shells that I found on your system." if test ${ZSH_VERSION+y} ; then printf "%s\n" "$0: In particular, zsh $ZSH_VERSION has bugs and should" printf "%s\n" "$0: be upgraded to zsh 4.3.4 or later." else printf "%s\n" "$0: Please tell bug-autoconf@gnu.org and $0: https://savannah.gnu.org/bugs/?group=screen about your $0: system, including any error possibly output before this $0: message. Then install a modern shell, or manually run $0: the script under such a shell if you do have one." fi exit 1 fi ;; esac fi fi SHELL=${CONFIG_SHELL-/bin/sh} export SHELL # Unset more variables known to interfere with behavior of common tools. CLICOLOR_FORCE= GREP_OPTIONS= unset CLICOLOR_FORCE GREP_OPTIONS ## --------------------- ## ## M4sh Shell Functions. ## ## --------------------- ## @%:@ as_fn_unset VAR @%:@ --------------- @%:@ Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset @%:@ as_fn_set_status STATUS @%:@ ----------------------- @%:@ Set @S|@? to STATUS, without forking. as_fn_set_status () { return $1 } @%:@ as_fn_set_status @%:@ as_fn_exit STATUS @%:@ ----------------- @%:@ Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } @%:@ as_fn_exit @%:@ as_fn_mkdir_p @%:@ ------------- @%:@ Create "@S|@as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`printf "%s\n" "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || printf "%s\n" X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" } @%:@ as_fn_mkdir_p @%:@ as_fn_executable_p FILE @%:@ ----------------------- @%:@ Test if FILE is an executable regular file. as_fn_executable_p () { test -f "$1" && test -x "$1" } @%:@ as_fn_executable_p @%:@ as_fn_append VAR VALUE @%:@ ---------------------- @%:@ Append the text in VALUE to the end of the definition contained in VAR. Take @%:@ advantage of any shell optimizations that allow amortized linear growth over @%:@ repeated appends, instead of the typical quadratic growth present in naive @%:@ implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null then : eval 'as_fn_append () { eval $1+=\$2 }' else case e in @%:@( e) as_fn_append () { eval $1=\$$1\$2 } ;; esac fi # as_fn_append @%:@ as_fn_arith ARG... @%:@ ------------------ @%:@ Perform arithmetic evaluation on the ARGs, and store the result in the @%:@ global @S|@as_val. Take advantage of shells that can avoid forks. The arguments @%:@ must be portable across @S|@(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null then : eval 'as_fn_arith () { as_val=$(( $* )) }' else case e in @%:@( e) as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } ;; esac fi # as_fn_arith @%:@ as_fn_error STATUS ERROR [LINENO LOG_FD] @%:@ ---------------------------------------- @%:@ Output "`basename @S|@0`: error: ERROR" to stderr. If LINENO and LOG_FD are @%:@ provided, also output the error to LOG_FD, referencing LINENO. Then exit the @%:@ script with STATUS, using 1 if that was 0. as_fn_error () { as_status=$1; test $as_status -eq 0 && as_status=1 if test "$4"; then as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi printf "%s\n" "$as_me: error: $2" >&2 as_fn_exit $as_status } @%:@ as_fn_error if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || printf "%s\n" X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits as_lineno_1=$LINENO as_lineno_1a=$LINENO as_lineno_2=$LINENO as_lineno_2a=$LINENO eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" && test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || { # Blame Lee E. McMahon (1931-1989) for sed's syntax. :-) sed -n ' p /[$]LINENO/= ' <$as_myself | sed ' t clear :clear s/[$]LINENO.*/&-/ t lineno b :lineno N :loop s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/ t loop s/-\n.*// ' >$as_me.lineno && chmod +x "$as_me.lineno" || { printf "%s\n" "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; } # If we had to re-execute with $CONFIG_SHELL, we're ensured to have # already done that, so ensure we don't try to do so again and fall # in an infinite loop. This has already happened in practice. _as_can_reexec=no; export _as_can_reexec # Don't try to exec as it changes $[0], causing all sort of problems # (the dirname of $[0] is not the place where we might find the # original and so on. Autoconf is especially sensitive to this). . "./$as_me.lineno" # Exit status is that of the last command. exit } # Determine whether it's possible to make 'echo' print without a newline. # These variables are no longer used directly by Autoconf, but are AC_SUBSTed # for compatibility with existing Makefiles. ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in @%:@((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac # For backward compatibility with old third-party macros, we provide # the shell variables $as_echo and $as_echo_n. New code should use # AS_ECHO(["message"]) and AS_ECHO_N(["message"]), respectively. as_@&t@echo='printf %s\n' as_@&t@echo_n='printf %s' rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both 'ln -s file dir' and 'ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; 'ln -s' creates a wrapper executable. # In both cases, we have to default to 'cp -pR'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -pR' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -pR' fi else as_ln_s='cp -pR' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null if mkdir -p . 2>/dev/null; then as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi as_test_x='test -x' as_executable_p=as_fn_executable_p # Sed expression to map a string onto a valid CPP name. as_sed_cpp="y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g" as_tr_cpp="eval sed '$as_sed_cpp'" # deprecated # Sed expression to map a string onto a valid variable name. as_sed_sh="y%*+%pp%;s%[^_$as_cr_alnum]%_%g" as_tr_sh="eval sed '$as_sed_sh'" # deprecated test -n "$DJDIR" || exec 7<&0 &1 # Name of the host. # hostname on some systems (SVR3.2, old GNU/Linux) returns a bogus exit status, # so uname gets run too. ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` # # Initializations. # ac_default_prefix=/usr/local ac_clean_files= ac_config_libobj_dir=. LIB@&t@OBJS= cross_compiling=no subdirs= MFLAGS= MAKEFLAGS= # Identity of this package. PACKAGE_NAME='GNU Screen' PACKAGE_TARNAME='screen' PACKAGE_VERSION='5.0.2' PACKAGE_STRING='GNU Screen 5.0.2' PACKAGE_BUGREPORT='https://savannah.gnu.org/bugs/?group=screen' PACKAGE_URL='https://www.gnu.org/software/screen/' # Factoring default headers for most tests. ac_includes_default="\ #include #ifdef HAVE_STDIO_H # include #endif #ifdef HAVE_STDLIB_H # include #endif #ifdef HAVE_STRING_H # include #endif #ifdef HAVE_INTTYPES_H # include #endif #ifdef HAVE_STDINT_H # include #endif #ifdef HAVE_STRINGS_H # include #endif #ifdef HAVE_SYS_TYPES_H # include #endif #ifdef HAVE_SYS_STAT_H # include #endif #ifdef HAVE_UNISTD_H # include #endif" ac_header_c_list= ac_subst_vars='LTLIBOBJS LIB@&t@OBJS INSTALL_DATA INSTALL_SCRIPT INSTALL_PROGRAM AWK OBJEXT EXEEXT ac_ct_CC CPPFLAGS LDFLAGS CFLAGS CC target_alias host_alias build_alias LIBS ECHO_T ECHO_N ECHO_C DEFS mandir localedir libdir psdir pdfdir dvidir htmldir infodir docdir oldincludedir includedir runstatedir localstatedir sharedstatedir sysconfdir datadir datarootdir libexecdir sbindir bindir program_transform_name prefix exec_prefix PACKAGE_URL PACKAGE_BUGREPORT PACKAGE_STRING PACKAGE_VERSION PACKAGE_TARNAME PACKAGE_NAME PATH_SEPARATOR SHELL' ac_subst_files='' ac_user_opts=' enable_option_checking enable_pam enable_utmp enable_telnet enable_socket_dir with_system_screenrc with_pty_mode with_pty_group with_pty_rofs ' ac_precious_vars='build_alias host_alias target_alias CC CFLAGS LDFLAGS LIBS CPPFLAGS' # Initialize some variables set by options. ac_init_help= ac_init_version=false ac_unrecognized_opts= ac_unrecognized_sep= # The variables have the same names as the options, with # dashes changed to underlines. cache_file=/dev/null exec_prefix=NONE no_create= no_recursion= prefix=NONE program_prefix=NONE program_suffix=NONE program_transform_name=s,x,x, silent= site= srcdir= verbose= x_includes=NONE x_libraries=NONE # Installation directory options. # These are left unexpanded so users can "make install exec_prefix=/foo" # and all the variables that are supposed to be based on exec_prefix # by default will actually change. # Use braces instead of parens because sh, perl, etc. also accept them. # (The list follows the same order as the GNU Coding Standards.) bindir='${exec_prefix}/bin' sbindir='${exec_prefix}/sbin' libexecdir='${exec_prefix}/libexec' datarootdir='${prefix}/share' datadir='${datarootdir}' sysconfdir='${prefix}/etc' sharedstatedir='${prefix}/com' localstatedir='${prefix}/var' runstatedir='${localstatedir}/run' includedir='${prefix}/include' oldincludedir='/usr/include' docdir='${datarootdir}/doc/${PACKAGE_TARNAME}' infodir='${datarootdir}/info' htmldir='${docdir}' dvidir='${docdir}' pdfdir='${docdir}' psdir='${docdir}' libdir='${exec_prefix}/lib' localedir='${datarootdir}/locale' mandir='${datarootdir}/man' ac_prev= ac_dashdash= for ac_option do # If the previous option needs an argument, assign it. if test -n "$ac_prev"; then eval $ac_prev=\$ac_option ac_prev= continue fi case $ac_option in *=?*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;; *=) ac_optarg= ;; *) ac_optarg=yes ;; esac case $ac_dashdash$ac_option in --) ac_dashdash=yes ;; -bindir | --bindir | --bindi | --bind | --bin | --bi) ac_prev=bindir ;; -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) bindir=$ac_optarg ;; -build | --build | --buil | --bui | --bu) ac_prev=build_alias ;; -build=* | --build=* | --buil=* | --bui=* | --bu=*) build_alias=$ac_optarg ;; -cache-file | --cache-file | --cache-fil | --cache-fi \ | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) ac_prev=cache_file ;; -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) cache_file=$ac_optarg ;; --config-cache | -C) cache_file=config.cache ;; -datadir | --datadir | --datadi | --datad) ac_prev=datadir ;; -datadir=* | --datadir=* | --datadi=* | --datad=*) datadir=$ac_optarg ;; -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \ | --dataroo | --dataro | --datar) ac_prev=datarootdir ;; -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \ | --dataroot=* | --dataroo=* | --dataro=* | --datar=*) datarootdir=$ac_optarg ;; -disable-* | --disable-*) ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid feature name: '$ac_useropt'" ac_useropt_orig=$ac_useropt ac_useropt=`printf "%s\n" "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval enable_$ac_useropt=no ;; -docdir | --docdir | --docdi | --doc | --do) ac_prev=docdir ;; -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*) docdir=$ac_optarg ;; -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv) ac_prev=dvidir ;; -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*) dvidir=$ac_optarg ;; -enable-* | --enable-*) ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid feature name: '$ac_useropt'" ac_useropt_orig=$ac_useropt ac_useropt=`printf "%s\n" "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval enable_$ac_useropt=\$ac_optarg ;; -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ | --exec | --exe | --ex) ac_prev=exec_prefix ;; -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ | --exec=* | --exe=* | --ex=*) exec_prefix=$ac_optarg ;; -gas | --gas | --ga | --g) # Obsolete; use --with-gas. with_gas=yes ;; -help | --help | --hel | --he | -h) ac_init_help=long ;; -help=r* | --help=r* | --hel=r* | --he=r* | -hr*) ac_init_help=recursive ;; -help=s* | --help=s* | --hel=s* | --he=s* | -hs*) ac_init_help=short ;; -host | --host | --hos | --ho) ac_prev=host_alias ;; -host=* | --host=* | --hos=* | --ho=*) host_alias=$ac_optarg ;; -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht) ac_prev=htmldir ;; -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \ | --ht=*) htmldir=$ac_optarg ;; -includedir | --includedir | --includedi | --included | --include \ | --includ | --inclu | --incl | --inc) ac_prev=includedir ;; -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ | --includ=* | --inclu=* | --incl=* | --inc=*) includedir=$ac_optarg ;; -infodir | --infodir | --infodi | --infod | --info | --inf) ac_prev=infodir ;; -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) infodir=$ac_optarg ;; -libdir | --libdir | --libdi | --libd) ac_prev=libdir ;; -libdir=* | --libdir=* | --libdi=* | --libd=*) libdir=$ac_optarg ;; -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ | --libexe | --libex | --libe) ac_prev=libexecdir ;; -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ | --libexe=* | --libex=* | --libe=*) libexecdir=$ac_optarg ;; -localedir | --localedir | --localedi | --localed | --locale) ac_prev=localedir ;; -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*) localedir=$ac_optarg ;; -localstatedir | --localstatedir | --localstatedi | --localstated \ | --localstate | --localstat | --localsta | --localst | --locals) ac_prev=localstatedir ;; -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*) localstatedir=$ac_optarg ;; -mandir | --mandir | --mandi | --mand | --man | --ma | --m) ac_prev=mandir ;; -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) mandir=$ac_optarg ;; -nfp | --nfp | --nf) # Obsolete; use --without-fp. with_fp=no ;; -no-create | --no-create | --no-creat | --no-crea | --no-cre \ | --no-cr | --no-c | -n) no_create=yes ;; -no-recursion | --no-recursion | --no-recursio | --no-recursi \ | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) no_recursion=yes ;; -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ | --oldin | --oldi | --old | --ol | --o) ac_prev=oldincludedir ;; -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) oldincludedir=$ac_optarg ;; -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) ac_prev=prefix ;; -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) prefix=$ac_optarg ;; -program-prefix | --program-prefix | --program-prefi | --program-pref \ | --program-pre | --program-pr | --program-p) ac_prev=program_prefix ;; -program-prefix=* | --program-prefix=* | --program-prefi=* \ | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) program_prefix=$ac_optarg ;; -program-suffix | --program-suffix | --program-suffi | --program-suff \ | --program-suf | --program-su | --program-s) ac_prev=program_suffix ;; -program-suffix=* | --program-suffix=* | --program-suffi=* \ | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) program_suffix=$ac_optarg ;; -program-transform-name | --program-transform-name \ | --program-transform-nam | --program-transform-na \ | --program-transform-n | --program-transform- \ | --program-transform | --program-transfor \ | --program-transfo | --program-transf \ | --program-trans | --program-tran \ | --progr-tra | --program-tr | --program-t) ac_prev=program_transform_name ;; -program-transform-name=* | --program-transform-name=* \ | --program-transform-nam=* | --program-transform-na=* \ | --program-transform-n=* | --program-transform-=* \ | --program-transform=* | --program-transfor=* \ | --program-transfo=* | --program-transf=* \ | --program-trans=* | --program-tran=* \ | --progr-tra=* | --program-tr=* | --program-t=*) program_transform_name=$ac_optarg ;; -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd) ac_prev=pdfdir ;; -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*) pdfdir=$ac_optarg ;; -psdir | --psdir | --psdi | --psd | --ps) ac_prev=psdir ;; -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*) psdir=$ac_optarg ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) silent=yes ;; -runstatedir | --runstatedir | --runstatedi | --runstated \ | --runstate | --runstat | --runsta | --runst | --runs \ | --run | --ru | --r) ac_prev=runstatedir ;; -runstatedir=* | --runstatedir=* | --runstatedi=* | --runstated=* \ | --runstate=* | --runstat=* | --runsta=* | --runst=* | --runs=* \ | --run=* | --ru=* | --r=*) runstatedir=$ac_optarg ;; -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) ac_prev=sbindir ;; -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ | --sbi=* | --sb=*) sbindir=$ac_optarg ;; -sharedstatedir | --sharedstatedir | --sharedstatedi \ | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ | --sharedst | --shareds | --shared | --share | --shar \ | --sha | --sh) ac_prev=sharedstatedir ;; -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ | --sha=* | --sh=*) sharedstatedir=$ac_optarg ;; -site | --site | --sit) ac_prev=site ;; -site=* | --site=* | --sit=*) site=$ac_optarg ;; -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) ac_prev=srcdir ;; -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) srcdir=$ac_optarg ;; -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ | --syscon | --sysco | --sysc | --sys | --sy) ac_prev=sysconfdir ;; -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) sysconfdir=$ac_optarg ;; -target | --target | --targe | --targ | --tar | --ta | --t) ac_prev=target_alias ;; -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) target_alias=$ac_optarg ;; -v | -verbose | --verbose | --verbos | --verbo | --verb) verbose=yes ;; -version | --version | --versio | --versi | --vers | -V) ac_init_version=: ;; -with-* | --with-*) ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid package name: '$ac_useropt'" ac_useropt_orig=$ac_useropt ac_useropt=`printf "%s\n" "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval with_$ac_useropt=\$ac_optarg ;; -without-* | --without-*) ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid package name: '$ac_useropt'" ac_useropt_orig=$ac_useropt ac_useropt=`printf "%s\n" "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval with_$ac_useropt=no ;; --x) # Obsolete; use --with-x. with_x=yes ;; -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ | --x-incl | --x-inc | --x-in | --x-i) ac_prev=x_includes ;; -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) x_includes=$ac_optarg ;; -x-libraries | --x-libraries | --x-librarie | --x-librari \ | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) ac_prev=x_libraries ;; -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) x_libraries=$ac_optarg ;; -*) as_fn_error $? "unrecognized option: '$ac_option' Try '$0 --help' for more information" ;; *=*) ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` # Reject names that are not valid shell variable names. case $ac_envvar in #( '' | [0-9]* | *[!_$as_cr_alnum]* ) as_fn_error $? "invalid variable name: '$ac_envvar'" ;; esac eval $ac_envvar=\$ac_optarg export $ac_envvar ;; *) # FIXME: should be removed in autoconf 3.0. printf "%s\n" "$as_me: WARNING: you should use --build, --host, --target" >&2 expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && printf "%s\n" "$as_me: WARNING: invalid host type: $ac_option" >&2 : "${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}" ;; esac done if test -n "$ac_prev"; then ac_option=--`echo $ac_prev | sed 's/_/-/g'` as_fn_error $? "missing argument to $ac_option" fi if test -n "$ac_unrecognized_opts"; then case $enable_option_checking in no) ;; fatal) as_fn_error $? "unrecognized options: $ac_unrecognized_opts" ;; *) printf "%s\n" "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;; esac fi # Check all directory arguments for consistency. for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \ datadir sysconfdir sharedstatedir localstatedir includedir \ oldincludedir docdir infodir htmldir dvidir pdfdir psdir \ libdir localedir mandir runstatedir do eval ac_val=\$$ac_var # Remove trailing slashes. case $ac_val in */ ) ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'` eval $ac_var=\$ac_val;; esac # Be sure to have absolute directory names. case $ac_val in [\\/$]* | ?:[\\/]* ) continue;; NONE | '' ) case $ac_var in *prefix ) continue;; esac;; esac as_fn_error $? "expected an absolute directory name for --$ac_var: $ac_val" done # There might be people who depend on the old broken behavior: '$host' # used to hold the argument of --host etc. # FIXME: To remove some day. build=$build_alias host=$host_alias target=$target_alias # FIXME: To remove some day. if test "x$host_alias" != x; then if test "x$build_alias" = x; then cross_compiling=maybe elif test "x$build_alias" != "x$host_alias"; then cross_compiling=yes fi fi ac_tool_prefix= test -n "$host_alias" && ac_tool_prefix=$host_alias- test "$silent" = yes && exec 6>/dev/null ac_pwd=`pwd` && test -n "$ac_pwd" && ac_ls_di=`ls -di .` && ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` || as_fn_error $? "working directory cannot be determined" test "X$ac_ls_di" = "X$ac_pwd_ls_di" || as_fn_error $? "pwd does not report name of working directory" # Find the source files, if location was not specified. if test -z "$srcdir"; then ac_srcdir_defaulted=yes # Try the directory containing this script, then the parent directory. ac_confdir=`$as_dirname -- "$as_myself" || $as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_myself" : 'X\(//\)[^/]' \| \ X"$as_myself" : 'X\(//\)$' \| \ X"$as_myself" : 'X\(/\)' \| . 2>/dev/null || printf "%s\n" X"$as_myself" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` srcdir=$ac_confdir if test ! -r "$srcdir/$ac_unique_file"; then srcdir=.. fi else ac_srcdir_defaulted=no fi if test ! -r "$srcdir/$ac_unique_file"; then test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .." as_fn_error $? "cannot find sources ($ac_unique_file) in $srcdir" fi ac_msg="sources are in $srcdir, but 'cd $srcdir' does not work" ac_abs_confdir=`( cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error $? "$ac_msg" pwd)` # When building in place, set srcdir=. if test "$ac_abs_confdir" = "$ac_pwd"; then srcdir=. fi # Remove unnecessary trailing slashes from srcdir. # Double slashes in file names in object file debugging info # mess up M-x gdb in Emacs. case $srcdir in */) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;; esac for ac_var in $ac_precious_vars; do eval ac_env_${ac_var}_set=\${${ac_var}+set} eval ac_env_${ac_var}_value=\$${ac_var} eval ac_cv_env_${ac_var}_set=\${${ac_var}+set} eval ac_cv_env_${ac_var}_value=\$${ac_var} done # # Report the --help message. # 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 GNU Screen 5.0.2 to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... To assign environment variables (e.g., CC, CFLAGS...), specify them as VAR=VALUE. See below for descriptions of some of the useful variables. Defaults for the options are specified in brackets. Configuration: -h, --help display this help and exit --help=short display options specific to this package --help=recursive display the short help of all the included packages -V, --version display version information and exit -q, --quiet, --silent do not print 'checking ...' messages --cache-file=FILE cache test results in FILE [disabled] -C, --config-cache alias for '--cache-file=config.cache' -n, --no-create do not create output files --srcdir=DIR find the sources in DIR [configure dir or '..'] Installation directories: --prefix=PREFIX install architecture-independent files in PREFIX @<:@@S|@ac_default_prefix@:>@ --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX @<:@PREFIX@:>@ By default, 'make install' will install all the files in '$ac_default_prefix/bin', '$ac_default_prefix/lib' etc. You can specify an installation prefix other than '$ac_default_prefix' using '--prefix', for instance '--prefix=\$HOME'. For better control, use the options below. Fine tuning of the installation directories: --bindir=DIR user executables [EPREFIX/bin] --sbindir=DIR system admin executables [EPREFIX/sbin] --libexecdir=DIR program executables [EPREFIX/libexec] --sysconfdir=DIR read-only single-machine data [PREFIX/etc] --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] --localstatedir=DIR modifiable single-machine data [PREFIX/var] --runstatedir=DIR modifiable per-process data [LOCALSTATEDIR/run] --libdir=DIR object code libraries [EPREFIX/lib] --includedir=DIR C header files [PREFIX/include] --oldincludedir=DIR C header files for non-gcc [/usr/include] --datarootdir=DIR read-only arch.-independent data root [PREFIX/share] --datadir=DIR read-only architecture-independent data [DATAROOTDIR] --infodir=DIR info documentation [DATAROOTDIR/info] --localedir=DIR locale-dependent data [DATAROOTDIR/locale] --mandir=DIR man documentation [DATAROOTDIR/man] --docdir=DIR documentation root @<:@DATAROOTDIR/doc/screen@:>@ --htmldir=DIR html documentation [DOCDIR] --dvidir=DIR dvi documentation [DOCDIR] --pdfdir=DIR pdf documentation [DOCDIR] --psdir=DIR ps documentation [DOCDIR] _ACEOF cat <<\_ACEOF _ACEOF fi if test -n "$ac_init_help"; then case $ac_init_help in short | recursive ) echo "Configuration of GNU Screen 5.0.2:";; esac cat <<\_ACEOF Optional Features: --disable-option-checking ignore unrecognized --enable/--with options --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) --enable-FEATURE[=ARG] include FEATURE [ARG=yes] --enable-pam enable PAM support (default: enabled) --enable-utmp enable utmp support (default: disabled) --enable-telnet enable telnet support (default: disabled) --enable-socket-dir enable global socket directory (default: disabled) Optional Packages: --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) --with-system_screenrc set location of system screenrc (default: /etc/screenrc) --with-pty-mode set pty mode (default: 0620) --with-pty-group set pty group (default: 5) --with-pty-rofs set rofs handling (default: no) Some influential environment variables: CC C compiler command CFLAGS C compiler flags LDFLAGS linker flags, e.g. -L if you have libraries in a nonstandard directory LIBS libraries to pass to the linker, e.g. -l CPPFLAGS (Objective) C/C++ preprocessor flags, e.g. -I if you have headers in a nonstandard directory Use these variables to override the choices made by 'configure' or to help it to find libraries and programs with nonstandard names/locations. Report bugs to . GNU Screen home page: . General help using GNU software: . _ACEOF ac_status=$? fi if test "$ac_init_help" = "recursive"; then # If there are subdirs, report their specific --help. for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue test -d "$ac_dir" || { cd "$srcdir" && ac_pwd=`pwd` && srcdir=. && test -d "$ac_dir"; } || continue ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`printf "%s\n" "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`printf "%s\n" "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix cd "$ac_dir" || { ac_status=$?; continue; } # Check for configure.gnu first; this name is used for a wrapper for # Metaconfig's "Configure" on case-insensitive file systems. if test -f "$ac_srcdir/configure.gnu"; then echo && $SHELL "$ac_srcdir/configure.gnu" --help=recursive elif test -f "$ac_srcdir/configure"; then echo && $SHELL "$ac_srcdir/configure" --help=recursive else printf "%s\n" "$as_me: WARNING: no configuration information is in $ac_dir" >&2 fi || ac_status=$? cd "$ac_pwd" || { ac_status=$?; break; } done fi test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF GNU Screen configure 5.0.2 generated by GNU Autoconf 2.72 Copyright (C) 2023 Free Software Foundation, Inc. This configure script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it. _ACEOF exit fi ## ------------------------ ## ## Autoconf initialization. ## ## ------------------------ ## @%:@ ac_fn_c_try_compile LINENO @%:@ -------------------------- @%:@ Try to compile conftest.@S|@ac_ext, and return whether this succeeded. ac_fn_c_try_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext conftest.beam if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" printf "%s\n" "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext then : ac_retval=0 else case e in @%:@( e) printf "%s\n" "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 ;; esac fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } @%:@ ac_fn_c_try_compile @%:@ ac_fn_c_check_header_compile LINENO HEADER VAR INCLUDES @%:@ ------------------------------------------------------- @%:@ Tests whether HEADER exists and can be compiled using the include files in @%:@ INCLUDES, setting the cache variable VAR accordingly. ac_fn_c_check_header_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 printf %s "checking for $2... " >&6; } if eval test \${$3+y} then : printf %s "(cached) " >&6 else case e in @%:@( e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 @%:@include <$2> _ACEOF if ac_fn_c_try_compile "$LINENO" then : eval "$3=yes" else case e in @%:@( e) eval "$3=no" ;; esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ;; esac fi eval ac_res=\$$3 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 printf "%s\n" "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } @%:@ ac_fn_c_check_header_compile @%:@ ac_fn_c_try_link LINENO @%:@ ----------------------- @%:@ Try to link conftest.@S|@ac_ext, and return whether this succeeded. ac_fn_c_try_link () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext conftest.beam conftest$ac_exeext if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" printf "%s\n" "$ac_try_echo"; } >&5 (eval "$ac_link") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && { test "$cross_compiling" = yes || test -x conftest$ac_exeext } then : ac_retval=0 else case e in @%:@( e) printf "%s\n" "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 ;; esac fi # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would # interfere with the next link command; also delete a directory that is # left behind by Apple's compiler. We do this before executing the actions. rm -rf conftest.dSYM conftest_ipa8_conftest.oo eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } @%:@ ac_fn_c_try_link @%:@ ac_fn_c_check_func LINENO FUNC VAR @%:@ ---------------------------------- @%:@ Tests whether FUNC exists, setting the cache variable VAR accordingly ac_fn_c_check_func () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 printf %s "checking for $2... " >&6; } if eval test \${$3+y} then : printf %s "(cached) " >&6 else case e in @%:@( e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Define $2 to an innocuous variant, in case declares $2. For example, HP-UX 11i declares gettimeofday. */ #define $2 innocuous_$2 /* System header to define __stub macros and hopefully few prototypes, which can conflict with char $2 (void); below. */ #include #undef $2 /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char $2 (void); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ #if defined __stub_$2 || defined __stub___$2 choke me #endif int main (void) { return $2 (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO" then : eval "$3=yes" else case e in @%:@( e) eval "$3=no" ;; esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext ;; esac fi eval ac_res=\$$3 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 printf "%s\n" "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } @%:@ ac_fn_c_check_func ac_configure_args_raw= for ac_arg do case $ac_arg in *\'*) ac_arg=`printf "%s\n" "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; esac as_fn_append ac_configure_args_raw " '$ac_arg'" done case $ac_configure_args_raw in *$as_nl*) ac_safe_unquote= ;; *) ac_unsafe_z='|&;<>()$`\\"*?@<:@ '' ' # This string ends in space, tab. ac_unsafe_a="$ac_unsafe_z#~" ac_safe_unquote="s/ '\\([^$ac_unsafe_a][^$ac_unsafe_z]*\\)'/ \\1/g" ac_configure_args_raw=` printf "%s\n" "$ac_configure_args_raw" | sed "$ac_safe_unquote"`;; esac 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 GNU Screen $as_me 5.0.2, which was generated by GNU Autoconf 2.72. Invocation command line was $ $0$ac_configure_args_raw _ACEOF exec 5>>config.log { cat <<_ASUNAME ## --------- ## ## Platform. ## ## --------- ## hostname = `(hostname || uname -n) 2>/dev/null | sed 1q` uname -m = `(uname -m) 2>/dev/null || echo unknown` uname -r = `(uname -r) 2>/dev/null || echo unknown` uname -s = `(uname -s) 2>/dev/null || echo unknown` uname -v = `(uname -v) 2>/dev/null || echo unknown` /usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown` /bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown` /bin/arch = `(/bin/arch) 2>/dev/null || echo unknown` /usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown` /usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown` /usr/bin/hostinfo = `(/usr/bin/hostinfo) 2>/dev/null || echo unknown` /bin/machine = `(/bin/machine) 2>/dev/null || echo unknown` /usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown` /bin/universe = `(/bin/universe) 2>/dev/null || echo unknown` _ASUNAME as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in @%:@((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac printf "%s\n" "PATH: $as_dir" done IFS=$as_save_IFS } >&5 cat >&5 <<_ACEOF ## ----------- ## ## Core tests. ## ## ----------- ## _ACEOF # Keep a trace of the command line. # Strip out --no-create and --no-recursion so they do not pile up. # Strip out --silent because we don't want to record it for future runs. # Also quote any args containing shell meta-characters. # Make two passes to allow for proper duplicate-argument suppression. ac_configure_args= ac_configure_args0= ac_configure_args1= ac_must_keep_next=false for ac_pass in 1 2 do for ac_arg do case $ac_arg in -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) continue ;; *\'*) ac_arg=`printf "%s\n" "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; esac case $ac_pass in 1) as_fn_append ac_configure_args0 " '$ac_arg'" ;; 2) as_fn_append ac_configure_args1 " '$ac_arg'" if test $ac_must_keep_next = true; then ac_must_keep_next=false # Got value, back to normal. else case $ac_arg in *=* | --config-cache | -C | -disable-* | --disable-* \ | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \ | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \ | -with-* | --with-* | -without-* | --without-* | --x) case "$ac_configure_args0 " in "$ac_configure_args1"*" '$ac_arg' "* ) continue ;; esac ;; -* ) ac_must_keep_next=true ;; esac fi as_fn_append ac_configure_args " '$ac_arg'" ;; esac done done { ac_configure_args0=; unset ac_configure_args0;} { ac_configure_args1=; unset ac_configure_args1;} # When interrupted or exit'd, cleanup temporary files, and complete # config.log. We remove comments because anyway the quotes in there # would cause problems or look ugly. # WARNING: Use '\'' to represent an apostrophe within the trap. # WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug. trap 'exit_status=$? # Sanitize IFS. IFS=" "" $as_nl" # Save into config.log some information that might help in debugging. { echo printf "%s\n" "## ---------------- ## ## Cache variables. ## ## ---------------- ##" echo # The following way of writing the cache mishandles newlines in values, ( for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 printf "%s\n" "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #( *${as_nl}ac_space=\ *) sed -n \ "s/'\''/'\''\\\\'\'''\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p" ;; #( *) sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) echo printf "%s\n" "## ----------------- ## ## Output variables. ## ## ----------------- ##" echo for ac_var in $ac_subst_vars do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`printf "%s\n" "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac printf "%s\n" "$ac_var='\''$ac_val'\''" done | sort echo if test -n "$ac_subst_files"; then printf "%s\n" "## ------------------- ## ## File substitutions. ## ## ------------------- ##" echo for ac_var in $ac_subst_files do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`printf "%s\n" "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac printf "%s\n" "$ac_var='\''$ac_val'\''" done | sort echo fi if test -s confdefs.h; then printf "%s\n" "## ----------- ## ## confdefs.h. ## ## ----------- ##" echo cat confdefs.h echo fi test "$ac_signal" != 0 && printf "%s\n" "$as_me: caught signal $ac_signal" printf "%s\n" "$as_me: exit $exit_status" } >&5 rm -f core *.core core.conftest.* && rm -f -r conftest* confdefs* conf$$* $ac_clean_files && exit $exit_status ' 0 for ac_signal in 1 2 13 15; do trap 'ac_signal='$ac_signal'; as_fn_exit 1' $ac_signal done ac_signal=0 # confdefs.h avoids OS command line length limits that DEFS can exceed. rm -f -r conftest* confdefs.h printf "%s\n" "/* confdefs.h */" > confdefs.h # Predefined preprocessor variables. printf "%s\n" "@%:@define PACKAGE_NAME \"$PACKAGE_NAME\"" >>confdefs.h printf "%s\n" "@%:@define PACKAGE_TARNAME \"$PACKAGE_TARNAME\"" >>confdefs.h printf "%s\n" "@%:@define PACKAGE_VERSION \"$PACKAGE_VERSION\"" >>confdefs.h printf "%s\n" "@%:@define PACKAGE_STRING \"$PACKAGE_STRING\"" >>confdefs.h printf "%s\n" "@%:@define PACKAGE_BUGREPORT \"$PACKAGE_BUGREPORT\"" >>confdefs.h printf "%s\n" "@%:@define PACKAGE_URL \"$PACKAGE_URL\"" >>confdefs.h # Let the site file select an alternate cache file if it wants to. # Prefer an explicitly selected file to automatically selected ones. if test -n "$CONFIG_SITE"; then ac_site_files="$CONFIG_SITE" elif test "x$prefix" != xNONE; then ac_site_files="$prefix/share/config.site $prefix/etc/config.site" else ac_site_files="$ac_default_prefix/share/config.site $ac_default_prefix/etc/config.site" fi for ac_site_file in $ac_site_files do case $ac_site_file in @%:@( */*) : ;; @%:@( *) : ac_site_file=./$ac_site_file ;; esac if test -f "$ac_site_file" && test -r "$ac_site_file"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5 printf "%s\n" "$as_me: loading site script $ac_site_file" >&6;} sed 's/^/| /' "$ac_site_file" >&5 . "$ac_site_file" \ || { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in '$ac_pwd':" >&5 printf "%s\n" "$as_me: error: in '$ac_pwd':" >&2;} as_fn_error $? "failed to load site script $ac_site_file See 'config.log' for more details" "$LINENO" 5; } fi done if test -r "$cache_file"; then # Some versions of bash will fail to source /dev/null (special files # actually), so we avoid doing that. DJGPP emulates it as a regular file. if test /dev/null != "$cache_file" && test -f "$cache_file"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5 printf "%s\n" "$as_me: loading cache $cache_file" >&6;} case $cache_file in [\\/]* | ?:[\\/]* ) . "$cache_file";; *) . "./$cache_file";; esac fi else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5 printf "%s\n" "$as_me: creating cache $cache_file" >&6;} >$cache_file fi as_fn_append ac_header_c_list " stdio.h stdio_h HAVE_STDIO_H" # Test code for whether the C compiler supports C89 (global declarations) ac_c_conftest_c89_globals=' /* Does the compiler advertise C89 conformance? Do not test the value of __STDC__, because some compilers set it to 0 while being otherwise adequately conformant. */ #if !defined __STDC__ # error "Compiler does not advertise C89 conformance" #endif #include #include struct stat; /* Most of the following tests are stolen from RCS 5.7 src/conf.sh. */ struct buf { int x; }; struct buf * (*rcsopen) (struct buf *, struct stat *, int); static char *e (char **p, int i) { return p[i]; } static char *f (char * (*g) (char **, int), char **p, ...) { char *s; va_list v; va_start (v,p); s = g (p, va_arg (v,int)); va_end (v); return s; } /* C89 style stringification. */ #define noexpand_stringify(a) #a const char *stringified = noexpand_stringify(arbitrary+token=sequence); /* C89 style token pasting. Exercises some of the corner cases that e.g. old MSVC gets wrong, but not very hard. */ #define noexpand_concat(a,b) a##b #define expand_concat(a,b) noexpand_concat(a,b) extern int vA; extern int vbee; #define aye A #define bee B int *pvA = &expand_concat(v,aye); int *pvbee = &noexpand_concat(v,bee); /* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has function prototypes and stuff, but not \xHH hex character constants. These do not provoke an error unfortunately, instead are silently treated as an "x". The following induces an error, until -std is added to get proper ANSI mode. Curiously \x00 != x always comes out true, for an array size at least. It is necessary to write \x00 == 0 to get something that is true only with -std. */ int osf4_cc_array ['\''\x00'\'' == 0 ? 1 : -1]; /* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters inside strings and character constants. */ #define FOO(x) '\''x'\'' int xlc6_cc_array[FOO(a) == '\''x'\'' ? 1 : -1]; int test (int i, double x); struct s1 {int (*f) (int a);}; struct s2 {int (*f) (double a);}; int pairnames (int, char **, int *(*)(struct buf *, struct stat *, int), int, int);' # Test code for whether the C compiler supports C89 (body of main). ac_c_conftest_c89_main=' ok |= (argc == 0 || f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]); ' # Test code for whether the C compiler supports C99 (global declarations) ac_c_conftest_c99_globals=' /* Does the compiler advertise C99 conformance? */ #if !defined __STDC_VERSION__ || __STDC_VERSION__ < 199901L # error "Compiler does not advertise C99 conformance" #endif // See if C++-style comments work. #include extern int puts (const char *); extern int printf (const char *, ...); extern int dprintf (int, const char *, ...); extern void *malloc (size_t); extern void free (void *); // Check varargs macros. These examples are taken from C99 6.10.3.5. // dprintf is used instead of fprintf to avoid needing to declare // FILE and stderr. #define debug(...) dprintf (2, __VA_ARGS__) #define showlist(...) puts (#__VA_ARGS__) #define report(test,...) ((test) ? puts (#test) : printf (__VA_ARGS__)) static void test_varargs_macros (void) { int x = 1234; int y = 5678; debug ("Flag"); debug ("X = %d\n", x); showlist (The first, second, and third items.); report (x>y, "x is %d but y is %d", x, y); } // Check long long types. #define BIG64 18446744073709551615ull #define BIG32 4294967295ul #define BIG_OK (BIG64 / BIG32 == 4294967297ull && BIG64 % BIG32 == 0) #if !BIG_OK #error "your preprocessor is broken" #endif #if BIG_OK #else #error "your preprocessor is broken" #endif static long long int bignum = -9223372036854775807LL; static unsigned long long int ubignum = BIG64; struct incomplete_array { int datasize; double data[]; }; struct named_init { int number; const wchar_t *name; double average; }; typedef const char *ccp; static inline int test_restrict (ccp restrict text) { // Iterate through items via the restricted pointer. // Also check for declarations in for loops. for (unsigned int i = 0; *(text+i) != '\''\0'\''; ++i) continue; return 0; } // Check varargs and va_copy. static bool test_varargs (const char *format, ...) { va_list args; va_start (args, format); va_list args_copy; va_copy (args_copy, args); const char *str = ""; int number = 0; float fnumber = 0; while (*format) { switch (*format++) { case '\''s'\'': // string str = va_arg (args_copy, const char *); break; case '\''d'\'': // int number = va_arg (args_copy, int); break; case '\''f'\'': // float fnumber = va_arg (args_copy, double); break; default: break; } } va_end (args_copy); va_end (args); return *str && number && fnumber; } ' # Test code for whether the C compiler supports C99 (body of main). ac_c_conftest_c99_main=' // Check bool. _Bool success = false; success |= (argc != 0); // Check restrict. if (test_restrict ("String literal") == 0) success = true; char *restrict newvar = "Another string"; // Check varargs. success &= test_varargs ("s, d'\'' f .", "string", 65, 34.234); test_varargs_macros (); // Check flexible array members. struct incomplete_array *ia = malloc (sizeof (struct incomplete_array) + (sizeof (double) * 10)); ia->datasize = 10; for (int i = 0; i < ia->datasize; ++i) ia->data[i] = i * 1.234; // Work around memory leak warnings. free (ia); // Check named initializers. struct named_init ni = { .number = 34, .name = L"Test wide string", .average = 543.34343, }; ni.number = 58; int dynamic_array[ni.number]; dynamic_array[0] = argv[0][0]; dynamic_array[ni.number - 1] = 543; // work around unused variable warnings ok |= (!success || bignum == 0LL || ubignum == 0uLL || newvar[0] == '\''x'\'' || dynamic_array[ni.number - 1] != 543); ' # Test code for whether the C compiler supports C11 (global declarations) ac_c_conftest_c11_globals=' /* Does the compiler advertise C11 conformance? */ #if !defined __STDC_VERSION__ || __STDC_VERSION__ < 201112L # error "Compiler does not advertise C11 conformance" #endif // Check _Alignas. char _Alignas (double) aligned_as_double; char _Alignas (0) no_special_alignment; extern char aligned_as_int; char _Alignas (0) _Alignas (int) aligned_as_int; // Check _Alignof. enum { int_alignment = _Alignof (int), int_array_alignment = _Alignof (int[100]), char_alignment = _Alignof (char) }; _Static_assert (0 < -_Alignof (int), "_Alignof is signed"); // Check _Noreturn. int _Noreturn does_not_return (void) { for (;;) continue; } // Check _Static_assert. struct test_static_assert { int x; _Static_assert (sizeof (int) <= sizeof (long int), "_Static_assert does not work in struct"); long int y; }; // Check UTF-8 literals. #define u8 syntax error! char const utf8_literal[] = u8"happens to be ASCII" "another string"; // Check duplicate typedefs. typedef long *long_ptr; typedef long int *long_ptr; typedef long_ptr long_ptr; // Anonymous structures and unions -- taken from C11 6.7.2.1 Example 1. struct anonymous { union { struct { int i; int j; }; struct { int k; long int l; } w; }; int m; } v1; ' # Test code for whether the C compiler supports C11 (body of main). ac_c_conftest_c11_main=' _Static_assert ((offsetof (struct anonymous, i) == offsetof (struct anonymous, w.k)), "Anonymous union alignment botch"); v1.i = 2; v1.w.k = 5; ok |= v1.i != 5; ' # Test code for whether the C compiler supports C11 (complete). ac_c_conftest_c11_program="${ac_c_conftest_c89_globals} ${ac_c_conftest_c99_globals} ${ac_c_conftest_c11_globals} int main (int argc, char **argv) { int ok = 0; ${ac_c_conftest_c89_main} ${ac_c_conftest_c99_main} ${ac_c_conftest_c11_main} return ok; } " # Test code for whether the C compiler supports C99 (complete). ac_c_conftest_c99_program="${ac_c_conftest_c89_globals} ${ac_c_conftest_c99_globals} int main (int argc, char **argv) { int ok = 0; ${ac_c_conftest_c89_main} ${ac_c_conftest_c99_main} return ok; } " # Test code for whether the C compiler supports C89 (complete). ac_c_conftest_c89_program="${ac_c_conftest_c89_globals} int main (int argc, char **argv) { int ok = 0; ${ac_c_conftest_c89_main} return ok; } " as_fn_append ac_header_c_list " stdlib.h stdlib_h HAVE_STDLIB_H" as_fn_append ac_header_c_list " string.h string_h HAVE_STRING_H" as_fn_append ac_header_c_list " inttypes.h inttypes_h HAVE_INTTYPES_H" as_fn_append ac_header_c_list " stdint.h stdint_h HAVE_STDINT_H" as_fn_append ac_header_c_list " strings.h strings_h HAVE_STRINGS_H" as_fn_append ac_header_c_list " sys/stat.h sys_stat_h HAVE_SYS_STAT_H" as_fn_append ac_header_c_list " sys/types.h sys_types_h HAVE_SYS_TYPES_H" as_fn_append ac_header_c_list " unistd.h unistd_h HAVE_UNISTD_H" as_fn_append ac_header_c_list " wchar.h wchar_h HAVE_WCHAR_H" as_fn_append ac_header_c_list " minix/config.h minix_config_h HAVE_MINIX_CONFIG_H" # Auxiliary files required by this configure script. ac_aux_files="install-sh" # Locations in which to look for auxiliary files. ac_aux_dir_candidates="${srcdir}${PATH_SEPARATOR}${srcdir}/..${PATH_SEPARATOR}${srcdir}/../.." # Search for a directory containing all of the required auxiliary files, # $ac_aux_files, from the $PATH-style list $ac_aux_dir_candidates. # If we don't find one directory that contains all the files we need, # we report the set of missing files from the *first* directory in # $ac_aux_dir_candidates and give up. ac_missing_aux_files="" ac_first_candidate=: printf "%s\n" "$as_me:${as_lineno-$LINENO}: looking for aux files: $ac_aux_files" >&5 as_save_IFS=$IFS; IFS=$PATH_SEPARATOR as_found=false for as_dir in $ac_aux_dir_candidates do IFS=$as_save_IFS case $as_dir in @%:@((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac as_found=: printf "%s\n" "$as_me:${as_lineno-$LINENO}: trying $as_dir" >&5 ac_aux_dir_found=yes ac_install_sh= for ac_aux in $ac_aux_files do # As a special case, if "install-sh" is required, that requirement # can be satisfied by any of "install-sh", "install.sh", or "shtool", # and $ac_install_sh is set appropriately for whichever one is found. if test x"$ac_aux" = x"install-sh" then if test -f "${as_dir}install-sh"; then printf "%s\n" "$as_me:${as_lineno-$LINENO}: ${as_dir}install-sh found" >&5 ac_install_sh="${as_dir}install-sh -c" elif test -f "${as_dir}install.sh"; then printf "%s\n" "$as_me:${as_lineno-$LINENO}: ${as_dir}install.sh found" >&5 ac_install_sh="${as_dir}install.sh -c" elif test -f "${as_dir}shtool"; then printf "%s\n" "$as_me:${as_lineno-$LINENO}: ${as_dir}shtool found" >&5 ac_install_sh="${as_dir}shtool install -c" else ac_aux_dir_found=no if $ac_first_candidate; then ac_missing_aux_files="${ac_missing_aux_files} install-sh" else break fi fi else if test -f "${as_dir}${ac_aux}"; then printf "%s\n" "$as_me:${as_lineno-$LINENO}: ${as_dir}${ac_aux} found" >&5 else ac_aux_dir_found=no if $ac_first_candidate; then ac_missing_aux_files="${ac_missing_aux_files} ${ac_aux}" else break fi fi fi done if test "$ac_aux_dir_found" = yes; then ac_aux_dir="$as_dir" break fi ac_first_candidate=false as_found=false done IFS=$as_save_IFS if $as_found then : else case e in @%:@( e) as_fn_error $? "cannot find required auxiliary files:$ac_missing_aux_files" "$LINENO" 5 ;; esac fi # These three variables are undocumented and unsupported, # and are intended to be withdrawn in a future Autoconf release. # They can cause serious problems if a builder's source tree is in a directory # whose full name contains unusual characters. if test -f "${ac_aux_dir}config.guess"; then ac_@&t@config_guess="$SHELL ${ac_aux_dir}config.guess" fi if test -f "${ac_aux_dir}config.sub"; then ac_@&t@config_sub="$SHELL ${ac_aux_dir}config.sub" fi if test -f "$ac_aux_dir/configure"; then ac_@&t@configure="$SHELL ${ac_aux_dir}configure" fi # Check that the precious variables saved in the cache have kept the same # value. ac_cache_corrupted=false for ac_var in $ac_precious_vars; do eval ac_old_set=\$ac_cv_env_${ac_var}_set eval ac_new_set=\$ac_env_${ac_var}_set eval ac_old_val=\$ac_cv_env_${ac_var}_value eval ac_new_val=\$ac_env_${ac_var}_value case $ac_old_set,$ac_new_set in set,) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: '$ac_var' was set to '$ac_old_val' in the previous run" >&5 printf "%s\n" "$as_me: error: '$ac_var' was set to '$ac_old_val' in the previous run" >&2;} ac_cache_corrupted=: ;; ,set) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: '$ac_var' was not set in the previous run" >&5 printf "%s\n" "$as_me: error: '$ac_var' was not set in the previous run" >&2;} ac_cache_corrupted=: ;; ,);; *) if test "x$ac_old_val" != "x$ac_new_val"; then # differences in whitespace do not lead to failure. ac_old_val_w=`echo x $ac_old_val` ac_new_val_w=`echo x $ac_new_val` if test "$ac_old_val_w" != "$ac_new_val_w"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: '$ac_var' has changed since the previous run:" >&5 printf "%s\n" "$as_me: error: '$ac_var' has changed since the previous run:" >&2;} ac_cache_corrupted=: else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in '$ac_var' since the previous run:" >&5 printf "%s\n" "$as_me: warning: ignoring whitespace changes in '$ac_var' since the previous run:" >&2;} eval $ac_var=\$ac_old_val fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: former value: '$ac_old_val'" >&5 printf "%s\n" "$as_me: former value: '$ac_old_val'" >&2;} { printf "%s\n" "$as_me:${as_lineno-$LINENO}: current value: '$ac_new_val'" >&5 printf "%s\n" "$as_me: current value: '$ac_new_val'" >&2;} fi;; esac # Pass precious variables to config.status. if test "$ac_new_set" = set; then case $ac_new_val in *\'*) ac_arg=$ac_var=`printf "%s\n" "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;; *) ac_arg=$ac_var=$ac_new_val ;; esac case " $ac_configure_args " in *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy. *) as_fn_append ac_configure_args " '$ac_arg'" ;; esac fi done if $ac_cache_corrupted; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in '$ac_pwd':" >&5 printf "%s\n" "$as_me: error: in '$ac_pwd':" >&2;} { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5 printf "%s\n" "$as_me: error: changes in the environment can compromise the build" >&2;} as_fn_error $? "run '${MAKE-make} distclean' and/or 'rm $cache_file' and start over" "$LINENO" 5 fi ## -------------------- ## ## Main body of script. ## ## -------------------- ## ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu ac_config_headers="$ac_config_headers config.h" cat >>confdefs.h <<_ACEOF @%:@define VERSION_MAJOR `echo $PACKAGE_VERSION | cut -d . -f 1` _ACEOF cat >>confdefs.h <<_ACEOF @%:@define VERSION_MINOR `echo $PACKAGE_VERSION | cut -d . -f 2 | cut -d - -f 1` _ACEOF cat >>confdefs.h <<_ACEOF @%:@define VERSION_REVISION `echo $PACKAGE_VERSION | cut -d . -f 3 | cut -d - -f 1` _ACEOF ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. set dummy ${ac_tool_prefix}gcc; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_CC+y} then : printf %s "(cached) " >&6 else case e in @%:@( e) if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in @%:@((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}gcc" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi ;; esac fi CC=$ac_cv_prog_CC if test -n "$CC"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 printf "%s\n" "$CC" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi fi if test -z "$ac_cv_prog_CC"; then ac_ct_CC=$CC # Extract the first word of "gcc", so it can be a program name with args. set dummy gcc; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_ac_ct_CC+y} then : printf %s "(cached) " >&6 else case e in @%:@( e) if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in @%:@((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="gcc" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi ;; esac fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 printf "%s\n" "$ac_ct_CC" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi else CC="$ac_cv_prog_CC" fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. set dummy ${ac_tool_prefix}cc; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_CC+y} then : printf %s "(cached) " >&6 else case e in @%:@( e) if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in @%:@((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}cc" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi ;; esac fi CC=$ac_cv_prog_CC if test -n "$CC"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 printf "%s\n" "$CC" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi fi fi if test -z "$CC"; then # Extract the first word of "cc", so it can be a program name with args. set dummy cc; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_CC+y} then : printf %s "(cached) " >&6 else case e in @%:@( e) if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else ac_prog_rejected=no as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in @%:@((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then if test "$as_dir$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then ac_prog_rejected=yes continue fi ac_cv_prog_CC="cc" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS if test $ac_prog_rejected = yes; then # We found a bogon in the path, so make sure we never use it. set dummy $ac_cv_prog_CC shift if test $@%:@ != 0; then # We chose a different compiler from the bogus one. # However, it has the same basename, so the bogon will be chosen # first if we set CC to just the basename; use the full file name. shift ac_cv_prog_CC="$as_dir$ac_word${1+' '}$@" fi fi fi ;; esac fi CC=$ac_cv_prog_CC if test -n "$CC"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 printf "%s\n" "$CC" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then for ac_prog in cl.exe do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_CC+y} then : printf %s "(cached) " >&6 else case e in @%:@( e) if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in @%:@((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_CC="$ac_tool_prefix$ac_prog" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi ;; esac fi CC=$ac_cv_prog_CC if test -n "$CC"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 printf "%s\n" "$CC" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi test -n "$CC" && break done fi if test -z "$CC"; then ac_ct_CC=$CC for ac_prog in cl.exe do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_ac_ct_CC+y} then : printf %s "(cached) " >&6 else case e in @%:@( e) if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in @%:@((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="$ac_prog" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi ;; esac fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 printf "%s\n" "$ac_ct_CC" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi test -n "$ac_ct_CC" && break done if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi fi fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}clang", so it can be a program name with args. set dummy ${ac_tool_prefix}clang; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_CC+y} then : printf %s "(cached) " >&6 else case e in @%:@( e) if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in @%:@((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}clang" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi ;; esac fi CC=$ac_cv_prog_CC if test -n "$CC"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 printf "%s\n" "$CC" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi fi if test -z "$ac_cv_prog_CC"; then ac_ct_CC=$CC # Extract the first word of "clang", so it can be a program name with args. set dummy clang; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_ac_ct_CC+y} then : printf %s "(cached) " >&6 else case e in @%:@( e) if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in @%:@((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="clang" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi ;; esac fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 printf "%s\n" "$ac_ct_CC" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi else CC="$ac_cv_prog_CC" fi fi test -z "$CC" && { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in '$ac_pwd':" >&5 printf "%s\n" "$as_me: error: in '$ac_pwd':" >&2;} as_fn_error $? "no acceptable C compiler found in \$PATH See 'config.log' for more details" "$LINENO" 5; } # Provide some information about the compiler. printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5 set X $ac_compile ac_compiler=$2 for ac_option in --version -v -V -qversion -version; do { { ac_try="$ac_compiler $ac_option >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" printf "%s\n" "$ac_try_echo"; } >&5 (eval "$ac_compiler $ac_option >&5") 2>conftest.err ac_status=$? if test -s conftest.err; then sed '10a\ ... rest of stderr output deleted ... 10q' conftest.err >conftest.er1 cat conftest.er1 >&5 fi rm -f conftest.er1 conftest.err printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } done cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main (void) { ; return 0; } _ACEOF ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out" # Try to create an executable without -o first, disregard a.out. # It will help us diagnose broken compilers, and finding out an intuition # of exeext. { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the C compiler works" >&5 printf %s "checking whether the C compiler works... " >&6; } ac_link_default=`printf "%s\n" "$ac_link" | sed 's/ -o *conftest[^ ]*//'` # The possible output files: ac_files="a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*" ac_rmfiles= for ac_file in $ac_files do case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; * ) ac_rmfiles="$ac_rmfiles $ac_file";; esac done rm -f $ac_rmfiles if { { ac_try="$ac_link_default" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" printf "%s\n" "$ac_try_echo"; } >&5 (eval "$ac_link_default") 2>&5 ac_status=$? printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } then : # Autoconf-2.13 could set the ac_cv_exeext variable to 'no'. # So ignore a value of 'no', otherwise this would lead to 'EXEEXT = no' # in a Makefile. We should not override ac_cv_exeext if it was cached, # so that the user can short-circuit this test for compilers unknown to # Autoconf. for ac_file in $ac_files '' do test -f "$ac_file" || continue case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; [ab].out ) # We found the default executable, but exeext='' is most # certainly right. break;; *.* ) if test ${ac_cv_exeext+y} && test "$ac_cv_exeext" != no; then :; else ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` fi # We set ac_cv_exeext here because the later test for it is not # safe: cross compilers may not add the suffix if given an '-o' # argument, so we may need to know it at that point already. # Even if this section looks crufty: it has the advantage of # actually working. break;; * ) break;; esac done test "$ac_cv_exeext" = no && ac_cv_exeext= else case e in @%:@( e) ac_file='' ;; esac fi if test -z "$ac_file" then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } printf "%s\n" "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in '$ac_pwd':" >&5 printf "%s\n" "$as_me: error: in '$ac_pwd':" >&2;} as_fn_error 77 "C compiler cannot create executables See 'config.log' for more details" "$LINENO" 5; } else case e in @%:@( e) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 printf "%s\n" "yes" >&6; } ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for C compiler default output file name" >&5 printf %s "checking for C compiler default output file name... " >&6; } { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5 printf "%s\n" "$ac_file" >&6; } ac_exeext=$ac_cv_exeext rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out ac_clean_files=$ac_clean_files_save { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5 printf %s "checking for suffix of executables... " >&6; } if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" printf "%s\n" "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } then : # If both 'conftest.exe' and 'conftest' are 'present' (well, observable) # catch 'conftest.exe'. For instance with Cygwin, 'ls conftest' will # work properly (i.e., refer to 'conftest.exe'), while it won't with # 'rm'. for ac_file in conftest.exe conftest conftest.*; do test -f "$ac_file" || continue case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` break;; * ) break;; esac done else case e in @%:@( e) { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in '$ac_pwd':" >&5 printf "%s\n" "$as_me: error: in '$ac_pwd':" >&2;} as_fn_error $? "cannot compute suffix of executables: cannot compile and link See 'config.log' for more details" "$LINENO" 5; } ;; esac fi rm -f conftest conftest$ac_cv_exeext { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5 printf "%s\n" "$ac_cv_exeext" >&6; } rm -f conftest.$ac_ext EXEEXT=$ac_cv_exeext ac_exeext=$EXEEXT cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ @%:@include int main (void) { FILE *f = fopen ("conftest.out", "w"); if (!f) return 1; return ferror (f) || fclose (f) != 0; ; return 0; } _ACEOF ac_clean_files="$ac_clean_files conftest.out" # Check that the compiler produces executables we can run. If not, either # the compiler is broken, or we cross compile. { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5 printf %s "checking whether we are cross compiling... " >&6; } if test "$cross_compiling" != yes; then { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" printf "%s\n" "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } if { ac_try='./conftest$ac_cv_exeext' { { case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" printf "%s\n" "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; }; then cross_compiling=no else if test "$cross_compiling" = maybe; then cross_compiling=yes else { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in '$ac_pwd':" >&5 printf "%s\n" "$as_me: error: in '$ac_pwd':" >&2;} as_fn_error 77 "cannot run C compiled programs. If you meant to cross compile, use '--host'. See 'config.log' for more details" "$LINENO" 5; } fi fi fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5 printf "%s\n" "$cross_compiling" >&6; } rm -f conftest.$ac_ext conftest$ac_cv_exeext \ conftest.o conftest.obj conftest.out ac_clean_files=$ac_clean_files_save { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5 printf %s "checking for suffix of object files... " >&6; } if test ${ac_cv_objext+y} then : printf %s "(cached) " >&6 else case e in @%:@( e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main (void) { ; return 0; } _ACEOF rm -f conftest.o conftest.obj if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" printf "%s\n" "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>&5 ac_status=$? printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } then : for ac_file in conftest.o conftest.obj conftest.*; do test -f "$ac_file" || continue; case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM ) ;; *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'` break;; esac done else case e in @%:@( e) printf "%s\n" "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in '$ac_pwd':" >&5 printf "%s\n" "$as_me: error: in '$ac_pwd':" >&2;} as_fn_error $? "cannot compute suffix of object files: cannot compile See 'config.log' for more details" "$LINENO" 5; } ;; esac fi rm -f conftest.$ac_cv_objext conftest.$ac_ext ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5 printf "%s\n" "$ac_cv_objext" >&6; } OBJEXT=$ac_cv_objext ac_objext=$OBJEXT { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the compiler supports GNU C" >&5 printf %s "checking whether the compiler supports GNU C... " >&6; } if test ${ac_cv_c_compiler_gnu+y} then : printf %s "(cached) " >&6 else case e in @%:@( e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main (void) { #ifndef __GNUC__ choke me #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : ac_compiler_gnu=yes else case e in @%:@( e) ac_compiler_gnu=no ;; esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ac_cv_c_compiler_gnu=$ac_compiler_gnu ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5 printf "%s\n" "$ac_cv_c_compiler_gnu" >&6; } ac_compiler_gnu=$ac_cv_c_compiler_gnu if test $ac_compiler_gnu = yes; then GCC=yes else GCC= fi ac_test_CFLAGS=${CFLAGS+y} ac_save_CFLAGS=$CFLAGS { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5 printf %s "checking whether $CC accepts -g... " >&6; } if test ${ac_cv_prog_cc_g+y} then : printf %s "(cached) " >&6 else case e in @%:@( e) ac_save_c_werror_flag=$ac_c_werror_flag ac_c_werror_flag=yes ac_cv_prog_cc_g=no CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main (void) { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : ac_cv_prog_cc_g=yes else case e in @%:@( e) CFLAGS="" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main (void) { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : else case e in @%:@( e) ac_c_werror_flag=$ac_save_c_werror_flag CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main (void) { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : ac_cv_prog_cc_g=yes fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ;; esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ;; esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ac_c_werror_flag=$ac_save_c_werror_flag ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5 printf "%s\n" "$ac_cv_prog_cc_g" >&6; } if test $ac_test_CFLAGS; then CFLAGS=$ac_save_CFLAGS elif test $ac_cv_prog_cc_g = yes; then if test "$GCC" = yes; then CFLAGS="-g -O2" else CFLAGS="-g" fi else if test "$GCC" = yes; then CFLAGS="-O2" else CFLAGS= fi fi ac_prog_cc_stdc=no if test x$ac_prog_cc_stdc = xno then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $CC option to enable C11 features" >&5 printf %s "checking for $CC option to enable C11 features... " >&6; } if test ${ac_cv_prog_cc_c11+y} then : printf %s "(cached) " >&6 else case e in @%:@( e) ac_cv_prog_cc_c11=no ac_save_CC=$CC cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_c_conftest_c11_program _ACEOF for ac_arg in '' -std=gnu11 do CC="$ac_save_CC $ac_arg" if ac_fn_c_try_compile "$LINENO" then : ac_cv_prog_cc_c11=$ac_arg fi rm -f core conftest.err conftest.$ac_objext conftest.beam test "x$ac_cv_prog_cc_c11" != "xno" && break done rm -f conftest.$ac_ext CC=$ac_save_CC ;; esac fi if test "x$ac_cv_prog_cc_c11" = xno then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 printf "%s\n" "unsupported" >&6; } else case e in @%:@( e) if test "x$ac_cv_prog_cc_c11" = x then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 printf "%s\n" "none needed" >&6; } else case e in @%:@( e) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c11" >&5 printf "%s\n" "$ac_cv_prog_cc_c11" >&6; } CC="$CC $ac_cv_prog_cc_c11" ;; esac fi ac_cv_prog_cc_stdc=$ac_cv_prog_cc_c11 ac_prog_cc_stdc=c11 ;; esac fi fi if test x$ac_prog_cc_stdc = xno then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $CC option to enable C99 features" >&5 printf %s "checking for $CC option to enable C99 features... " >&6; } if test ${ac_cv_prog_cc_c99+y} then : printf %s "(cached) " >&6 else case e in @%:@( e) ac_cv_prog_cc_c99=no ac_save_CC=$CC cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_c_conftest_c99_program _ACEOF for ac_arg in '' -std=gnu99 -std=c99 -c99 -qlanglvl=extc1x -qlanglvl=extc99 -AC99 -D_STDC_C99= do CC="$ac_save_CC $ac_arg" if ac_fn_c_try_compile "$LINENO" then : ac_cv_prog_cc_c99=$ac_arg fi rm -f core conftest.err conftest.$ac_objext conftest.beam test "x$ac_cv_prog_cc_c99" != "xno" && break done rm -f conftest.$ac_ext CC=$ac_save_CC ;; esac fi if test "x$ac_cv_prog_cc_c99" = xno then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 printf "%s\n" "unsupported" >&6; } else case e in @%:@( e) if test "x$ac_cv_prog_cc_c99" = x then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 printf "%s\n" "none needed" >&6; } else case e in @%:@( e) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c99" >&5 printf "%s\n" "$ac_cv_prog_cc_c99" >&6; } CC="$CC $ac_cv_prog_cc_c99" ;; esac fi ac_cv_prog_cc_stdc=$ac_cv_prog_cc_c99 ac_prog_cc_stdc=c99 ;; esac fi fi if test x$ac_prog_cc_stdc = xno then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $CC option to enable C89 features" >&5 printf %s "checking for $CC option to enable C89 features... " >&6; } if test ${ac_cv_prog_cc_c89+y} then : printf %s "(cached) " >&6 else case e in @%:@( e) ac_cv_prog_cc_c89=no ac_save_CC=$CC cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_c_conftest_c89_program _ACEOF for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" do CC="$ac_save_CC $ac_arg" if ac_fn_c_try_compile "$LINENO" then : ac_cv_prog_cc_c89=$ac_arg fi rm -f core conftest.err conftest.$ac_objext conftest.beam test "x$ac_cv_prog_cc_c89" != "xno" && break done rm -f conftest.$ac_ext CC=$ac_save_CC ;; esac fi if test "x$ac_cv_prog_cc_c89" = xno then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 printf "%s\n" "unsupported" >&6; } else case e in @%:@( e) if test "x$ac_cv_prog_cc_c89" = x then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 printf "%s\n" "none needed" >&6; } else case e in @%:@( e) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 printf "%s\n" "$ac_cv_prog_cc_c89" >&6; } CC="$CC $ac_cv_prog_cc_c89" ;; esac fi ac_cv_prog_cc_stdc=$ac_cv_prog_cc_c89 ac_prog_cc_stdc=c89 ;; esac fi fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu ac_header= ac_cache= for ac_item in $ac_header_c_list do if test $ac_cache; then ac_fn_c_check_header_compile "$LINENO" $ac_header ac_cv_header_$ac_cache "$ac_includes_default" if eval test \"x\$ac_cv_header_$ac_cache\" = xyes; then printf "%s\n" "#define $ac_item 1" >> confdefs.h fi ac_header= ac_cache= elif test $ac_header; then ac_cache=$ac_item else ac_header=$ac_item fi done if test $ac_cv_header_stdlib_h = yes && test $ac_cv_header_string_h = yes then : printf "%s\n" "@%:@define STDC_HEADERS 1" >>confdefs.h fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether it is safe to define __EXTENSIONS__" >&5 printf %s "checking whether it is safe to define __EXTENSIONS__... " >&6; } if test ${ac_cv_safe_to_define___extensions__+y} then : printf %s "(cached) " >&6 else case e in @%:@( e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ # define __EXTENSIONS__ 1 $ac_includes_default int main (void) { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : ac_cv_safe_to_define___extensions__=yes else case e in @%:@( e) ac_cv_safe_to_define___extensions__=no ;; esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_safe_to_define___extensions__" >&5 printf "%s\n" "$ac_cv_safe_to_define___extensions__" >&6; } { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether _XOPEN_SOURCE should be defined" >&5 printf %s "checking whether _XOPEN_SOURCE should be defined... " >&6; } if test ${ac_cv_should_define__xopen_source+y} then : printf %s "(cached) " >&6 else case e in @%:@( e) ac_cv_should_define__xopen_source=no if test $ac_cv_header_wchar_h = yes then : cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include mbstate_t x; int main (void) { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : else case e in @%:@( e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #define _XOPEN_SOURCE 500 #include mbstate_t x; int main (void) { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : ac_cv_should_define__xopen_source=yes fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ;; esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext fi ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_should_define__xopen_source" >&5 printf "%s\n" "$ac_cv_should_define__xopen_source" >&6; } printf "%s\n" "@%:@define _ALL_SOURCE 1" >>confdefs.h printf "%s\n" "@%:@define _DARWIN_C_SOURCE 1" >>confdefs.h printf "%s\n" "@%:@define _GNU_SOURCE 1" >>confdefs.h printf "%s\n" "@%:@define _HPUX_ALT_XOPEN_SOCKET_API 1" >>confdefs.h printf "%s\n" "@%:@define _NETBSD_SOURCE 1" >>confdefs.h printf "%s\n" "@%:@define _OPENBSD_SOURCE 1" >>confdefs.h printf "%s\n" "@%:@define _POSIX_PTHREAD_SEMANTICS 1" >>confdefs.h printf "%s\n" "@%:@define __STDC_WANT_IEC_60559_ATTRIBS_EXT__ 1" >>confdefs.h printf "%s\n" "@%:@define __STDC_WANT_IEC_60559_BFP_EXT__ 1" >>confdefs.h printf "%s\n" "@%:@define __STDC_WANT_IEC_60559_DFP_EXT__ 1" >>confdefs.h printf "%s\n" "@%:@define __STDC_WANT_IEC_60559_EXT__ 1" >>confdefs.h printf "%s\n" "@%:@define __STDC_WANT_IEC_60559_FUNCS_EXT__ 1" >>confdefs.h printf "%s\n" "@%:@define __STDC_WANT_IEC_60559_TYPES_EXT__ 1" >>confdefs.h printf "%s\n" "@%:@define __STDC_WANT_LIB_EXT2__ 1" >>confdefs.h printf "%s\n" "@%:@define __STDC_WANT_MATH_SPEC_FUNCS__ 1" >>confdefs.h printf "%s\n" "@%:@define _TANDEM_SOURCE 1" >>confdefs.h if test $ac_cv_header_minix_config_h = yes then : MINIX=yes printf "%s\n" "@%:@define _MINIX 1" >>confdefs.h printf "%s\n" "@%:@define _POSIX_SOURCE 1" >>confdefs.h printf "%s\n" "@%:@define _POSIX_1_SOURCE 2" >>confdefs.h else case e in @%:@( e) MINIX= ;; esac fi if test $ac_cv_safe_to_define___extensions__ = yes then : printf "%s\n" "@%:@define __EXTENSIONS__ 1" >>confdefs.h fi if test $ac_cv_should_define__xopen_source = yes then : printf "%s\n" "@%:@define _XOPEN_SOURCE 500" >>confdefs.h fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. set dummy ${ac_tool_prefix}gcc; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_CC+y} then : printf %s "(cached) " >&6 else case e in @%:@( e) if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in @%:@((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}gcc" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi ;; esac fi CC=$ac_cv_prog_CC if test -n "$CC"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 printf "%s\n" "$CC" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi fi if test -z "$ac_cv_prog_CC"; then ac_ct_CC=$CC # Extract the first word of "gcc", so it can be a program name with args. set dummy gcc; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_ac_ct_CC+y} then : printf %s "(cached) " >&6 else case e in @%:@( e) if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in @%:@((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="gcc" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi ;; esac fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 printf "%s\n" "$ac_ct_CC" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi else CC="$ac_cv_prog_CC" fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. set dummy ${ac_tool_prefix}cc; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_CC+y} then : printf %s "(cached) " >&6 else case e in @%:@( e) if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in @%:@((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}cc" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi ;; esac fi CC=$ac_cv_prog_CC if test -n "$CC"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 printf "%s\n" "$CC" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi fi fi if test -z "$CC"; then # Extract the first word of "cc", so it can be a program name with args. set dummy cc; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_CC+y} then : printf %s "(cached) " >&6 else case e in @%:@( e) if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else ac_prog_rejected=no as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in @%:@((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then if test "$as_dir$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then ac_prog_rejected=yes continue fi ac_cv_prog_CC="cc" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS if test $ac_prog_rejected = yes; then # We found a bogon in the path, so make sure we never use it. set dummy $ac_cv_prog_CC shift if test $@%:@ != 0; then # We chose a different compiler from the bogus one. # However, it has the same basename, so the bogon will be chosen # first if we set CC to just the basename; use the full file name. shift ac_cv_prog_CC="$as_dir$ac_word${1+' '}$@" fi fi fi ;; esac fi CC=$ac_cv_prog_CC if test -n "$CC"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 printf "%s\n" "$CC" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then for ac_prog in cl.exe do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_CC+y} then : printf %s "(cached) " >&6 else case e in @%:@( e) if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in @%:@((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_CC="$ac_tool_prefix$ac_prog" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi ;; esac fi CC=$ac_cv_prog_CC if test -n "$CC"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 printf "%s\n" "$CC" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi test -n "$CC" && break done fi if test -z "$CC"; then ac_ct_CC=$CC for ac_prog in cl.exe do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_ac_ct_CC+y} then : printf %s "(cached) " >&6 else case e in @%:@( e) if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in @%:@((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="$ac_prog" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi ;; esac fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 printf "%s\n" "$ac_ct_CC" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi test -n "$ac_ct_CC" && break done if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi fi fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}clang", so it can be a program name with args. set dummy ${ac_tool_prefix}clang; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_CC+y} then : printf %s "(cached) " >&6 else case e in @%:@( e) if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in @%:@((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}clang" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi ;; esac fi CC=$ac_cv_prog_CC if test -n "$CC"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 printf "%s\n" "$CC" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi fi if test -z "$ac_cv_prog_CC"; then ac_ct_CC=$CC # Extract the first word of "clang", so it can be a program name with args. set dummy clang; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_ac_ct_CC+y} then : printf %s "(cached) " >&6 else case e in @%:@( e) if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in @%:@((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="clang" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi ;; esac fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 printf "%s\n" "$ac_ct_CC" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi else CC="$ac_cv_prog_CC" fi fi test -z "$CC" && { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in '$ac_pwd':" >&5 printf "%s\n" "$as_me: error: in '$ac_pwd':" >&2;} as_fn_error $? "no acceptable C compiler found in \$PATH See 'config.log' for more details" "$LINENO" 5; } # Provide some information about the compiler. printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5 set X $ac_compile ac_compiler=$2 for ac_option in --version -v -V -qversion -version; do { { ac_try="$ac_compiler $ac_option >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" printf "%s\n" "$ac_try_echo"; } >&5 (eval "$ac_compiler $ac_option >&5") 2>conftest.err ac_status=$? if test -s conftest.err; then sed '10a\ ... rest of stderr output deleted ... 10q' conftest.err >conftest.er1 cat conftest.er1 >&5 fi rm -f conftest.er1 conftest.err printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } done { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the compiler supports GNU C" >&5 printf %s "checking whether the compiler supports GNU C... " >&6; } if test ${ac_cv_c_compiler_gnu+y} then : printf %s "(cached) " >&6 else case e in @%:@( e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main (void) { #ifndef __GNUC__ choke me #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : ac_compiler_gnu=yes else case e in @%:@( e) ac_compiler_gnu=no ;; esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ac_cv_c_compiler_gnu=$ac_compiler_gnu ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5 printf "%s\n" "$ac_cv_c_compiler_gnu" >&6; } ac_compiler_gnu=$ac_cv_c_compiler_gnu if test $ac_compiler_gnu = yes; then GCC=yes else GCC= fi ac_test_CFLAGS=${CFLAGS+y} ac_save_CFLAGS=$CFLAGS { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5 printf %s "checking whether $CC accepts -g... " >&6; } if test ${ac_cv_prog_cc_g+y} then : printf %s "(cached) " >&6 else case e in @%:@( e) ac_save_c_werror_flag=$ac_c_werror_flag ac_c_werror_flag=yes ac_cv_prog_cc_g=no CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main (void) { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : ac_cv_prog_cc_g=yes else case e in @%:@( e) CFLAGS="" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main (void) { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : else case e in @%:@( e) ac_c_werror_flag=$ac_save_c_werror_flag CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main (void) { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : ac_cv_prog_cc_g=yes fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ;; esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ;; esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ac_c_werror_flag=$ac_save_c_werror_flag ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5 printf "%s\n" "$ac_cv_prog_cc_g" >&6; } if test $ac_test_CFLAGS; then CFLAGS=$ac_save_CFLAGS elif test $ac_cv_prog_cc_g = yes; then if test "$GCC" = yes; then CFLAGS="-g -O2" else CFLAGS="-g" fi else if test "$GCC" = yes; then CFLAGS="-O2" else CFLAGS= fi fi ac_prog_cc_stdc=no if test x$ac_prog_cc_stdc = xno then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $CC option to enable C11 features" >&5 printf %s "checking for $CC option to enable C11 features... " >&6; } if test ${ac_cv_prog_cc_c11+y} then : printf %s "(cached) " >&6 else case e in @%:@( e) ac_cv_prog_cc_c11=no ac_save_CC=$CC cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_c_conftest_c11_program _ACEOF for ac_arg in '' -std=gnu11 do CC="$ac_save_CC $ac_arg" if ac_fn_c_try_compile "$LINENO" then : ac_cv_prog_cc_c11=$ac_arg fi rm -f core conftest.err conftest.$ac_objext conftest.beam test "x$ac_cv_prog_cc_c11" != "xno" && break done rm -f conftest.$ac_ext CC=$ac_save_CC ;; esac fi if test "x$ac_cv_prog_cc_c11" = xno then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 printf "%s\n" "unsupported" >&6; } else case e in @%:@( e) if test "x$ac_cv_prog_cc_c11" = x then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 printf "%s\n" "none needed" >&6; } else case e in @%:@( e) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c11" >&5 printf "%s\n" "$ac_cv_prog_cc_c11" >&6; } CC="$CC $ac_cv_prog_cc_c11" ;; esac fi ac_cv_prog_cc_stdc=$ac_cv_prog_cc_c11 ac_prog_cc_stdc=c11 ;; esac fi fi if test x$ac_prog_cc_stdc = xno then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $CC option to enable C99 features" >&5 printf %s "checking for $CC option to enable C99 features... " >&6; } if test ${ac_cv_prog_cc_c99+y} then : printf %s "(cached) " >&6 else case e in @%:@( e) ac_cv_prog_cc_c99=no ac_save_CC=$CC cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_c_conftest_c99_program _ACEOF for ac_arg in '' -std=gnu99 -std=c99 -c99 -qlanglvl=extc1x -qlanglvl=extc99 -AC99 -D_STDC_C99= do CC="$ac_save_CC $ac_arg" if ac_fn_c_try_compile "$LINENO" then : ac_cv_prog_cc_c99=$ac_arg fi rm -f core conftest.err conftest.$ac_objext conftest.beam test "x$ac_cv_prog_cc_c99" != "xno" && break done rm -f conftest.$ac_ext CC=$ac_save_CC ;; esac fi if test "x$ac_cv_prog_cc_c99" = xno then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 printf "%s\n" "unsupported" >&6; } else case e in @%:@( e) if test "x$ac_cv_prog_cc_c99" = x then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 printf "%s\n" "none needed" >&6; } else case e in @%:@( e) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c99" >&5 printf "%s\n" "$ac_cv_prog_cc_c99" >&6; } CC="$CC $ac_cv_prog_cc_c99" ;; esac fi ac_cv_prog_cc_stdc=$ac_cv_prog_cc_c99 ac_prog_cc_stdc=c99 ;; esac fi fi if test x$ac_prog_cc_stdc = xno then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $CC option to enable C89 features" >&5 printf %s "checking for $CC option to enable C89 features... " >&6; } if test ${ac_cv_prog_cc_c89+y} then : printf %s "(cached) " >&6 else case e in @%:@( e) ac_cv_prog_cc_c89=no ac_save_CC=$CC cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_c_conftest_c89_program _ACEOF for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" do CC="$ac_save_CC $ac_arg" if ac_fn_c_try_compile "$LINENO" then : ac_cv_prog_cc_c89=$ac_arg fi rm -f core conftest.err conftest.$ac_objext conftest.beam test "x$ac_cv_prog_cc_c89" != "xno" && break done rm -f conftest.$ac_ext CC=$ac_save_CC ;; esac fi if test "x$ac_cv_prog_cc_c89" = xno then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 printf "%s\n" "unsupported" >&6; } else case e in @%:@( e) if test "x$ac_cv_prog_cc_c89" = x then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 printf "%s\n" "none needed" >&6; } else case e in @%:@( e) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 printf "%s\n" "$ac_cv_prog_cc_c89" >&6; } CC="$CC $ac_cv_prog_cc_c89" ;; esac fi ac_cv_prog_cc_stdc=$ac_cv_prog_cc_c89 ac_prog_cc_stdc=c89 ;; esac fi fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu for ac_prog in gawk mawk nawk awk do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_AWK+y} then : printf %s "(cached) " >&6 else case e in @%:@( e) if test -n "$AWK"; then ac_cv_prog_AWK="$AWK" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in @%:@((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_AWK="$ac_prog" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi ;; esac fi AWK=$ac_cv_prog_AWK if test -n "$AWK"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $AWK" >&5 printf "%s\n" "$AWK" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi test -n "$AWK" && break done # Find a good install program. We prefer a C program (faster), # so one script is as good as another. But avoid the broken or # incompatible versions: # SysV /etc/install, /usr/sbin/install # SunOS /usr/etc/install # IRIX /sbin/install # AIX /bin/install # AmigaOS /C/install, which installs bootblocks on floppy discs # AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag # AFS /usr/afsws/bin/install, which mishandles nonexistent args # SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" # OS/2's system install, which has a completely different semantic # ./install, which can be erroneously created by make from ./install.sh. # Reject install programs that cannot install multiple files. { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for a BSD-compatible install" >&5 printf %s "checking for a BSD-compatible install... " >&6; } if test -z "$INSTALL"; then if test ${ac_cv_path_install+y} then : printf %s "(cached) " >&6 else case e in @%:@( e) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in @%:@((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac # Account for fact that we put trailing slashes in our PATH walk. case $as_dir in @%:@(( ./ | /[cC]/* | \ /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \ ?:[\\/]os2[\\/]install[\\/]* | ?:[\\/]OS2[\\/]INSTALL[\\/]* | \ /usr/ucb/* ) ;; *) # OSF1 and SCO ODT 3.0 have their own names for install. # Don't use installbsd from OSF since it installs stuff as root # by default. for ac_prog in ginstall scoinst install; do for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_prog$ac_exec_ext"; then if test $ac_prog = install && grep dspmsg "$as_dir$ac_prog$ac_exec_ext" >/dev/null 2>&1; then # AIX install. It has an incompatible calling convention. : elif test $ac_prog = install && grep pwplus "$as_dir$ac_prog$ac_exec_ext" >/dev/null 2>&1; then # program-specific install script used by HP pwplus--don't use. : else rm -rf conftest.one conftest.two conftest.dir echo one > conftest.one echo two > conftest.two mkdir conftest.dir if "$as_dir$ac_prog$ac_exec_ext" -c conftest.one conftest.two "`pwd`/conftest.dir/" && test -s conftest.one && test -s conftest.two && test -s conftest.dir/conftest.one && test -s conftest.dir/conftest.two then ac_cv_path_install="$as_dir$ac_prog$ac_exec_ext -c" break 3 fi fi fi done done ;; esac done IFS=$as_save_IFS rm -rf conftest.one conftest.two conftest.dir ;; esac fi if test ${ac_cv_path_install+y}; then INSTALL=$ac_cv_path_install else # As a last resort, use the slow shell script. Don't cache a # value for INSTALL within a source directory, because that will # break other packages using the cache if that directory is # removed, or if the value is a relative name. INSTALL=$ac_install_sh fi fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $INSTALL" >&5 printf "%s\n" "$INSTALL" >&6; } # Use test -z because SunOS4 sh mishandles braces in ${var-val}. # It thinks the first close brace ends the variable substitution. test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}' test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}' test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' ac_fn_c_check_func "$LINENO" "execvpe" "ac_cv_func_execvpe" if test "x$ac_cv_func_execvpe" = xyes then : printf "%s\n" "@%:@define HAVE_EXECVPE 1" >>confdefs.h fi ac_fn_c_check_func "$LINENO" "seteuid" "ac_cv_func_seteuid" if test "x$ac_cv_func_seteuid" = xyes then : printf "%s\n" "@%:@define HAVE_SETEUID 1" >>confdefs.h fi ac_fn_c_check_func "$LINENO" "setegid" "ac_cv_func_setegid" if test "x$ac_cv_func_setegid" = xyes then : printf "%s\n" "@%:@define HAVE_SETEGID 1" >>confdefs.h fi ac_fn_c_check_func "$LINENO" "setreuid" "ac_cv_func_setreuid" if test "x$ac_cv_func_setreuid" = xyes then : printf "%s\n" "@%:@define HAVE_SETREUID 1" >>confdefs.h fi ac_fn_c_check_func "$LINENO" "setresuid" "ac_cv_func_setresuid" if test "x$ac_cv_func_setresuid" = xyes then : printf "%s\n" "@%:@define HAVE_SETRESUID 1" >>confdefs.h fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for library containing tgetent" >&5 printf %s "checking for library containing tgetent... " >&6; } if test ${ac_cv_search_tgetent+y} then : printf %s "(cached) " >&6 else case e in @%:@( e) ac_func_search_save_LIBS=$LIBS cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. The 'extern "C"' is for builds by C++ compilers; although this is not generally supported in C code supporting it here has little cost and some practical benefit (sr 110532). */ #ifdef __cplusplus extern "C" #endif char tgetent (void); int main (void) { return tgetent (); ; return 0; } _ACEOF for ac_lib in '' curses termcap termlib ncursesw tinfow ncurses tinfo do if test -z "$ac_lib"; then ac_res="none required" else ac_res=-l$ac_lib LIBS="-l$ac_lib $ac_func_search_save_LIBS" fi if ac_fn_c_try_link "$LINENO" then : ac_cv_search_tgetent=$ac_res fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext if test ${ac_cv_search_tgetent+y} then : break fi done if test ${ac_cv_search_tgetent+y} then : else case e in @%:@( e) ac_cv_search_tgetent=no ;; esac fi rm conftest.$ac_ext LIBS=$ac_func_search_save_LIBS ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_tgetent" >&5 printf "%s\n" "$ac_cv_search_tgetent" >&6; } ac_res=$ac_cv_search_tgetent if test "$ac_res" != no then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" else case e in @%:@( e) as_fn_error $? "unable to find tgetent() function" "$LINENO" 5 ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for library containing crypt" >&5 printf %s "checking for library containing crypt... " >&6; } if test ${ac_cv_search_crypt+y} then : printf %s "(cached) " >&6 else case e in @%:@( e) ac_func_search_save_LIBS=$LIBS cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. The 'extern "C"' is for builds by C++ compilers; although this is not generally supported in C code supporting it here has little cost and some practical benefit (sr 110532). */ #ifdef __cplusplus extern "C" #endif char crypt (void); int main (void) { return crypt (); ; return 0; } _ACEOF for ac_lib in '' crypt do if test -z "$ac_lib"; then ac_res="none required" else ac_res=-l$ac_lib LIBS="-l$ac_lib $ac_func_search_save_LIBS" fi if ac_fn_c_try_link "$LINENO" then : ac_cv_search_crypt=$ac_res fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext if test ${ac_cv_search_crypt+y} then : break fi done if test ${ac_cv_search_crypt+y} then : else case e in @%:@( e) ac_cv_search_crypt=no ;; esac fi rm conftest.$ac_ext LIBS=$ac_func_search_save_LIBS ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_crypt" >&5 printf "%s\n" "$ac_cv_search_crypt" >&6; } ac_res=$ac_cv_search_crypt if test "$ac_res" != no then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" else case e in @%:@( e) as_fn_error $? "unable to find crypt() function" "$LINENO" 5 ;; esac fi ac_fn_c_check_header_compile "$LINENO" "pty.h" "ac_cv_header_pty_h" "$ac_includes_default" if test "x$ac_cv_header_pty_h" = xyes then : printf "%s\n" "@%:@define HAVE_PTY_H 1" >>confdefs.h fi ac_fn_c_check_header_compile "$LINENO" "util.h" "ac_cv_header_util_h" "$ac_includes_default" if test "x$ac_cv_header_util_h" = xyes then : printf "%s\n" "@%:@define HAVE_UTIL_H 1" >>confdefs.h fi ac_fn_c_check_header_compile "$LINENO" "libutil.h" "ac_cv_header_libutil_h" "$ac_includes_default" if test "x$ac_cv_header_libutil_h" = xyes then : printf "%s\n" "@%:@define HAVE_LIBUTIL_H 1" >>confdefs.h fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for library containing openpty" >&5 printf %s "checking for library containing openpty... " >&6; } if test ${ac_cv_search_openpty+y} then : printf %s "(cached) " >&6 else case e in @%:@( e) ac_func_search_save_LIBS=$LIBS cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. The 'extern "C"' is for builds by C++ compilers; although this is not generally supported in C code supporting it here has little cost and some practical benefit (sr 110532). */ #ifdef __cplusplus extern "C" #endif char openpty (void); int main (void) { return openpty (); ; return 0; } _ACEOF for ac_lib in '' util openpty bsd do if test -z "$ac_lib"; then ac_res="none required" else ac_res=-l$ac_lib LIBS="-l$ac_lib $ac_func_search_save_LIBS" fi if ac_fn_c_try_link "$LINENO" then : ac_cv_search_openpty=$ac_res fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext if test ${ac_cv_search_openpty+y} then : break fi done if test ${ac_cv_search_openpty+y} then : else case e in @%:@( e) ac_cv_search_openpty=no ;; esac fi rm conftest.$ac_ext LIBS=$ac_func_search_save_LIBS ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_openpty" >&5 printf "%s\n" "$ac_cv_search_openpty" >&6; } ac_res=$ac_cv_search_openpty if test "$ac_res" != no then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" printf "%s\n" "@%:@define HAVE_OPENPTY 1" >>confdefs.h else case e in @%:@( e) as_fn_error $? "unable to find openpty() function" "$LINENO" 5 ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for library containing socket" >&5 printf %s "checking for library containing socket... " >&6; } if test ${ac_cv_search_socket+y} then : printf %s "(cached) " >&6 else case e in @%:@( e) ac_func_search_save_LIBS=$LIBS cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. The 'extern "C"' is for builds by C++ compilers; although this is not generally supported in C code supporting it here has little cost and some practical benefit (sr 110532). */ #ifdef __cplusplus extern "C" #endif char socket (void); int main (void) { return socket (); ; return 0; } _ACEOF for ac_lib in '' network do if test -z "$ac_lib"; then ac_res="none required" else ac_res=-l$ac_lib LIBS="-l$ac_lib $ac_func_search_save_LIBS" fi if ac_fn_c_try_link "$LINENO" then : ac_cv_search_socket=$ac_res fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext if test ${ac_cv_search_socket+y} then : break fi done if test ${ac_cv_search_socket+y} then : else case e in @%:@( e) ac_cv_search_socket=no ;; esac fi rm conftest.$ac_ext LIBS=$ac_func_search_save_LIBS ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_socket" >&5 printf "%s\n" "$ac_cv_search_socket" >&6; } ac_res=$ac_cv_search_socket if test "$ac_res" != no then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" else case e in @%:@( e) as_fn_error $? "unable to find socket() function" "$LINENO" 5 ;; esac fi ac_fn_c_check_header_compile "$LINENO" "langinfo.h" "ac_cv_header_langinfo_h" "$ac_includes_default" if test "x$ac_cv_header_langinfo_h" = xyes then : printf "%s\n" "@%:@define HAVE_LANGINFO_H 1" >>confdefs.h fi ac_fn_c_check_header_compile "$LINENO" "dirent.h" "ac_cv_header_dirent_h" "$ac_includes_default" if test "x$ac_cv_header_dirent_h" = xyes then : printf "%s\n" "@%:@define HAVE_DIRENT_H 1" >>confdefs.h fi @%:@ Check whether --enable-pam was given. if test ${enable_pam+y} then : enableval=$enable_pam; enable_pam=$enableval else case e in @%:@( e) enable_pam=yes ;; esac fi @%:@ Check whether --enable-utmp was given. if test ${enable_utmp+y} then : enableval=$enable_utmp; enable_utmp=$enableval else case e in @%:@( e) enable_utmp=no ;; esac fi @%:@ Check whether --enable-telnet was given. if test ${enable_telnet+y} then : enableval=$enable_telnet; enable_telnet=$enableval else case e in @%:@( e) enable_telnet=no ;; esac fi @%:@ Check whether --enable-socket-dir was given. if test ${enable_socket_dir+y} then : enableval=$enable_socket_dir; enable_socket_dir=$enableval else case e in @%:@( e) enable_socket_dir=no ;; esac fi @%:@ Check whether --with-system_screenrc was given. if test ${with_system_screenrc+y} then : withval=$with_system_screenrc; with_system_screenrc=$withval else case e in @%:@( e) with_system_screenrc=/etc/screenrc ;; esac fi @%:@ Check whether --with-pty-mode was given. if test ${with_pty_mode+y} then : withval=$with_pty_mode; with_pty_mode=$withval else case e in @%:@( e) with_pty_mode=0620 ;; esac fi @%:@ Check whether --with-pty-group was given. if test ${with_pty_group+y} then : withval=$with_pty_group; with_pty_group=$withval else case e in @%:@( e) with_pty_group=5 ;; esac fi @%:@ Check whether --with-pty-rofs was given. if test ${with_pty_rofs+y} then : withval=$with_pty_rofs; with_pty_rofs=$withval else case e in @%:@( e) with_pty_rofs=no ;; esac fi if test "x$enable_pam" = "xyes" then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for PAM support" >&5 printf %s "checking for PAM support... " >&6; } oldlibs="$LIBS" LIBS="$LIBS -lpam" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main (void) { pam_start(0, 0, 0, 0); pam_authenticate(0, 0); pam_end(0,0); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO" then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 printf "%s\n" "yes" >&6; }; printf "%s\n" "@%:@define ENABLE_PAM 1" >>confdefs.h else case e in @%:@( e) as_fn_error $? "no" "$LINENO" 5;LIBS="$oldlibs" ;; esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext fi if test "x$enable_utmp" = "xyes" then : for ac_header in utmpx.h do : ac_fn_c_check_header_compile "$LINENO" "utmpx.h" "ac_cv_header_utmpx_h" "$ac_includes_default" if test "x$ac_cv_header_utmpx_h" = xyes then : printf "%s\n" "@%:@define HAVE_UTMPX_H 1" >>confdefs.h have_utmpx=yes else case e in @%:@( e) have_utmpx=no ;; esac fi done if test "x$have_utmpx" != "xyes" then : as_fn_error $? "Missing utmpx.h" "$LINENO" 5 fi ac_fn_c_check_header_compile "$LINENO" "utempter.h" "ac_cv_header_utempter_h" "$ac_includes_default" if test "x$ac_cv_header_utempter_h" = xyes then : have_utempter=yes else case e in @%:@( e) have_utempter=no ;; esac fi if test "x$have_utempter" = "xyes" then : printf "%s\n" "@%:@define HAVE_UTEMPTER 1" >>confdefs.h LIBS="$LIBS -lutempter" fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if utmpx struct has ut_host field" >&5 printf %s "checking if utmpx struct has ut_host field... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main (void) { struct utmpx u; u.ut_host[0] = 0; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 printf "%s\n" "yes" >&6; } printf "%s\n" "@%:@define HAVE_UT_HOST 1" >>confdefs.h else case e in @%:@( e) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } ;; esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if utmpx struct has ut_exit field" >&5 printf %s "checking if utmpx struct has ut_exit field... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main (void) { struct utmpx u; u.ut_exit.e_exit; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 printf "%s\n" "yes" >&6; } printf "%s\n" "@%:@define HAVE_UT_EXIT 1" >>confdefs.h else case e in @%:@( e) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } ;; esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext printf "%s\n" "@%:@define ENABLE_UTMP 1" >>confdefs.h fi if test "x$enable_telnet" = "xyes" then : printf "%s\n" "@%:@define ENABLE_TELNET 1" >>confdefs.h fi if test "x$enable_socket_dir" != "xno" then : if test "x$enable_socket_dir" = "xyes" then : enable_socket_dir="/run/screen" fi printf "%s\n" "@%:@define SOCKET_DIR \"$enable_socket_dir\"" >>confdefs.h fi printf "%s\n" "@%:@define SYSTEM_SCREENRC \"$with_system_screenrc\"" >>confdefs.h printf "%s\n" "@%:@define PTY_MODE $with_pty_mode" >>confdefs.h printf "%s\n" "@%:@define PTY_GROUP $with_pty_group" >>confdefs.h if test "x$with_pty_rofs" = "xyes" then : printf "%s\n" "@%:@define PTY_ROFS 1" >>confdefs.h fi ac_config_files="$ac_config_files Makefile doc/Makefile" cat >confcache <<\_ACEOF # This file is a shell script that caches the results of configure # tests run on this system so they can be shared between configure # scripts and configure runs, see configure's option --config-cache. # It is not useful on other systems. If it contains results you don't # want to keep, you may remove or edit it. # # config.status only pays attention to the cache file if you give it # the --recheck option to rerun configure. # # 'ac_cv_env_foo' variables (set or unset) will be overridden when # loading this file, other *unset* 'ac_cv_foo' will be assigned the # following values. _ACEOF # The following way of writing the cache mishandles newlines in values, # but we know of no workaround that is simple, portable, and efficient. # So, we kill variables containing newlines. # Ultrix sh set writes to stderr and can't be redirected directly, # and sets the high bit in the cache file unless we assign to the vars. ( for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 printf "%s\n" "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space=' '; set) 2>&1` in #( *${as_nl}ac_space=\ *) # 'set' does not quote correctly, so add quotes: double-quote # substitution turns \\\\ into \\, and sed turns \\ into \. sed -n \ "s/'/'\\\\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" ;; #( *) # 'set' quotes correctly as required by POSIX, so do not add quotes. sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) | sed ' /^ac_cv_env_/b end t clear :clear s/^\([^=]*\)=\(.*[{}].*\)$/test ${\1+y} || &/ t end s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ :end' >>confcache if diff "$cache_file" confcache >/dev/null 2>&1; then :; else if test -w "$cache_file"; then if test "x$cache_file" != "x/dev/null"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5 printf "%s\n" "$as_me: updating cache $cache_file" >&6;} if test ! -f "$cache_file" || test -h "$cache_file"; then cat confcache >"$cache_file" else case $cache_file in #( */* | ?:*) mv -f confcache "$cache_file"$$ && mv -f "$cache_file"$$ "$cache_file" ;; #( *) mv -f confcache "$cache_file" ;; esac fi fi else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5 printf "%s\n" "$as_me: not updating unwritable cache $cache_file" >&6;} fi fi rm -f confcache test "x$prefix" = xNONE && prefix=$ac_default_prefix # Let make expand exec_prefix. test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' DEFS=-DHAVE_CONFIG_H ac_libobjs= ac_ltlibobjs= U= for ac_i in : $LIB@&t@OBJS; do test "x$ac_i" = x: && continue # 1. Remove the extension, and $U if already installed. ac_script='s/\$U\././;s/\.o$//;s/\.obj$//' ac_i=`printf "%s\n" "$ac_i" | sed "$ac_script"` # 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR # will be set to the directory where LIBOBJS objects are built. as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext" as_fn_append ac_ltlibobjs " \${LIBOBJDIR}$ac_i"'$U.lo' done LIB@&t@OBJS=$ac_libobjs LTLIBOBJS=$ac_ltlibobjs : "${CONFIG_STATUS=./config.status}" ac_write_fail=0 ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files $CONFIG_STATUS" { printf "%s\n" "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5 printf "%s\n" "$as_me: creating $CONFIG_STATUS" >&6;} as_write_fail=0 cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1 #! $SHELL # Generated by $as_me. # Run this file to recreate the current configuration. # Compiler output produced by configure, useful for debugging # configure, is in config.log if it exists. debug=false ac_cs_recheck=false ac_cs_silent=false SHELL=\${CONFIG_SHELL-$SHELL} export SHELL _ASEOF cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1 ## -------------------- ## ## M4sh Initialization. ## ## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test ${ZSH_VERSION+y} && (emulate sh) >/dev/null 2>&1 then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case e in @%:@( e) case `(set -o) 2>/dev/null` in @%:@( *posix*) : set -o posix ;; @%:@( *) : ;; esac ;; esac fi # Reset variables that may have inherited troublesome values from # the environment. # IFS needs to be set, to space, tab, and newline, in precisely that order. # (If _AS_PATH_WALK were called with IFS unset, it would have the # side effect of setting IFS to empty, thus disabling word splitting.) # Quoting is to prevent editors from complaining about space-tab. as_nl=' ' export as_nl IFS=" "" $as_nl" PS1='$ ' PS2='> ' PS4='+ ' # Ensure predictable behavior from utilities with locale-dependent output. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # We cannot yet rely on "unset" to work, but we need these variables # to be unset--not just set to an empty or harmless value--now, to # avoid bugs in old shells (e.g. pre-3.0 UWIN ksh). This construct # also avoids known problems related to "unset" and subshell syntax # in other old shells (e.g. bash 2.01 and pdksh 5.2.14). for as_var in BASH_ENV ENV MAIL MAILPATH CDPATH do eval test \${$as_var+y} \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done # Ensure that fds 0, 1, and 2 are open. if (exec 3>&0) 2>/dev/null; then :; else exec 0&1) 2>/dev/null; then :; else exec 1>/dev/null; fi if (exec 3>&2) ; then :; else exec 2>/dev/null; fi # The user is always right. if ${PATH_SEPARATOR+false} :; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # Find who we are. Look in the path if we contain no directory separator. as_myself= case $0 in @%:@(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in @%:@((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac test -r "$as_dir$0" && as_myself=$as_dir$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as 'sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then printf "%s\n" "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi @%:@ as_fn_error STATUS ERROR [LINENO LOG_FD] @%:@ ---------------------------------------- @%:@ Output "`basename @S|@0`: error: ERROR" to stderr. If LINENO and LOG_FD are @%:@ provided, also output the error to LOG_FD, referencing LINENO. Then exit the @%:@ script with STATUS, using 1 if that was 0. as_fn_error () { as_status=$1; test $as_status -eq 0 && as_status=1 if test "$4"; then as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi printf "%s\n" "$as_me: error: $2" >&2 as_fn_exit $as_status } @%:@ as_fn_error @%:@ as_fn_set_status STATUS @%:@ ----------------------- @%:@ Set @S|@? to STATUS, without forking. as_fn_set_status () { return $1 } @%:@ as_fn_set_status @%:@ as_fn_exit STATUS @%:@ ----------------- @%:@ Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } @%:@ as_fn_exit @%:@ as_fn_unset VAR @%:@ --------------- @%:@ Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset @%:@ as_fn_append VAR VALUE @%:@ ---------------------- @%:@ Append the text in VALUE to the end of the definition contained in VAR. Take @%:@ advantage of any shell optimizations that allow amortized linear growth over @%:@ repeated appends, instead of the typical quadratic growth present in naive @%:@ implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null then : eval 'as_fn_append () { eval $1+=\$2 }' else case e in @%:@( e) as_fn_append () { eval $1=\$$1\$2 } ;; esac fi # as_fn_append @%:@ as_fn_arith ARG... @%:@ ------------------ @%:@ Perform arithmetic evaluation on the ARGs, and store the result in the @%:@ global @S|@as_val. Take advantage of shells that can avoid forks. The arguments @%:@ must be portable across @S|@(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null then : eval 'as_fn_arith () { as_val=$(( $* )) }' else case e in @%:@( e) as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } ;; esac fi # as_fn_arith if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || printf "%s\n" X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits # Determine whether it's possible to make 'echo' print without a newline. # These variables are no longer used directly by Autoconf, but are AC_SUBSTed # for compatibility with existing Makefiles. ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in @%:@((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac # For backward compatibility with old third-party macros, we provide # the shell variables $as_echo and $as_echo_n. New code should use # AS_ECHO(["message"]) and AS_ECHO_N(["message"]), respectively. as_@&t@echo='printf %s\n' as_@&t@echo_n='printf %s' rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both 'ln -s file dir' and 'ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; 'ln -s' creates a wrapper executable. # In both cases, we have to default to 'cp -pR'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -pR' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -pR' fi else as_ln_s='cp -pR' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null @%:@ as_fn_mkdir_p @%:@ ------------- @%:@ Create "@S|@as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`printf "%s\n" "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || printf "%s\n" X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" } @%:@ as_fn_mkdir_p if mkdir -p . 2>/dev/null; then as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi @%:@ as_fn_executable_p FILE @%:@ ----------------------- @%:@ Test if FILE is an executable regular file. as_fn_executable_p () { test -f "$1" && test -x "$1" } @%:@ as_fn_executable_p as_test_x='test -x' as_executable_p=as_fn_executable_p # Sed expression to map a string onto a valid CPP name. as_sed_cpp="y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g" as_tr_cpp="eval sed '$as_sed_cpp'" # deprecated # Sed expression to map a string onto a valid variable name. as_sed_sh="y%*+%pp%;s%[^_$as_cr_alnum]%_%g" as_tr_sh="eval sed '$as_sed_sh'" # deprecated exec 6>&1 ## ----------------------------------- ## ## Main body of $CONFIG_STATUS script. ## ## ----------------------------------- ## _ASEOF test $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1 cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # Save the log message, to keep $0 and so on meaningful, and to # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log=" This file was extended by GNU Screen $as_me 5.0.2, which was generated by GNU Autoconf 2.72. Invocation command line was CONFIG_FILES = $CONFIG_FILES CONFIG_HEADERS = $CONFIG_HEADERS CONFIG_LINKS = $CONFIG_LINKS CONFIG_COMMANDS = $CONFIG_COMMANDS $ $0 $@ on `(hostname || uname -n) 2>/dev/null | sed 1q` " _ACEOF case $ac_config_files in *" "*) set x $ac_config_files; shift; ac_config_files=$*;; esac case $ac_config_headers in *" "*) set x $ac_config_headers; shift; ac_config_headers=$*;; esac cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 # Files that config.status was made for. config_files="$ac_config_files" config_headers="$ac_config_headers" _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 ac_cs_usage="\ '$as_me' instantiates files and other configuration actions from templates according to the current configuration. Unless the files and actions are specified as TAGs, all are instantiated by default. Usage: $0 [OPTION]... [TAG]... -h, --help print this help, then exit -V, --version print version number and configuration settings, then exit --config print configuration, then exit -q, --quiet, --silent do not print progress messages -d, --debug don't remove temporary files --recheck update $as_me by reconfiguring in the same conditions --file=FILE[:TEMPLATE] instantiate the configuration file FILE --header=FILE[:TEMPLATE] instantiate the configuration header FILE Configuration files: $config_files Configuration headers: $config_headers Report bugs to . GNU Screen home page: . General help using GNU software: ." _ACEOF ac_cs_config=`printf "%s\n" "$ac_configure_args" | sed "$ac_safe_unquote"` ac_cs_config_escaped=`printf "%s\n" "$ac_cs_config" | sed "s/^ //; s/'/'\\\\\\\\''/g"` cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_cs_config='$ac_cs_config_escaped' ac_cs_version="\\ GNU Screen config.status 5.0.2 configured by $0, generated by GNU Autoconf 2.72, with options \\"\$ac_cs_config\\" Copyright (C) 2023 Free Software Foundation, Inc. This config.status script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it." ac_pwd='$ac_pwd' srcdir='$srcdir' INSTALL='$INSTALL' AWK='$AWK' test -n "\$AWK" || AWK=awk _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # The default lists apply if the user does not specify any file. ac_need_defaults=: while test $# != 0 do case $1 in --*=?*) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'` ac_shift=: ;; --*=) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg= ac_shift=: ;; *) ac_option=$1 ac_optarg=$2 ac_shift=shift ;; esac case $ac_option in # Handling of the options. -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) ac_cs_recheck=: ;; --version | --versio | --versi | --vers | --ver | --ve | --v | -V ) printf "%s\n" "$ac_cs_version"; exit ;; --config | --confi | --conf | --con | --co | --c ) printf "%s\n" "$ac_cs_config"; exit ;; --debug | --debu | --deb | --de | --d | -d ) debug=: ;; --file | --fil | --fi | --f ) $ac_shift case $ac_optarg in *\'*) ac_optarg=`printf "%s\n" "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; '') as_fn_error $? "missing file argument" ;; esac as_fn_append CONFIG_FILES " '$ac_optarg'" ac_need_defaults=false;; --header | --heade | --head | --hea ) $ac_shift case $ac_optarg in *\'*) ac_optarg=`printf "%s\n" "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; esac as_fn_append CONFIG_HEADERS " '$ac_optarg'" ac_need_defaults=false;; --he | --h) # Conflict between --help and --header as_fn_error $? "ambiguous option: '$1' Try '$0 --help' for more information.";; --help | --hel | -h ) printf "%s\n" "$ac_cs_usage"; exit ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil | --si | --s) ac_cs_silent=: ;; # This is an error. -*) as_fn_error $? "unrecognized option: '$1' Try '$0 --help' for more information." ;; *) as_fn_append ac_config_targets " $1" ac_need_defaults=false ;; esac shift done ac_configure_extra_args= if $ac_cs_silent; then exec 6>/dev/null ac_configure_extra_args="$ac_configure_extra_args --silent" fi _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 if \$ac_cs_recheck; then set X $SHELL '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion shift \printf "%s\n" "running CONFIG_SHELL=$SHELL \$*" >&6 CONFIG_SHELL='$SHELL' export CONFIG_SHELL exec "\$@" fi _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 exec 5>>config.log { echo sed 'h;s/./-/g;s/^.../@%:@@%:@ /;s/...$/ @%:@@%:@/;p;x;p;x' <<_ASBOX @%:@@%:@ Running $as_me. @%:@@%:@ _ASBOX printf "%s\n" "$ac_log" } >&5 _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # Handling of arguments. for ac_config_target in $ac_config_targets do case $ac_config_target in "config.h") CONFIG_HEADERS="$CONFIG_HEADERS config.h" ;; "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;; "doc/Makefile") CONFIG_FILES="$CONFIG_FILES doc/Makefile" ;; *) as_fn_error $? "invalid argument: '$ac_config_target'" "$LINENO" 5;; esac done # If the user did not use the arguments to specify the items to instantiate, # then the envvar interface is used. Set only those that are not. # We use the long form for the default assignment because of an extremely # bizarre bug on SunOS 4.1.3. if $ac_need_defaults; then test ${CONFIG_FILES+y} || CONFIG_FILES=$config_files test ${CONFIG_HEADERS+y} || CONFIG_HEADERS=$config_headers fi # Have a temporary directory for convenience. Make it in the build tree # simply because there is no reason against having it here, and in addition, # creating and moving files from /tmp can sometimes cause problems. # Hook for its removal unless debugging. # Note that there is a small window in which the directory will not be cleaned: # after its creation but before its name has been assigned to '$tmp'. $debug || { tmp= ac_tmp= trap 'exit_status=$? : "${ac_tmp:=$tmp}" { test ! -d "$ac_tmp" || rm -fr "$ac_tmp"; } && exit $exit_status ' 0 trap 'as_fn_exit 1' 1 2 13 15 } # Create a (secure) tmp directory for tmp files. { tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` && test -d "$tmp" } || { tmp=./conf$$-$RANDOM (umask 077 && mkdir "$tmp") } || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5 ac_tmp=$tmp # Set up the scripts for CONFIG_FILES section. # No need to generate them if there are no CONFIG_FILES. # This happens for instance with './config.status config.h'. if test -n "$CONFIG_FILES"; then ac_cr=`echo X | tr X '\015'` # On cygwin, bash can eat \r inside `` if the user requested igncr. # But we know of no other shell where ac_cr would be empty at this # point, so we can use a bashism as a fallback. if test "x$ac_cr" = x; then eval ac_cr=\$\'\\r\' fi ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' /dev/null` if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then ac_cs_awk_cr='\\r' else ac_cs_awk_cr=$ac_cr fi echo 'BEGIN {' >"$ac_tmp/subs1.awk" && _ACEOF { echo "cat >conf$$subs.awk <<_ACEOF" && echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' && echo "_ACEOF" } >conf$$subs.sh || as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_num=`echo "$ac_subst_vars" | grep -c '^'` ac_delim='%!_!# ' for ac_last_try in false false false false false :; do . ./conf$$subs.sh || as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X` if test $ac_delim_n = $ac_delim_num; then break elif $ac_last_try; then as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 else ac_delim="$ac_delim!$ac_delim _$ac_delim!! " fi done rm -f conf$$subs.sh cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 cat >>"\$ac_tmp/subs1.awk" <<\\_ACAWK && _ACEOF sed -n ' h s/^/S["/; s/!.*/"]=/ p g s/^[^!]*!// :repl t repl s/'"$ac_delim"'$// t delim :nl h s/\(.\{148\}\)..*/\1/ t more1 s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/ p n b repl :more1 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t nl :delim h s/\(.\{148\}\)..*/\1/ t more2 s/["\\]/\\&/g; s/^/"/; s/$/"/ p b :more2 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t delim ' >$CONFIG_STATUS || ac_write_fail=1 rm -f conf$$subs.awk cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 _ACAWK cat >>"\$ac_tmp/subs1.awk" <<_ACAWK && for (key in S) S_is_set[key] = 1 FS = "" } { line = $ 0 nfields = split(line, field, "@") substed = 0 len = length(field[1]) for (i = 2; i < nfields; i++) { key = field[i] keylen = length(key) if (S_is_set[key]) { value = S[key] line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3) len += length(value) + length(field[++i]) substed = 1 } else len += 1 + keylen } print line } _ACAWK _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g" else cat fi < "$ac_tmp/subs1.awk" > "$ac_tmp/subs.awk" \ || as_fn_error $? "could not setup config files machinery" "$LINENO" 5 _ACEOF # VPATH may cause trouble with some makes, so we remove sole $(srcdir), # ${srcdir} and @srcdir@ entries from VPATH if srcdir is ".", strip leading and # trailing colons and then remove the whole line if VPATH becomes empty # (actually we leave an empty line to preserve line numbers). if test "x$srcdir" = x.; then ac_vpsub='/^[ ]*VPATH[ ]*=[ ]*/{ h s/// s/^/:/ s/[ ]*$/:/ s/:\$(srcdir):/:/g s/:\${srcdir}:/:/g s/:@srcdir@:/:/g s/^:*// s/:*$// x s/\(=[ ]*\).*/\1/ G s/\n// s/^[^=]*=[ ]*$// }' fi cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 fi # test -n "$CONFIG_FILES" # Set up the scripts for CONFIG_HEADERS section. # No need to generate them if there are no CONFIG_HEADERS. # This happens for instance with './config.status Makefile'. if test -n "$CONFIG_HEADERS"; then cat >"$ac_tmp/defines.awk" <<\_ACAWK || BEGIN { _ACEOF # Transform confdefs.h into an awk script 'defines.awk', embedded as # here-document in config.status, that substitutes the proper values into # config.h.in to produce config.h. # Create a delimiter string that does not exist in confdefs.h, to ease # handling of long lines. ac_delim='%!_!# ' for ac_last_try in false false :; do ac_tt=`sed -n "/$ac_delim/p" confdefs.h` if test -z "$ac_tt"; then break elif $ac_last_try; then as_fn_error $? "could not make $CONFIG_HEADERS" "$LINENO" 5 else ac_delim="$ac_delim!$ac_delim _$ac_delim!! " fi done # For the awk script, D is an array of macro values keyed by name, # likewise P contains macro parameters if any. Preserve backslash # newline sequences. ac_word_re=[_$as_cr_Letters][_$as_cr_alnum]* sed -n ' s/.\{148\}/&'"$ac_delim"'/g t rset :rset s/^[ ]*#[ ]*define[ ][ ]*/ / t def d :def s/\\$// t bsnl s/["\\]/\\&/g s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ D["\1"]=" \3"/p s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2"/p d :bsnl s/["\\]/\\&/g s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ D["\1"]=" \3\\\\\\n"\\/p t cont s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2\\\\\\n"\\/p t cont d :cont n s/.\{148\}/&'"$ac_delim"'/g t clear :clear s/\\$// t bsnlc s/["\\]/\\&/g; s/^/"/; s/$/"/p d :bsnlc s/["\\]/\\&/g; s/^/"/; s/$/\\\\\\n"\\/p b cont ' >$CONFIG_STATUS || ac_write_fail=1 cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 for (key in D) D_is_set[key] = 1 FS = "" } /^[\t ]*#[\t ]*(define|undef)[\t ]+$ac_word_re([\t (]|\$)/ { line = \$ 0 split(line, arg, " ") if (arg[1] == "#") { defundef = arg[2] mac1 = arg[3] } else { defundef = substr(arg[1], 2) mac1 = arg[2] } split(mac1, mac2, "(") #) macro = mac2[1] prefix = substr(line, 1, index(line, defundef) - 1) if (D_is_set[macro]) { # Preserve the white space surrounding the "#". print prefix "define", macro P[macro] D[macro] next } else { # Replace #undef with comments. This is necessary, for example, # in the case of _POSIX_SOURCE, which is predefined and required # on some systems where configure will not decide to define it. if (defundef == "undef") { print "/*", prefix defundef, macro, "*/" next } } } { print } _ACAWK _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 as_fn_error $? "could not setup config headers machinery" "$LINENO" 5 fi # test -n "$CONFIG_HEADERS" eval set X " :F $CONFIG_FILES :H $CONFIG_HEADERS " shift for ac_tag do case $ac_tag in :[FHLC]) ac_mode=$ac_tag; continue;; esac case $ac_mode$ac_tag in :[FHL]*:*);; :L* | :C*:*) as_fn_error $? "invalid tag '$ac_tag'" "$LINENO" 5;; :[FH]-) ac_tag=-:-;; :[FH]*) ac_tag=$ac_tag:$ac_tag.in;; esac ac_save_IFS=$IFS IFS=: set x $ac_tag IFS=$ac_save_IFS shift ac_file=$1 shift case $ac_mode in :L) ac_source=$1;; :[FH]) ac_file_inputs= for ac_f do case $ac_f in -) ac_f="$ac_tmp/stdin";; *) # Look for the file first in the build tree, then in the source tree # (if the path is not absolute). The absolute path cannot be DOS-style, # because $ac_f cannot contain ':'. test -f "$ac_f" || case $ac_f in [\\/$]*) false;; *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";; esac || as_fn_error 1 "cannot find input file: '$ac_f'" "$LINENO" 5;; esac case $ac_f in *\'*) ac_f=`printf "%s\n" "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac as_fn_append ac_file_inputs " '$ac_f'" done # Let's still pretend it is 'configure' which instantiates (i.e., don't # use $as_me), people would be surprised to read: # /* config.h. Generated by config.status. */ configure_input='Generated from '` printf "%s\n" "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g' `' by configure.' if test x"$ac_file" != x-; then configure_input="$ac_file. $configure_input" { printf "%s\n" "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5 printf "%s\n" "$as_me: creating $ac_file" >&6;} fi # Neutralize special characters interpreted by sed in replacement strings. case $configure_input in #( *\&* | *\|* | *\\* ) ac_sed_conf_input=`printf "%s\n" "$configure_input" | sed 's/[\\\\&|]/\\\\&/g'`;; #( *) ac_sed_conf_input=$configure_input;; esac case $ac_tag in *:-:* | *:-) cat >"$ac_tmp/stdin" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; esac ;; esac ac_dir=`$as_dirname -- "$ac_file" || $as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$ac_file" : 'X\(//\)[^/]' \| \ X"$ac_file" : 'X\(//\)$' \| \ X"$ac_file" : 'X\(/\)' \| . 2>/dev/null || printf "%s\n" X"$ac_file" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` as_dir="$ac_dir"; as_fn_mkdir_p ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`printf "%s\n" "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`printf "%s\n" "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix case $ac_mode in :F) # # CONFIG_FILE # case $INSTALL in [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;; *) ac_INSTALL=$ac_top_build_prefix$INSTALL ;; esac _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # If the template does not know about datarootdir, expand it. # FIXME: This hack should be removed a few years after 2.60. ac_datarootdir_hack=; ac_datarootdir_seen= ac_sed_dataroot=' /datarootdir/ { p q } /@datadir@/p /@docdir@/p /@infodir@/p /@localedir@/p /@mandir@/p' case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in *datarootdir*) ac_datarootdir_seen=yes;; *@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 printf "%s\n" "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;} _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_datarootdir_hack=' s&@datadir@&$datadir&g s&@docdir@&$docdir&g s&@infodir@&$infodir&g s&@localedir@&$localedir&g s&@mandir@&$mandir&g s&\\\${datarootdir}&$datarootdir&g' ;; esac _ACEOF # Neutralize VPATH when '$srcdir' = '.'. # Shell code in configure.ac might set extrasub. # FIXME: do we really want to maintain this feature? cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_sed_extra="$ac_vpsub $extrasub _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 :t /@[a-zA-Z_][a-zA-Z_0-9]*@/!b s|@configure_input@|$ac_sed_conf_input|;t t s&@top_builddir@&$ac_top_builddir_sub&;t t s&@top_build_prefix@&$ac_top_build_prefix&;t t s&@srcdir@&$ac_srcdir&;t t s&@abs_srcdir@&$ac_abs_srcdir&;t t s&@top_srcdir@&$ac_top_srcdir&;t t s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t s&@builddir@&$ac_builddir&;t t s&@abs_builddir@&$ac_abs_builddir&;t t s&@abs_top_builddir@&$ac_abs_top_builddir&;t t s&@INSTALL@&$ac_INSTALL&;t t $ac_datarootdir_hack " eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$ac_tmp/subs.awk" \ >$ac_tmp/out || as_fn_error $? "could not create $ac_file" "$LINENO" 5 test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && { ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_out"; } && { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' \ "$ac_tmp/out"`; test -z "$ac_out"; } && { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable 'datarootdir' which seems to be undefined. Please make sure it is defined" >&5 printf "%s\n" "$as_me: WARNING: $ac_file contains a reference to the variable 'datarootdir' which seems to be undefined. Please make sure it is defined" >&2;} rm -f "$ac_tmp/stdin" case $ac_file in -) cat "$ac_tmp/out" && rm -f "$ac_tmp/out";; *) rm -f "$ac_file" && mv "$ac_tmp/out" "$ac_file";; esac \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; :H) # # CONFIG_HEADER # if test x"$ac_file" != x-; then { printf "%s\n" "/* $configure_input */" >&1 \ && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" } >"$ac_tmp/config.h" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 if diff "$ac_file" "$ac_tmp/config.h" >/dev/null 2>&1; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: $ac_file is unchanged" >&5 printf "%s\n" "$as_me: $ac_file is unchanged" >&6;} else rm -f "$ac_file" mv "$ac_tmp/config.h" "$ac_file" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 fi else printf "%s\n" "/* $configure_input */" >&1 \ && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" \ || as_fn_error $? "could not create -" "$LINENO" 5 fi ;; esac done # for ac_tag as_fn_exit 0 _ACEOF ac_clean_files=$ac_clean_files_save test $ac_write_fail = 0 || as_fn_error $? "write failure creating $CONFIG_STATUS" "$LINENO" 5 # configure is writing to config.log, and then calls config.status. # config.status does its own redirection, appending to config.log. # Unfortunately, on DOS this fails, as config.log is still kept open # by configure, so config.status won't be able to write to it; its # output is simply discarded. So we exec the FD to /dev/null, # effectively closing config.log, so it can be properly (re)opened and # appended to by config.status. When coming back to configure, we # need to make the FD available again. if test "$no_create" != yes; then ac_cs_success=: ac_config_status_args= test "$silent" = yes && ac_config_status_args="$ac_config_status_args --quiet" exec 5>/dev/null $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false exec 5>>config.log # Use ||, not &&, to avoid exiting from the if with $? = 1, which # would make configure fail if this is the last instruction. $ac_cs_success || as_fn_exit 1 fi if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5 printf "%s\n" "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;} fi echo "" echo "Configuration:" echo "" echo " PAM support: .............................. $enable_pam" echo " telnet support: ........................... $enable_telnet" echo " utmp support: ............................. $enable_utmp" echo " global socket directory: .................. $enable_socket_dir" echo "" echo " system screenrc location: ................. $with_system_screenrc" echo " pty mode: ................................. $with_pty_mode" echo " pty group: ................................ $with_pty_group" echo " pty on read only file system: ............. $with_pty_rofs" echo "" if test "x$enable_pam" != "xyes" then : echo "!!! WARNING !!!" echo "YOU ARE DISABLING PAM SUPPORT!" echo "FOR screen TO WORK IT WILL NEED TO RUN AS SUID root BINARY" echo "THIS CONFIGURATION IS _HIGHLY_ NOT RECOMMENDED!" echo "!!! WARNING !!!" fi screen-5.0.2/autom4te.cache/traces.10000664000175000017500000007321015224432734015623 0ustar alexalexm4trace:configure.ac:1: -1- AC_INIT([GNU Screen], [5.0.2], [https://savannah.gnu.org/bugs/?group=screen], [screen], [https://www.gnu.org/software/screen/]) m4trace:configure.ac:1: -1- m4_pattern_forbid([^_?A[CHUM]_]) m4trace:configure.ac:1: -1- m4_pattern_forbid([_AC_]) m4trace:configure.ac:1: -1- m4_pattern_forbid([^LIBOBJS$], [do not use LIBOBJS directly, use AC_LIBOBJ (see section 'AC_LIBOBJ vs LIBOBJS']) m4trace:configure.ac:1: -1- m4_pattern_allow([^AS_FLAGS$]) m4trace:configure.ac:1: -1- m4_pattern_forbid([^_?m4_]) m4trace:configure.ac:1: -1- m4_pattern_forbid([^dnl$]) m4trace:configure.ac:1: -1- m4_pattern_forbid([^_?AS_]) m4trace:configure.ac:1: -1- AC_SUBST([SHELL]) m4trace:configure.ac:1: -1- AC_SUBST_TRACE([SHELL]) m4trace:configure.ac:1: -1- m4_pattern_allow([^SHELL$]) m4trace:configure.ac:1: -1- AC_SUBST([PATH_SEPARATOR]) m4trace:configure.ac:1: -1- AC_SUBST_TRACE([PATH_SEPARATOR]) m4trace:configure.ac:1: -1- m4_pattern_allow([^PATH_SEPARATOR$]) m4trace:configure.ac:1: -1- AC_SUBST([PACKAGE_NAME], [m4_ifdef([AC_PACKAGE_NAME], ['AC_PACKAGE_NAME'])]) m4trace:configure.ac:1: -1- AC_SUBST_TRACE([PACKAGE_NAME]) m4trace:configure.ac:1: -1- m4_pattern_allow([^PACKAGE_NAME$]) m4trace:configure.ac:1: -1- AC_SUBST([PACKAGE_TARNAME], [m4_ifdef([AC_PACKAGE_TARNAME], ['AC_PACKAGE_TARNAME'])]) m4trace:configure.ac:1: -1- AC_SUBST_TRACE([PACKAGE_TARNAME]) m4trace:configure.ac:1: -1- m4_pattern_allow([^PACKAGE_TARNAME$]) m4trace:configure.ac:1: -1- AC_SUBST([PACKAGE_VERSION], [m4_ifdef([AC_PACKAGE_VERSION], ['AC_PACKAGE_VERSION'])]) m4trace:configure.ac:1: -1- AC_SUBST_TRACE([PACKAGE_VERSION]) m4trace:configure.ac:1: -1- m4_pattern_allow([^PACKAGE_VERSION$]) m4trace:configure.ac:1: -1- AC_SUBST([PACKAGE_STRING], [m4_ifdef([AC_PACKAGE_STRING], ['AC_PACKAGE_STRING'])]) m4trace:configure.ac:1: -1- AC_SUBST_TRACE([PACKAGE_STRING]) m4trace:configure.ac:1: -1- m4_pattern_allow([^PACKAGE_STRING$]) m4trace:configure.ac:1: -1- AC_SUBST([PACKAGE_BUGREPORT], [m4_ifdef([AC_PACKAGE_BUGREPORT], ['AC_PACKAGE_BUGREPORT'])]) m4trace:configure.ac:1: -1- AC_SUBST_TRACE([PACKAGE_BUGREPORT]) m4trace:configure.ac:1: -1- m4_pattern_allow([^PACKAGE_BUGREPORT$]) m4trace:configure.ac:1: -1- AC_SUBST([PACKAGE_URL], [m4_ifdef([AC_PACKAGE_URL], ['AC_PACKAGE_URL'])]) m4trace:configure.ac:1: -1- AC_SUBST_TRACE([PACKAGE_URL]) m4trace:configure.ac:1: -1- m4_pattern_allow([^PACKAGE_URL$]) m4trace:configure.ac:1: -1- AC_SUBST([exec_prefix], [NONE]) m4trace:configure.ac:1: -1- AC_SUBST_TRACE([exec_prefix]) m4trace:configure.ac:1: -1- m4_pattern_allow([^exec_prefix$]) m4trace:configure.ac:1: -1- AC_SUBST([prefix], [NONE]) m4trace:configure.ac:1: -1- AC_SUBST_TRACE([prefix]) m4trace:configure.ac:1: -1- m4_pattern_allow([^prefix$]) m4trace:configure.ac:1: -1- AC_SUBST([program_transform_name], [s,x,x,]) m4trace:configure.ac:1: -1- AC_SUBST_TRACE([program_transform_name]) m4trace:configure.ac:1: -1- m4_pattern_allow([^program_transform_name$]) m4trace:configure.ac:1: -1- AC_SUBST([bindir], ['${exec_prefix}/bin']) m4trace:configure.ac:1: -1- AC_SUBST_TRACE([bindir]) m4trace:configure.ac:1: -1- m4_pattern_allow([^bindir$]) m4trace:configure.ac:1: -1- AC_SUBST([sbindir], ['${exec_prefix}/sbin']) m4trace:configure.ac:1: -1- AC_SUBST_TRACE([sbindir]) m4trace:configure.ac:1: -1- m4_pattern_allow([^sbindir$]) m4trace:configure.ac:1: -1- AC_SUBST([libexecdir], ['${exec_prefix}/libexec']) m4trace:configure.ac:1: -1- AC_SUBST_TRACE([libexecdir]) m4trace:configure.ac:1: -1- m4_pattern_allow([^libexecdir$]) m4trace:configure.ac:1: -1- AC_SUBST([datarootdir], ['${prefix}/share']) m4trace:configure.ac:1: -1- AC_SUBST_TRACE([datarootdir]) m4trace:configure.ac:1: -1- m4_pattern_allow([^datarootdir$]) m4trace:configure.ac:1: -1- AC_SUBST([datadir], ['${datarootdir}']) m4trace:configure.ac:1: -1- AC_SUBST_TRACE([datadir]) m4trace:configure.ac:1: -1- m4_pattern_allow([^datadir$]) m4trace:configure.ac:1: -1- AC_SUBST([sysconfdir], ['${prefix}/etc']) m4trace:configure.ac:1: -1- AC_SUBST_TRACE([sysconfdir]) m4trace:configure.ac:1: -1- m4_pattern_allow([^sysconfdir$]) m4trace:configure.ac:1: -1- AC_SUBST([sharedstatedir], ['${prefix}/com']) m4trace:configure.ac:1: -1- AC_SUBST_TRACE([sharedstatedir]) m4trace:configure.ac:1: -1- m4_pattern_allow([^sharedstatedir$]) m4trace:configure.ac:1: -1- AC_SUBST([localstatedir], ['${prefix}/var']) m4trace:configure.ac:1: -1- AC_SUBST_TRACE([localstatedir]) m4trace:configure.ac:1: -1- m4_pattern_allow([^localstatedir$]) m4trace:configure.ac:1: -1- AC_SUBST([runstatedir], ['${localstatedir}/run']) m4trace:configure.ac:1: -1- AC_SUBST_TRACE([runstatedir]) m4trace:configure.ac:1: -1- m4_pattern_allow([^runstatedir$]) m4trace:configure.ac:1: -1- AC_SUBST([includedir], ['${prefix}/include']) m4trace:configure.ac:1: -1- AC_SUBST_TRACE([includedir]) m4trace:configure.ac:1: -1- m4_pattern_allow([^includedir$]) m4trace:configure.ac:1: -1- AC_SUBST([oldincludedir], ['/usr/include']) m4trace:configure.ac:1: -1- AC_SUBST_TRACE([oldincludedir]) m4trace:configure.ac:1: -1- m4_pattern_allow([^oldincludedir$]) m4trace:configure.ac:1: -1- AC_SUBST([docdir], [m4_ifset([AC_PACKAGE_TARNAME], ['${datarootdir}/doc/${PACKAGE_TARNAME}'], ['${datarootdir}/doc/${PACKAGE}'])]) m4trace:configure.ac:1: -1- AC_SUBST_TRACE([docdir]) m4trace:configure.ac:1: -1- m4_pattern_allow([^docdir$]) m4trace:configure.ac:1: -1- AC_SUBST([infodir], ['${datarootdir}/info']) m4trace:configure.ac:1: -1- AC_SUBST_TRACE([infodir]) m4trace:configure.ac:1: -1- m4_pattern_allow([^infodir$]) m4trace:configure.ac:1: -1- AC_SUBST([htmldir], ['${docdir}']) m4trace:configure.ac:1: -1- AC_SUBST_TRACE([htmldir]) m4trace:configure.ac:1: -1- m4_pattern_allow([^htmldir$]) m4trace:configure.ac:1: -1- AC_SUBST([dvidir], ['${docdir}']) m4trace:configure.ac:1: -1- AC_SUBST_TRACE([dvidir]) m4trace:configure.ac:1: -1- m4_pattern_allow([^dvidir$]) m4trace:configure.ac:1: -1- AC_SUBST([pdfdir], ['${docdir}']) m4trace:configure.ac:1: -1- AC_SUBST_TRACE([pdfdir]) m4trace:configure.ac:1: -1- m4_pattern_allow([^pdfdir$]) m4trace:configure.ac:1: -1- AC_SUBST([psdir], ['${docdir}']) m4trace:configure.ac:1: -1- AC_SUBST_TRACE([psdir]) m4trace:configure.ac:1: -1- m4_pattern_allow([^psdir$]) m4trace:configure.ac:1: -1- AC_SUBST([libdir], ['${exec_prefix}/lib']) m4trace:configure.ac:1: -1- AC_SUBST_TRACE([libdir]) m4trace:configure.ac:1: -1- m4_pattern_allow([^libdir$]) m4trace:configure.ac:1: -1- AC_SUBST([localedir], ['${datarootdir}/locale']) m4trace:configure.ac:1: -1- AC_SUBST_TRACE([localedir]) m4trace:configure.ac:1: -1- m4_pattern_allow([^localedir$]) m4trace:configure.ac:1: -1- AC_SUBST([mandir], ['${datarootdir}/man']) m4trace:configure.ac:1: -1- AC_SUBST_TRACE([mandir]) m4trace:configure.ac:1: -1- m4_pattern_allow([^mandir$]) m4trace:configure.ac:1: -1- AC_DEFINE_TRACE_LITERAL([PACKAGE_NAME]) m4trace:configure.ac:1: -1- m4_pattern_allow([^PACKAGE_NAME$]) m4trace:configure.ac:1: -1- AH_OUTPUT([PACKAGE_NAME], [/* Define to the full name of this package. */ @%:@undef PACKAGE_NAME]) m4trace:configure.ac:1: -1- AC_DEFINE_TRACE_LITERAL([PACKAGE_TARNAME]) m4trace:configure.ac:1: -1- m4_pattern_allow([^PACKAGE_TARNAME$]) m4trace:configure.ac:1: -1- AH_OUTPUT([PACKAGE_TARNAME], [/* Define to the one symbol short name of this package. */ @%:@undef PACKAGE_TARNAME]) m4trace:configure.ac:1: -1- AC_DEFINE_TRACE_LITERAL([PACKAGE_VERSION]) m4trace:configure.ac:1: -1- m4_pattern_allow([^PACKAGE_VERSION$]) m4trace:configure.ac:1: -1- AH_OUTPUT([PACKAGE_VERSION], [/* Define to the version of this package. */ @%:@undef PACKAGE_VERSION]) m4trace:configure.ac:1: -1- AC_DEFINE_TRACE_LITERAL([PACKAGE_STRING]) m4trace:configure.ac:1: -1- m4_pattern_allow([^PACKAGE_STRING$]) m4trace:configure.ac:1: -1- AH_OUTPUT([PACKAGE_STRING], [/* Define to the full name and version of this package. */ @%:@undef PACKAGE_STRING]) m4trace:configure.ac:1: -1- AC_DEFINE_TRACE_LITERAL([PACKAGE_BUGREPORT]) m4trace:configure.ac:1: -1- m4_pattern_allow([^PACKAGE_BUGREPORT$]) m4trace:configure.ac:1: -1- AH_OUTPUT([PACKAGE_BUGREPORT], [/* Define to the address where bug reports for this package should be sent. */ @%:@undef PACKAGE_BUGREPORT]) m4trace:configure.ac:1: -1- AC_DEFINE_TRACE_LITERAL([PACKAGE_URL]) m4trace:configure.ac:1: -1- m4_pattern_allow([^PACKAGE_URL$]) m4trace:configure.ac:1: -1- AH_OUTPUT([PACKAGE_URL], [/* Define to the home page for this package. */ @%:@undef PACKAGE_URL]) m4trace:configure.ac:1: -1- AC_SUBST([DEFS]) m4trace:configure.ac:1: -1- AC_SUBST_TRACE([DEFS]) m4trace:configure.ac:1: -1- m4_pattern_allow([^DEFS$]) m4trace:configure.ac:1: -1- AC_SUBST([ECHO_C]) m4trace:configure.ac:1: -1- AC_SUBST_TRACE([ECHO_C]) m4trace:configure.ac:1: -1- m4_pattern_allow([^ECHO_C$]) m4trace:configure.ac:1: -1- AC_SUBST([ECHO_N]) m4trace:configure.ac:1: -1- AC_SUBST_TRACE([ECHO_N]) m4trace:configure.ac:1: -1- m4_pattern_allow([^ECHO_N$]) m4trace:configure.ac:1: -1- AC_SUBST([ECHO_T]) m4trace:configure.ac:1: -1- AC_SUBST_TRACE([ECHO_T]) m4trace:configure.ac:1: -1- m4_pattern_allow([^ECHO_T$]) m4trace:configure.ac:1: -1- AC_SUBST([LIBS]) m4trace:configure.ac:1: -1- AC_SUBST_TRACE([LIBS]) m4trace:configure.ac:1: -1- m4_pattern_allow([^LIBS$]) m4trace:configure.ac:1: -1- AC_SUBST([build_alias]) m4trace:configure.ac:1: -1- AC_SUBST_TRACE([build_alias]) m4trace:configure.ac:1: -1- m4_pattern_allow([^build_alias$]) m4trace:configure.ac:1: -1- AC_SUBST([host_alias]) m4trace:configure.ac:1: -1- AC_SUBST_TRACE([host_alias]) m4trace:configure.ac:1: -1- m4_pattern_allow([^host_alias$]) m4trace:configure.ac:1: -1- AC_SUBST([target_alias]) m4trace:configure.ac:1: -1- AC_SUBST_TRACE([target_alias]) m4trace:configure.ac:1: -1- m4_pattern_allow([^target_alias$]) m4trace:configure.ac:4: -1- AC_CONFIG_HEADERS([config.h]) m4trace:configure.ac:7: -1- AC_DEFINE_TRACE_LITERAL([VERSION_MAJOR]) m4trace:configure.ac:7: -1- m4_pattern_allow([^VERSION_MAJOR$]) m4trace:configure.ac:7: -1- AH_OUTPUT([VERSION_MAJOR], [/* Major version of GNU screen */ @%:@undef VERSION_MAJOR]) m4trace:configure.ac:10: -1- AC_DEFINE_TRACE_LITERAL([VERSION_MINOR]) m4trace:configure.ac:10: -1- m4_pattern_allow([^VERSION_MINOR$]) m4trace:configure.ac:10: -1- AH_OUTPUT([VERSION_MINOR], [/* Minor version of GNU screen */ @%:@undef VERSION_MINOR]) m4trace:configure.ac:13: -1- AC_DEFINE_TRACE_LITERAL([VERSION_REVISION]) m4trace:configure.ac:13: -1- m4_pattern_allow([^VERSION_REVISION$]) m4trace:configure.ac:13: -1- AH_OUTPUT([VERSION_REVISION], [/* Micro revision of GNU screen */ @%:@undef VERSION_REVISION]) m4trace:configure.ac:18: -1- AH_OUTPUT([HAVE_EXECVPE], [/* system has execvpe() defined */ @%:@undef HAVE_EXECVPE]) m4trace:configure.ac:19: -1- AH_OUTPUT([HAVE_OPENPTY], [/* system has openpty() defined */ @%:@undef HAVE_OPENPTY]) m4trace:configure.ac:22: -1- AH_OUTPUT([ENABLE_UTMP], [/* Enable utmp support */ @%:@undef ENABLE_UTMP]) m4trace:configure.ac:23: -1- AH_OUTPUT([HAVE_UTEMPTER], [/* system has utempter helper binary */ @%:@undef HAVE_UTEMPTER]) m4trace:configure.ac:24: -1- AH_OUTPUT([HAVE_UT_EXIT], [/* utmpx struct has ut_exit field */ @%:@undef HAVE_UT_EXIT]) m4trace:configure.ac:25: -1- AH_OUTPUT([HAVE_UT_HOST], [/* utmpx struct has ut_host field */ @%:@undef HAVE_UT_HOST]) m4trace:configure.ac:28: -1- AH_OUTPUT([ENABLE_PAM], [/* Enable Pluggable Authentication Modules support */ @%:@undef ENABLE_PAM]) m4trace:configure.ac:31: -1- AH_OUTPUT([ENABLE_TELNET], [/* Enable built-in telnet client */ @%:@undef ENABLE_TELNET]) m4trace:configure.ac:34: -1- AH_OUTPUT([SOCKET_DIR], [/* Path to socket directory */ @%:@undef SOCKET_DIR]) m4trace:configure.ac:37: -1- AH_OUTPUT([SYSTEM_SCREENRC], [/* Path to system screenrc */ @%:@undef SYSTEM_SCREENRC]) m4trace:configure.ac:40: -1- AH_OUTPUT([PTY_MODE], [/* Default mode for pty devices */ @%:@undef PTY_MODE]) m4trace:configure.ac:41: -1- AH_OUTPUT([PTY_GROUP], [/* Default group for pty devices */ @%:@undef PTY_GROUP]) m4trace:configure.ac:42: -1- AH_OUTPUT([PTY_ROFS], [/* pty devices are on read only filesystem */ @%:@undef PTY_ROFS]) m4trace:configure.ac:49: -1- AH_OUTPUT([USE_SYSTEM_EXTENSIONS], [/* Enable extensions on AIX, Interix, z/OS. */ #ifndef _ALL_SOURCE # undef _ALL_SOURCE #endif /* Enable general extensions on macOS. */ #ifndef _DARWIN_C_SOURCE # undef _DARWIN_C_SOURCE #endif /* Enable general extensions on Solaris. */ #ifndef __EXTENSIONS__ # undef __EXTENSIONS__ #endif /* Enable GNU extensions on systems that have them. */ #ifndef _GNU_SOURCE # undef _GNU_SOURCE #endif /* Enable X/Open compliant socket functions that do not require linking with -lxnet on HP-UX 11.11. */ #ifndef _HPUX_ALT_XOPEN_SOCKET_API # undef _HPUX_ALT_XOPEN_SOCKET_API #endif /* Identify the host operating system as Minix. This macro does not affect the system headers\' behavior. A future release of Autoconf may stop defining this macro. */ #ifndef _MINIX # undef _MINIX #endif /* Enable general extensions on NetBSD. Enable NetBSD compatibility extensions on Minix. */ #ifndef _NETBSD_SOURCE # undef _NETBSD_SOURCE #endif /* Enable OpenBSD compatibility extensions on NetBSD. Oddly enough, this does nothing on OpenBSD. */ #ifndef _OPENBSD_SOURCE # undef _OPENBSD_SOURCE #endif /* Define to 1 if needed for POSIX-compatible behavior. */ #ifndef _POSIX_SOURCE # undef _POSIX_SOURCE #endif /* Define to 2 if needed for POSIX-compatible behavior. */ #ifndef _POSIX_1_SOURCE # undef _POSIX_1_SOURCE #endif /* Enable POSIX-compatible threading on Solaris. */ #ifndef _POSIX_PTHREAD_SEMANTICS # undef _POSIX_PTHREAD_SEMANTICS #endif /* Enable extensions specified by ISO/IEC TS 18661-5:2014. */ #ifndef __STDC_WANT_IEC_60559_ATTRIBS_EXT__ # undef __STDC_WANT_IEC_60559_ATTRIBS_EXT__ #endif /* Enable extensions specified by ISO/IEC TS 18661-1:2014. */ #ifndef __STDC_WANT_IEC_60559_BFP_EXT__ # undef __STDC_WANT_IEC_60559_BFP_EXT__ #endif /* Enable extensions specified by ISO/IEC TS 18661-2:2015. */ #ifndef __STDC_WANT_IEC_60559_DFP_EXT__ # undef __STDC_WANT_IEC_60559_DFP_EXT__ #endif /* Enable extensions specified by C23 Annex F. */ #ifndef __STDC_WANT_IEC_60559_EXT__ # undef __STDC_WANT_IEC_60559_EXT__ #endif /* Enable extensions specified by ISO/IEC TS 18661-4:2015. */ #ifndef __STDC_WANT_IEC_60559_FUNCS_EXT__ # undef __STDC_WANT_IEC_60559_FUNCS_EXT__ #endif /* Enable extensions specified by C23 Annex H and ISO/IEC TS 18661-3:2015. */ #ifndef __STDC_WANT_IEC_60559_TYPES_EXT__ # undef __STDC_WANT_IEC_60559_TYPES_EXT__ #endif /* Enable extensions specified by ISO/IEC TR 24731-2:2010. */ #ifndef __STDC_WANT_LIB_EXT2__ # undef __STDC_WANT_LIB_EXT2__ #endif /* Enable extensions specified by ISO/IEC 24747:2009. */ #ifndef __STDC_WANT_MATH_SPEC_FUNCS__ # undef __STDC_WANT_MATH_SPEC_FUNCS__ #endif /* Enable extensions on HP NonStop. */ #ifndef _TANDEM_SOURCE # undef _TANDEM_SOURCE #endif /* Enable X/Open extensions. Define to 500 only if necessary to make mbstate_t available. */ #ifndef _XOPEN_SOURCE # undef _XOPEN_SOURCE #endif ]) m4trace:configure.ac:49: -1- AH_OUTPUT([HAVE_STDIO_H], [/* Define to 1 if you have the header file. */ @%:@undef HAVE_STDIO_H]) m4trace:configure.ac:49: -1- AC_SUBST([CC]) m4trace:configure.ac:49: -1- AC_SUBST_TRACE([CC]) m4trace:configure.ac:49: -1- m4_pattern_allow([^CC$]) m4trace:configure.ac:49: -1- AC_SUBST([CFLAGS]) m4trace:configure.ac:49: -1- AC_SUBST_TRACE([CFLAGS]) m4trace:configure.ac:49: -1- m4_pattern_allow([^CFLAGS$]) m4trace:configure.ac:49: -1- AC_SUBST([LDFLAGS]) m4trace:configure.ac:49: -1- AC_SUBST_TRACE([LDFLAGS]) m4trace:configure.ac:49: -1- m4_pattern_allow([^LDFLAGS$]) m4trace:configure.ac:49: -1- AC_SUBST([LIBS]) m4trace:configure.ac:49: -1- AC_SUBST_TRACE([LIBS]) m4trace:configure.ac:49: -1- m4_pattern_allow([^LIBS$]) m4trace:configure.ac:49: -1- AC_SUBST([CPPFLAGS]) m4trace:configure.ac:49: -1- AC_SUBST_TRACE([CPPFLAGS]) m4trace:configure.ac:49: -1- m4_pattern_allow([^CPPFLAGS$]) m4trace:configure.ac:49: -1- AC_SUBST([CC]) m4trace:configure.ac:49: -1- AC_SUBST_TRACE([CC]) m4trace:configure.ac:49: -1- m4_pattern_allow([^CC$]) m4trace:configure.ac:49: -1- AC_SUBST([CC]) m4trace:configure.ac:49: -1- AC_SUBST_TRACE([CC]) m4trace:configure.ac:49: -1- m4_pattern_allow([^CC$]) m4trace:configure.ac:49: -1- AC_SUBST([CC]) m4trace:configure.ac:49: -1- AC_SUBST_TRACE([CC]) m4trace:configure.ac:49: -1- m4_pattern_allow([^CC$]) m4trace:configure.ac:49: -1- AC_SUBST([CC]) m4trace:configure.ac:49: -1- AC_SUBST_TRACE([CC]) m4trace:configure.ac:49: -1- m4_pattern_allow([^CC$]) m4trace:configure.ac:49: -1- AC_SUBST([ac_ct_CC]) m4trace:configure.ac:49: -1- AC_SUBST_TRACE([ac_ct_CC]) m4trace:configure.ac:49: -1- m4_pattern_allow([^ac_ct_CC$]) m4trace:configure.ac:49: -1- AC_SUBST([CC]) m4trace:configure.ac:49: -1- AC_SUBST_TRACE([CC]) m4trace:configure.ac:49: -1- m4_pattern_allow([^CC$]) m4trace:configure.ac:49: -1- AC_SUBST([EXEEXT], [$ac_cv_exeext]) m4trace:configure.ac:49: -1- AC_SUBST_TRACE([EXEEXT]) m4trace:configure.ac:49: -1- m4_pattern_allow([^EXEEXT$]) m4trace:configure.ac:49: -1- AC_SUBST([OBJEXT], [$ac_cv_objext]) m4trace:configure.ac:49: -1- AC_SUBST_TRACE([OBJEXT]) m4trace:configure.ac:49: -1- m4_pattern_allow([^OBJEXT$]) m4trace:configure.ac:49: -1- AH_OUTPUT([HAVE_STDLIB_H], [/* Define to 1 if you have the header file. */ @%:@undef HAVE_STDLIB_H]) m4trace:configure.ac:49: -1- AH_OUTPUT([HAVE_STRING_H], [/* Define to 1 if you have the header file. */ @%:@undef HAVE_STRING_H]) m4trace:configure.ac:49: -1- AH_OUTPUT([HAVE_INTTYPES_H], [/* Define to 1 if you have the header file. */ @%:@undef HAVE_INTTYPES_H]) m4trace:configure.ac:49: -1- AH_OUTPUT([HAVE_STDINT_H], [/* Define to 1 if you have the header file. */ @%:@undef HAVE_STDINT_H]) m4trace:configure.ac:49: -1- AH_OUTPUT([HAVE_STRINGS_H], [/* Define to 1 if you have the header file. */ @%:@undef HAVE_STRINGS_H]) m4trace:configure.ac:49: -1- AH_OUTPUT([HAVE_SYS_STAT_H], [/* Define to 1 if you have the header file. */ @%:@undef HAVE_SYS_STAT_H]) m4trace:configure.ac:49: -1- AH_OUTPUT([HAVE_SYS_TYPES_H], [/* Define to 1 if you have the header file. */ @%:@undef HAVE_SYS_TYPES_H]) m4trace:configure.ac:49: -1- AH_OUTPUT([HAVE_UNISTD_H], [/* Define to 1 if you have the header file. */ @%:@undef HAVE_UNISTD_H]) m4trace:configure.ac:49: -1- AC_DEFINE_TRACE_LITERAL([STDC_HEADERS]) m4trace:configure.ac:49: -1- m4_pattern_allow([^STDC_HEADERS$]) m4trace:configure.ac:49: -1- AH_OUTPUT([STDC_HEADERS], [/* Define to 1 if all of the C89 standard headers exist (not just the ones required in a freestanding environment). This macro is provided for backward compatibility; new code need not use it. */ @%:@undef STDC_HEADERS]) m4trace:configure.ac:49: -1- AH_OUTPUT([HAVE_WCHAR_H], [/* Define to 1 if you have the header file. */ @%:@undef HAVE_WCHAR_H]) m4trace:configure.ac:49: -1- AH_OUTPUT([HAVE_MINIX_CONFIG_H], [/* Define to 1 if you have the header file. */ @%:@undef HAVE_MINIX_CONFIG_H]) m4trace:configure.ac:49: -1- AC_DEFINE_TRACE_LITERAL([_ALL_SOURCE]) m4trace:configure.ac:49: -1- m4_pattern_allow([^_ALL_SOURCE$]) m4trace:configure.ac:49: -1- AC_DEFINE_TRACE_LITERAL([_DARWIN_C_SOURCE]) m4trace:configure.ac:49: -1- m4_pattern_allow([^_DARWIN_C_SOURCE$]) m4trace:configure.ac:49: -1- AC_DEFINE_TRACE_LITERAL([_GNU_SOURCE]) m4trace:configure.ac:49: -1- m4_pattern_allow([^_GNU_SOURCE$]) m4trace:configure.ac:49: -1- AC_DEFINE_TRACE_LITERAL([_HPUX_ALT_XOPEN_SOCKET_API]) m4trace:configure.ac:49: -1- m4_pattern_allow([^_HPUX_ALT_XOPEN_SOCKET_API$]) m4trace:configure.ac:49: -1- AC_DEFINE_TRACE_LITERAL([_NETBSD_SOURCE]) m4trace:configure.ac:49: -1- m4_pattern_allow([^_NETBSD_SOURCE$]) m4trace:configure.ac:49: -1- AC_DEFINE_TRACE_LITERAL([_OPENBSD_SOURCE]) m4trace:configure.ac:49: -1- m4_pattern_allow([^_OPENBSD_SOURCE$]) m4trace:configure.ac:49: -1- AC_DEFINE_TRACE_LITERAL([_POSIX_PTHREAD_SEMANTICS]) m4trace:configure.ac:49: -1- m4_pattern_allow([^_POSIX_PTHREAD_SEMANTICS$]) m4trace:configure.ac:49: -1- AC_DEFINE_TRACE_LITERAL([__STDC_WANT_IEC_60559_ATTRIBS_EXT__]) m4trace:configure.ac:49: -1- m4_pattern_allow([^__STDC_WANT_IEC_60559_ATTRIBS_EXT__$]) m4trace:configure.ac:49: -1- AC_DEFINE_TRACE_LITERAL([__STDC_WANT_IEC_60559_BFP_EXT__]) m4trace:configure.ac:49: -1- m4_pattern_allow([^__STDC_WANT_IEC_60559_BFP_EXT__$]) m4trace:configure.ac:49: -1- AC_DEFINE_TRACE_LITERAL([__STDC_WANT_IEC_60559_DFP_EXT__]) m4trace:configure.ac:49: -1- m4_pattern_allow([^__STDC_WANT_IEC_60559_DFP_EXT__$]) m4trace:configure.ac:49: -1- AC_DEFINE_TRACE_LITERAL([__STDC_WANT_IEC_60559_EXT__]) m4trace:configure.ac:49: -1- m4_pattern_allow([^__STDC_WANT_IEC_60559_EXT__$]) m4trace:configure.ac:49: -1- AC_DEFINE_TRACE_LITERAL([__STDC_WANT_IEC_60559_FUNCS_EXT__]) m4trace:configure.ac:49: -1- m4_pattern_allow([^__STDC_WANT_IEC_60559_FUNCS_EXT__$]) m4trace:configure.ac:49: -1- AC_DEFINE_TRACE_LITERAL([__STDC_WANT_IEC_60559_TYPES_EXT__]) m4trace:configure.ac:49: -1- m4_pattern_allow([^__STDC_WANT_IEC_60559_TYPES_EXT__$]) m4trace:configure.ac:49: -1- AC_DEFINE_TRACE_LITERAL([__STDC_WANT_LIB_EXT2__]) m4trace:configure.ac:49: -1- m4_pattern_allow([^__STDC_WANT_LIB_EXT2__$]) m4trace:configure.ac:49: -1- AC_DEFINE_TRACE_LITERAL([__STDC_WANT_MATH_SPEC_FUNCS__]) m4trace:configure.ac:49: -1- m4_pattern_allow([^__STDC_WANT_MATH_SPEC_FUNCS__$]) m4trace:configure.ac:49: -1- AC_DEFINE_TRACE_LITERAL([_TANDEM_SOURCE]) m4trace:configure.ac:49: -1- m4_pattern_allow([^_TANDEM_SOURCE$]) m4trace:configure.ac:49: -1- AC_DEFINE_TRACE_LITERAL([_MINIX]) m4trace:configure.ac:49: -1- m4_pattern_allow([^_MINIX$]) m4trace:configure.ac:49: -1- AC_DEFINE_TRACE_LITERAL([_POSIX_SOURCE]) m4trace:configure.ac:49: -1- m4_pattern_allow([^_POSIX_SOURCE$]) m4trace:configure.ac:49: -1- AC_DEFINE_TRACE_LITERAL([_POSIX_1_SOURCE]) m4trace:configure.ac:49: -1- m4_pattern_allow([^_POSIX_1_SOURCE$]) m4trace:configure.ac:49: -1- AC_DEFINE_TRACE_LITERAL([__EXTENSIONS__]) m4trace:configure.ac:49: -1- m4_pattern_allow([^__EXTENSIONS__$]) m4trace:configure.ac:49: -1- AC_DEFINE_TRACE_LITERAL([_XOPEN_SOURCE]) m4trace:configure.ac:49: -1- m4_pattern_allow([^_XOPEN_SOURCE$]) m4trace:configure.ac:50: -1- AC_SUBST([CC]) m4trace:configure.ac:50: -1- AC_SUBST_TRACE([CC]) m4trace:configure.ac:50: -1- m4_pattern_allow([^CC$]) m4trace:configure.ac:50: -1- AC_SUBST([CFLAGS]) m4trace:configure.ac:50: -1- AC_SUBST_TRACE([CFLAGS]) m4trace:configure.ac:50: -1- m4_pattern_allow([^CFLAGS$]) m4trace:configure.ac:50: -1- AC_SUBST([LDFLAGS]) m4trace:configure.ac:50: -1- AC_SUBST_TRACE([LDFLAGS]) m4trace:configure.ac:50: -1- m4_pattern_allow([^LDFLAGS$]) m4trace:configure.ac:50: -1- AC_SUBST([LIBS]) m4trace:configure.ac:50: -1- AC_SUBST_TRACE([LIBS]) m4trace:configure.ac:50: -1- m4_pattern_allow([^LIBS$]) m4trace:configure.ac:50: -1- AC_SUBST([CPPFLAGS]) m4trace:configure.ac:50: -1- AC_SUBST_TRACE([CPPFLAGS]) m4trace:configure.ac:50: -1- m4_pattern_allow([^CPPFLAGS$]) m4trace:configure.ac:50: -1- AC_SUBST([CC]) m4trace:configure.ac:50: -1- AC_SUBST_TRACE([CC]) m4trace:configure.ac:50: -1- m4_pattern_allow([^CC$]) m4trace:configure.ac:50: -1- AC_SUBST([CC]) m4trace:configure.ac:50: -1- AC_SUBST_TRACE([CC]) m4trace:configure.ac:50: -1- m4_pattern_allow([^CC$]) m4trace:configure.ac:50: -1- AC_SUBST([CC]) m4trace:configure.ac:50: -1- AC_SUBST_TRACE([CC]) m4trace:configure.ac:50: -1- m4_pattern_allow([^CC$]) m4trace:configure.ac:50: -1- AC_SUBST([CC]) m4trace:configure.ac:50: -1- AC_SUBST_TRACE([CC]) m4trace:configure.ac:50: -1- m4_pattern_allow([^CC$]) m4trace:configure.ac:50: -1- AC_SUBST([ac_ct_CC]) m4trace:configure.ac:50: -1- AC_SUBST_TRACE([ac_ct_CC]) m4trace:configure.ac:50: -1- m4_pattern_allow([^ac_ct_CC$]) m4trace:configure.ac:50: -1- AC_SUBST([CC]) m4trace:configure.ac:50: -1- AC_SUBST_TRACE([CC]) m4trace:configure.ac:50: -1- m4_pattern_allow([^CC$]) m4trace:configure.ac:51: -1- AC_SUBST([AWK]) m4trace:configure.ac:51: -1- AC_SUBST_TRACE([AWK]) m4trace:configure.ac:51: -1- m4_pattern_allow([^AWK$]) m4trace:configure.ac:52: -1- AC_REQUIRE_AUX_FILE([install-sh]) m4trace:configure.ac:52: -1- AC_SUBST([INSTALL_PROGRAM]) m4trace:configure.ac:52: -1- AC_SUBST_TRACE([INSTALL_PROGRAM]) m4trace:configure.ac:52: -1- m4_pattern_allow([^INSTALL_PROGRAM$]) m4trace:configure.ac:52: -1- AC_SUBST([INSTALL_SCRIPT]) m4trace:configure.ac:52: -1- AC_SUBST_TRACE([INSTALL_SCRIPT]) m4trace:configure.ac:52: -1- m4_pattern_allow([^INSTALL_SCRIPT$]) m4trace:configure.ac:52: -1- AC_SUBST([INSTALL_DATA]) m4trace:configure.ac:52: -1- AC_SUBST_TRACE([INSTALL_DATA]) m4trace:configure.ac:52: -1- m4_pattern_allow([^INSTALL_DATA$]) m4trace:configure.ac:60: -1- AH_OUTPUT([HAVE_EXECVPE], [/* Define to 1 if you have the \'execvpe\' function. */ @%:@undef HAVE_EXECVPE]) m4trace:configure.ac:60: -1- AC_DEFINE_TRACE_LITERAL([HAVE_EXECVPE]) m4trace:configure.ac:60: -1- m4_pattern_allow([^HAVE_EXECVPE$]) m4trace:configure.ac:63: -1- AH_OUTPUT([HAVE_SETEUID], [/* Define to 1 if you have the \'seteuid\' function. */ @%:@undef HAVE_SETEUID]) m4trace:configure.ac:63: -1- AC_DEFINE_TRACE_LITERAL([HAVE_SETEUID]) m4trace:configure.ac:63: -1- m4_pattern_allow([^HAVE_SETEUID$]) m4trace:configure.ac:63: -1- AH_OUTPUT([HAVE_SETEGID], [/* Define to 1 if you have the \'setegid\' function. */ @%:@undef HAVE_SETEGID]) m4trace:configure.ac:63: -1- AC_DEFINE_TRACE_LITERAL([HAVE_SETEGID]) m4trace:configure.ac:63: -1- m4_pattern_allow([^HAVE_SETEGID$]) m4trace:configure.ac:63: -1- AH_OUTPUT([HAVE_SETREUID], [/* Define to 1 if you have the \'setreuid\' function. */ @%:@undef HAVE_SETREUID]) m4trace:configure.ac:63: -1- AC_DEFINE_TRACE_LITERAL([HAVE_SETREUID]) m4trace:configure.ac:63: -1- m4_pattern_allow([^HAVE_SETREUID$]) m4trace:configure.ac:63: -1- AH_OUTPUT([HAVE_SETRESUID], [/* Define to 1 if you have the \'setresuid\' function. */ @%:@undef HAVE_SETRESUID]) m4trace:configure.ac:63: -1- AC_DEFINE_TRACE_LITERAL([HAVE_SETRESUID]) m4trace:configure.ac:63: -1- m4_pattern_allow([^HAVE_SETRESUID$]) m4trace:configure.ac:76: -1- AH_OUTPUT([HAVE_PTY_H], [/* Define to 1 if you have the header file. */ @%:@undef HAVE_PTY_H]) m4trace:configure.ac:76: -1- AC_DEFINE_TRACE_LITERAL([HAVE_PTY_H]) m4trace:configure.ac:76: -1- m4_pattern_allow([^HAVE_PTY_H$]) m4trace:configure.ac:76: -1- AH_OUTPUT([HAVE_UTIL_H], [/* Define to 1 if you have the header file. */ @%:@undef HAVE_UTIL_H]) m4trace:configure.ac:76: -1- AC_DEFINE_TRACE_LITERAL([HAVE_UTIL_H]) m4trace:configure.ac:76: -1- m4_pattern_allow([^HAVE_UTIL_H$]) m4trace:configure.ac:76: -1- AH_OUTPUT([HAVE_LIBUTIL_H], [/* Define to 1 if you have the header file. */ @%:@undef HAVE_LIBUTIL_H]) m4trace:configure.ac:76: -1- AC_DEFINE_TRACE_LITERAL([HAVE_LIBUTIL_H]) m4trace:configure.ac:76: -1- m4_pattern_allow([^HAVE_LIBUTIL_H$]) m4trace:configure.ac:77: -1- AC_DEFINE_TRACE_LITERAL([HAVE_OPENPTY]) m4trace:configure.ac:77: -1- m4_pattern_allow([^HAVE_OPENPTY$]) m4trace:configure.ac:89: -1- AH_OUTPUT([HAVE_LANGINFO_H], [/* Define to 1 if you have the header file. */ @%:@undef HAVE_LANGINFO_H]) m4trace:configure.ac:89: -1- AC_DEFINE_TRACE_LITERAL([HAVE_LANGINFO_H]) m4trace:configure.ac:89: -1- m4_pattern_allow([^HAVE_LANGINFO_H$]) m4trace:configure.ac:92: -1- AH_OUTPUT([HAVE_DIRENT_H], [/* Define to 1 if you have the header file. */ @%:@undef HAVE_DIRENT_H]) m4trace:configure.ac:92: -1- AC_DEFINE_TRACE_LITERAL([HAVE_DIRENT_H]) m4trace:configure.ac:92: -1- m4_pattern_allow([^HAVE_DIRENT_H$]) m4trace:configure.ac:134: -1- AC_DEFINE_TRACE_LITERAL([ENABLE_PAM]) m4trace:configure.ac:134: -1- m4_pattern_allow([^ENABLE_PAM$]) m4trace:configure.ac:148: -1- AH_OUTPUT([HAVE_UTMPX_H], [/* Define to 1 if you have the header file. */ @%:@undef HAVE_UTMPX_H]) m4trace:configure.ac:148: -1- AC_DEFINE_TRACE_LITERAL([HAVE_UTMPX_H]) m4trace:configure.ac:148: -1- m4_pattern_allow([^HAVE_UTMPX_H$]) m4trace:configure.ac:148: -1- AC_DEFINE_TRACE_LITERAL([HAVE_UTEMPTER]) m4trace:configure.ac:148: -1- m4_pattern_allow([^HAVE_UTEMPTER$]) m4trace:configure.ac:148: -1- AC_DEFINE_TRACE_LITERAL([HAVE_UT_HOST]) m4trace:configure.ac:148: -1- m4_pattern_allow([^HAVE_UT_HOST$]) m4trace:configure.ac:148: -1- AC_DEFINE_TRACE_LITERAL([HAVE_UT_EXIT]) m4trace:configure.ac:148: -1- m4_pattern_allow([^HAVE_UT_EXIT$]) m4trace:configure.ac:148: -1- AC_DEFINE_TRACE_LITERAL([ENABLE_UTMP]) m4trace:configure.ac:148: -1- m4_pattern_allow([^ENABLE_UTMP$]) m4trace:configure.ac:178: -1- AC_DEFINE_TRACE_LITERAL([ENABLE_TELNET]) m4trace:configure.ac:178: -1- m4_pattern_allow([^ENABLE_TELNET$]) m4trace:configure.ac:184: -1- AC_DEFINE_TRACE_LITERAL([SOCKET_DIR]) m4trace:configure.ac:184: -1- m4_pattern_allow([^SOCKET_DIR$]) m4trace:configure.ac:192: -1- AC_DEFINE_TRACE_LITERAL([SYSTEM_SCREENRC]) m4trace:configure.ac:192: -1- m4_pattern_allow([^SYSTEM_SCREENRC$]) m4trace:configure.ac:195: -1- AC_DEFINE_TRACE_LITERAL([PTY_MODE]) m4trace:configure.ac:195: -1- m4_pattern_allow([^PTY_MODE$]) m4trace:configure.ac:198: -1- AC_DEFINE_TRACE_LITERAL([PTY_GROUP]) m4trace:configure.ac:198: -1- m4_pattern_allow([^PTY_GROUP$]) m4trace:configure.ac:201: -1- AC_DEFINE_TRACE_LITERAL([PTY_ROFS]) m4trace:configure.ac:201: -1- m4_pattern_allow([^PTY_ROFS$]) m4trace:configure.ac:209: -1- AC_CONFIG_FILES([Makefile doc/Makefile]) m4trace:configure.ac:210: -1- AC_SUBST([LIB@&t@OBJS], [$ac_libobjs]) m4trace:configure.ac:210: -1- AC_SUBST_TRACE([LIB@&t@OBJS]) m4trace:configure.ac:210: -1- m4_pattern_allow([^LIB@&t@OBJS$]) m4trace:configure.ac:210: -1- AC_SUBST([LTLIBOBJS], [$ac_ltlibobjs]) m4trace:configure.ac:210: -1- AC_SUBST_TRACE([LTLIBOBJS]) m4trace:configure.ac:210: -1- m4_pattern_allow([^LTLIBOBJS$]) m4trace:configure.ac:210: -1- AC_SUBST_TRACE([top_builddir]) m4trace:configure.ac:210: -1- AC_SUBST_TRACE([top_build_prefix]) m4trace:configure.ac:210: -1- AC_SUBST_TRACE([srcdir]) m4trace:configure.ac:210: -1- AC_SUBST_TRACE([abs_srcdir]) m4trace:configure.ac:210: -1- AC_SUBST_TRACE([top_srcdir]) m4trace:configure.ac:210: -1- AC_SUBST_TRACE([abs_top_srcdir]) m4trace:configure.ac:210: -1- AC_SUBST_TRACE([builddir]) m4trace:configure.ac:210: -1- AC_SUBST_TRACE([abs_builddir]) m4trace:configure.ac:210: -1- AC_SUBST_TRACE([abs_top_builddir]) m4trace:configure.ac:210: -1- AC_SUBST_TRACE([INSTALL]) screen-5.0.2/autom4te.cache/output.10000664000175000017500000054302615224432734015711 0ustar alexalex@%:@! /bin/sh @%:@ Guess values for system-dependent variables and create Makefiles. @%:@ Generated by GNU Autoconf 2.72 for GNU Screen 5.0.2. @%:@ @%:@ Report bugs to . @%:@ @%:@ @%:@ Copyright (C) 1992-1996, 1998-2017, 2020-2023 Free Software Foundation, @%:@ Inc. @%:@ @%:@ @%:@ This configure script is free software; the Free Software Foundation @%:@ gives unlimited permission to copy, distribute and modify it. ## -------------------- ## ## M4sh Initialization. ## ## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test ${ZSH_VERSION+y} && (emulate sh) >/dev/null 2>&1 then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case e in @%:@( e) case `(set -o) 2>/dev/null` in @%:@( *posix*) : set -o posix ;; @%:@( *) : ;; esac ;; esac fi # Reset variables that may have inherited troublesome values from # the environment. # IFS needs to be set, to space, tab, and newline, in precisely that order. # (If _AS_PATH_WALK were called with IFS unset, it would have the # side effect of setting IFS to empty, thus disabling word splitting.) # Quoting is to prevent editors from complaining about space-tab. as_nl=' ' export as_nl IFS=" "" $as_nl" PS1='$ ' PS2='> ' PS4='+ ' # Ensure predictable behavior from utilities with locale-dependent output. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # We cannot yet rely on "unset" to work, but we need these variables # to be unset--not just set to an empty or harmless value--now, to # avoid bugs in old shells (e.g. pre-3.0 UWIN ksh). This construct # also avoids known problems related to "unset" and subshell syntax # in other old shells (e.g. bash 2.01 and pdksh 5.2.14). for as_var in BASH_ENV ENV MAIL MAILPATH CDPATH do eval test \${$as_var+y} \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done # Ensure that fds 0, 1, and 2 are open. if (exec 3>&0) 2>/dev/null; then :; else exec 0&1) 2>/dev/null; then :; else exec 1>/dev/null; fi if (exec 3>&2) ; then :; else exec 2>/dev/null; fi # The user is always right. if ${PATH_SEPARATOR+false} :; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # Find who we are. Look in the path if we contain no directory separator. as_myself= case $0 in @%:@(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in @%:@((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac test -r "$as_dir$0" && as_myself=$as_dir$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as 'sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then printf "%s\n" "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # Use a proper internal environment variable to ensure we don't fall # into an infinite loop, continuously re-executing ourselves. if test x"${_as_can_reexec}" != xno && test "x$CONFIG_SHELL" != x; then _as_can_reexec=no; export _as_can_reexec; # We cannot yet assume a decent shell, so we have to provide a # neutralization value for shells without unset; and this also # works around shells that cannot unset nonexistent variables. # Preserve -v and -x to the replacement shell. BASH_ENV=/dev/null ENV=/dev/null (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV case $- in @%:@ (((( *v*x* | *x*v* ) as_opts=-vx ;; *v* ) as_opts=-v ;; *x* ) as_opts=-x ;; * ) as_opts= ;; esac exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} # Admittedly, this is quite paranoid, since all the known shells bail # out after a failed 'exec'. printf "%s\n" "$0: could not re-execute with $CONFIG_SHELL" >&2 exit 255 fi # We don't want this to propagate to other subprocesses. { _as_can_reexec=; unset _as_can_reexec;} if test "x$CONFIG_SHELL" = x; then as_bourne_compatible="if test \${ZSH_VERSION+y} && (emulate sh) >/dev/null 2>&1 then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which # is contrary to our usage. Disable this feature. alias -g '\${1+\"\$@\"}'='\"\$@\"' setopt NO_GLOB_SUBST else case e in @%:@( e) case \`(set -o) 2>/dev/null\` in @%:@( *posix*) : set -o posix ;; @%:@( *) : ;; esac ;; esac fi " as_required="as_fn_return () { (exit \$1); } as_fn_success () { as_fn_return 0; } as_fn_failure () { as_fn_return 1; } as_fn_ret_success () { return 0; } as_fn_ret_failure () { return 1; } exitcode=0 as_fn_success || { exitcode=1; echo as_fn_success failed.; } as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; } as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; } as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; } if ( set x; as_fn_ret_success y && test x = \"\$1\" ) then : else case e in @%:@( e) exitcode=1; echo positional parameters were not saved. ;; esac fi test x\$exitcode = x0 || exit 1 blah=\$(echo \$(echo blah)) test x\"\$blah\" = xblah || exit 1 test -x / || exit 1" as_suggested=" as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" && test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1" if (eval "$as_required") 2>/dev/null then : as_have_required=yes else case e in @%:@( e) as_have_required=no ;; esac fi if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null then : else case e in @%:@( e) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR as_found=false for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH do IFS=$as_save_IFS case $as_dir in @%:@((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac as_found=: case $as_dir in @%:@( /*) for as_base in sh bash ksh sh5; do # Try only shells that exist, to save several forks. as_shell=$as_dir$as_base if { test -f "$as_shell" || test -f "$as_shell.exe"; } && as_run=a "$as_shell" -c "$as_bourne_compatible""$as_required" 2>/dev/null then : CONFIG_SHELL=$as_shell as_have_required=yes if as_run=a "$as_shell" -c "$as_bourne_compatible""$as_suggested" 2>/dev/null then : break 2 fi fi done;; esac as_found=false done IFS=$as_save_IFS if $as_found then : else case e in @%:@( e) if { test -f "$SHELL" || test -f "$SHELL.exe"; } && as_run=a "$SHELL" -c "$as_bourne_compatible""$as_required" 2>/dev/null then : CONFIG_SHELL=$SHELL as_have_required=yes fi ;; esac fi if test "x$CONFIG_SHELL" != x then : export CONFIG_SHELL # We cannot yet assume a decent shell, so we have to provide a # neutralization value for shells without unset; and this also # works around shells that cannot unset nonexistent variables. # Preserve -v and -x to the replacement shell. BASH_ENV=/dev/null ENV=/dev/null (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV case $- in @%:@ (((( *v*x* | *x*v* ) as_opts=-vx ;; *v* ) as_opts=-v ;; *x* ) as_opts=-x ;; * ) as_opts= ;; esac exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} # Admittedly, this is quite paranoid, since all the known shells bail # out after a failed 'exec'. printf "%s\n" "$0: could not re-execute with $CONFIG_SHELL" >&2 exit 255 fi if test x$as_have_required = xno then : printf "%s\n" "$0: This script requires a shell more modern than all" printf "%s\n" "$0: the shells that I found on your system." if test ${ZSH_VERSION+y} ; then printf "%s\n" "$0: In particular, zsh $ZSH_VERSION has bugs and should" printf "%s\n" "$0: be upgraded to zsh 4.3.4 or later." else printf "%s\n" "$0: Please tell bug-autoconf@gnu.org and $0: https://savannah.gnu.org/bugs/?group=screen about your $0: system, including any error possibly output before this $0: message. Then install a modern shell, or manually run $0: the script under such a shell if you do have one." fi exit 1 fi ;; esac fi fi SHELL=${CONFIG_SHELL-/bin/sh} export SHELL # Unset more variables known to interfere with behavior of common tools. CLICOLOR_FORCE= GREP_OPTIONS= unset CLICOLOR_FORCE GREP_OPTIONS ## --------------------- ## ## M4sh Shell Functions. ## ## --------------------- ## @%:@ as_fn_unset VAR @%:@ --------------- @%:@ Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset @%:@ as_fn_set_status STATUS @%:@ ----------------------- @%:@ Set @S|@? to STATUS, without forking. as_fn_set_status () { return $1 } @%:@ as_fn_set_status @%:@ as_fn_exit STATUS @%:@ ----------------- @%:@ Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } @%:@ as_fn_exit @%:@ as_fn_mkdir_p @%:@ ------------- @%:@ Create "@S|@as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`printf "%s\n" "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || printf "%s\n" X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" } @%:@ as_fn_mkdir_p @%:@ as_fn_executable_p FILE @%:@ ----------------------- @%:@ Test if FILE is an executable regular file. as_fn_executable_p () { test -f "$1" && test -x "$1" } @%:@ as_fn_executable_p @%:@ as_fn_append VAR VALUE @%:@ ---------------------- @%:@ Append the text in VALUE to the end of the definition contained in VAR. Take @%:@ advantage of any shell optimizations that allow amortized linear growth over @%:@ repeated appends, instead of the typical quadratic growth present in naive @%:@ implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null then : eval 'as_fn_append () { eval $1+=\$2 }' else case e in @%:@( e) as_fn_append () { eval $1=\$$1\$2 } ;; esac fi # as_fn_append @%:@ as_fn_arith ARG... @%:@ ------------------ @%:@ Perform arithmetic evaluation on the ARGs, and store the result in the @%:@ global @S|@as_val. Take advantage of shells that can avoid forks. The arguments @%:@ must be portable across @S|@(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null then : eval 'as_fn_arith () { as_val=$(( $* )) }' else case e in @%:@( e) as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } ;; esac fi # as_fn_arith @%:@ as_fn_error STATUS ERROR [LINENO LOG_FD] @%:@ ---------------------------------------- @%:@ Output "`basename @S|@0`: error: ERROR" to stderr. If LINENO and LOG_FD are @%:@ provided, also output the error to LOG_FD, referencing LINENO. Then exit the @%:@ script with STATUS, using 1 if that was 0. as_fn_error () { as_status=$1; test $as_status -eq 0 && as_status=1 if test "$4"; then as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi printf "%s\n" "$as_me: error: $2" >&2 as_fn_exit $as_status } @%:@ as_fn_error if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || printf "%s\n" X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits as_lineno_1=$LINENO as_lineno_1a=$LINENO as_lineno_2=$LINENO as_lineno_2a=$LINENO eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" && test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || { # Blame Lee E. McMahon (1931-1989) for sed's syntax. :-) sed -n ' p /[$]LINENO/= ' <$as_myself | sed ' t clear :clear s/[$]LINENO.*/&-/ t lineno b :lineno N :loop s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/ t loop s/-\n.*// ' >$as_me.lineno && chmod +x "$as_me.lineno" || { printf "%s\n" "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; } # If we had to re-execute with $CONFIG_SHELL, we're ensured to have # already done that, so ensure we don't try to do so again and fall # in an infinite loop. This has already happened in practice. _as_can_reexec=no; export _as_can_reexec # Don't try to exec as it changes $[0], causing all sort of problems # (the dirname of $[0] is not the place where we might find the # original and so on. Autoconf is especially sensitive to this). . "./$as_me.lineno" # Exit status is that of the last command. exit } # Determine whether it's possible to make 'echo' print without a newline. # These variables are no longer used directly by Autoconf, but are AC_SUBSTed # for compatibility with existing Makefiles. ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in @%:@((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac # For backward compatibility with old third-party macros, we provide # the shell variables $as_echo and $as_echo_n. New code should use # AS_ECHO(["message"]) and AS_ECHO_N(["message"]), respectively. as_@&t@echo='printf %s\n' as_@&t@echo_n='printf %s' rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both 'ln -s file dir' and 'ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; 'ln -s' creates a wrapper executable. # In both cases, we have to default to 'cp -pR'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -pR' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -pR' fi else as_ln_s='cp -pR' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null if mkdir -p . 2>/dev/null; then as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi as_test_x='test -x' as_executable_p=as_fn_executable_p # Sed expression to map a string onto a valid CPP name. as_sed_cpp="y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g" as_tr_cpp="eval sed '$as_sed_cpp'" # deprecated # Sed expression to map a string onto a valid variable name. as_sed_sh="y%*+%pp%;s%[^_$as_cr_alnum]%_%g" as_tr_sh="eval sed '$as_sed_sh'" # deprecated test -n "$DJDIR" || exec 7<&0 &1 # Name of the host. # hostname on some systems (SVR3.2, old GNU/Linux) returns a bogus exit status, # so uname gets run too. ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` # # Initializations. # ac_default_prefix=/usr/local ac_clean_files= ac_config_libobj_dir=. LIB@&t@OBJS= cross_compiling=no subdirs= MFLAGS= MAKEFLAGS= # Identity of this package. PACKAGE_NAME='GNU Screen' PACKAGE_TARNAME='screen' PACKAGE_VERSION='5.0.2' PACKAGE_STRING='GNU Screen 5.0.2' PACKAGE_BUGREPORT='https://savannah.gnu.org/bugs/?group=screen' PACKAGE_URL='https://www.gnu.org/software/screen/' # Factoring default headers for most tests. ac_includes_default="\ #include #ifdef HAVE_STDIO_H # include #endif #ifdef HAVE_STDLIB_H # include #endif #ifdef HAVE_STRING_H # include #endif #ifdef HAVE_INTTYPES_H # include #endif #ifdef HAVE_STDINT_H # include #endif #ifdef HAVE_STRINGS_H # include #endif #ifdef HAVE_SYS_TYPES_H # include #endif #ifdef HAVE_SYS_STAT_H # include #endif #ifdef HAVE_UNISTD_H # include #endif" ac_header_c_list= ac_subst_vars='LTLIBOBJS LIB@&t@OBJS INSTALL_DATA INSTALL_SCRIPT INSTALL_PROGRAM AWK OBJEXT EXEEXT ac_ct_CC CPPFLAGS LDFLAGS CFLAGS CC target_alias host_alias build_alias LIBS ECHO_T ECHO_N ECHO_C DEFS mandir localedir libdir psdir pdfdir dvidir htmldir infodir docdir oldincludedir includedir runstatedir localstatedir sharedstatedir sysconfdir datadir datarootdir libexecdir sbindir bindir program_transform_name prefix exec_prefix PACKAGE_URL PACKAGE_BUGREPORT PACKAGE_STRING PACKAGE_VERSION PACKAGE_TARNAME PACKAGE_NAME PATH_SEPARATOR SHELL' ac_subst_files='' ac_user_opts=' enable_option_checking enable_pam enable_utmp enable_telnet enable_socket_dir with_system_screenrc with_pty_mode with_pty_group with_pty_rofs ' ac_precious_vars='build_alias host_alias target_alias CC CFLAGS LDFLAGS LIBS CPPFLAGS' # Initialize some variables set by options. ac_init_help= ac_init_version=false ac_unrecognized_opts= ac_unrecognized_sep= # The variables have the same names as the options, with # dashes changed to underlines. cache_file=/dev/null exec_prefix=NONE no_create= no_recursion= prefix=NONE program_prefix=NONE program_suffix=NONE program_transform_name=s,x,x, silent= site= srcdir= verbose= x_includes=NONE x_libraries=NONE # Installation directory options. # These are left unexpanded so users can "make install exec_prefix=/foo" # and all the variables that are supposed to be based on exec_prefix # by default will actually change. # Use braces instead of parens because sh, perl, etc. also accept them. # (The list follows the same order as the GNU Coding Standards.) bindir='${exec_prefix}/bin' sbindir='${exec_prefix}/sbin' libexecdir='${exec_prefix}/libexec' datarootdir='${prefix}/share' datadir='${datarootdir}' sysconfdir='${prefix}/etc' sharedstatedir='${prefix}/com' localstatedir='${prefix}/var' runstatedir='${localstatedir}/run' includedir='${prefix}/include' oldincludedir='/usr/include' docdir='${datarootdir}/doc/${PACKAGE_TARNAME}' infodir='${datarootdir}/info' htmldir='${docdir}' dvidir='${docdir}' pdfdir='${docdir}' psdir='${docdir}' libdir='${exec_prefix}/lib' localedir='${datarootdir}/locale' mandir='${datarootdir}/man' ac_prev= ac_dashdash= for ac_option do # If the previous option needs an argument, assign it. if test -n "$ac_prev"; then eval $ac_prev=\$ac_option ac_prev= continue fi case $ac_option in *=?*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;; *=) ac_optarg= ;; *) ac_optarg=yes ;; esac case $ac_dashdash$ac_option in --) ac_dashdash=yes ;; -bindir | --bindir | --bindi | --bind | --bin | --bi) ac_prev=bindir ;; -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) bindir=$ac_optarg ;; -build | --build | --buil | --bui | --bu) ac_prev=build_alias ;; -build=* | --build=* | --buil=* | --bui=* | --bu=*) build_alias=$ac_optarg ;; -cache-file | --cache-file | --cache-fil | --cache-fi \ | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) ac_prev=cache_file ;; -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) cache_file=$ac_optarg ;; --config-cache | -C) cache_file=config.cache ;; -datadir | --datadir | --datadi | --datad) ac_prev=datadir ;; -datadir=* | --datadir=* | --datadi=* | --datad=*) datadir=$ac_optarg ;; -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \ | --dataroo | --dataro | --datar) ac_prev=datarootdir ;; -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \ | --dataroot=* | --dataroo=* | --dataro=* | --datar=*) datarootdir=$ac_optarg ;; -disable-* | --disable-*) ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid feature name: '$ac_useropt'" ac_useropt_orig=$ac_useropt ac_useropt=`printf "%s\n" "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval enable_$ac_useropt=no ;; -docdir | --docdir | --docdi | --doc | --do) ac_prev=docdir ;; -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*) docdir=$ac_optarg ;; -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv) ac_prev=dvidir ;; -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*) dvidir=$ac_optarg ;; -enable-* | --enable-*) ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid feature name: '$ac_useropt'" ac_useropt_orig=$ac_useropt ac_useropt=`printf "%s\n" "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval enable_$ac_useropt=\$ac_optarg ;; -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ | --exec | --exe | --ex) ac_prev=exec_prefix ;; -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ | --exec=* | --exe=* | --ex=*) exec_prefix=$ac_optarg ;; -gas | --gas | --ga | --g) # Obsolete; use --with-gas. with_gas=yes ;; -help | --help | --hel | --he | -h) ac_init_help=long ;; -help=r* | --help=r* | --hel=r* | --he=r* | -hr*) ac_init_help=recursive ;; -help=s* | --help=s* | --hel=s* | --he=s* | -hs*) ac_init_help=short ;; -host | --host | --hos | --ho) ac_prev=host_alias ;; -host=* | --host=* | --hos=* | --ho=*) host_alias=$ac_optarg ;; -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht) ac_prev=htmldir ;; -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \ | --ht=*) htmldir=$ac_optarg ;; -includedir | --includedir | --includedi | --included | --include \ | --includ | --inclu | --incl | --inc) ac_prev=includedir ;; -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ | --includ=* | --inclu=* | --incl=* | --inc=*) includedir=$ac_optarg ;; -infodir | --infodir | --infodi | --infod | --info | --inf) ac_prev=infodir ;; -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) infodir=$ac_optarg ;; -libdir | --libdir | --libdi | --libd) ac_prev=libdir ;; -libdir=* | --libdir=* | --libdi=* | --libd=*) libdir=$ac_optarg ;; -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ | --libexe | --libex | --libe) ac_prev=libexecdir ;; -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ | --libexe=* | --libex=* | --libe=*) libexecdir=$ac_optarg ;; -localedir | --localedir | --localedi | --localed | --locale) ac_prev=localedir ;; -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*) localedir=$ac_optarg ;; -localstatedir | --localstatedir | --localstatedi | --localstated \ | --localstate | --localstat | --localsta | --localst | --locals) ac_prev=localstatedir ;; -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*) localstatedir=$ac_optarg ;; -mandir | --mandir | --mandi | --mand | --man | --ma | --m) ac_prev=mandir ;; -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) mandir=$ac_optarg ;; -nfp | --nfp | --nf) # Obsolete; use --without-fp. with_fp=no ;; -no-create | --no-create | --no-creat | --no-crea | --no-cre \ | --no-cr | --no-c | -n) no_create=yes ;; -no-recursion | --no-recursion | --no-recursio | --no-recursi \ | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) no_recursion=yes ;; -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ | --oldin | --oldi | --old | --ol | --o) ac_prev=oldincludedir ;; -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) oldincludedir=$ac_optarg ;; -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) ac_prev=prefix ;; -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) prefix=$ac_optarg ;; -program-prefix | --program-prefix | --program-prefi | --program-pref \ | --program-pre | --program-pr | --program-p) ac_prev=program_prefix ;; -program-prefix=* | --program-prefix=* | --program-prefi=* \ | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) program_prefix=$ac_optarg ;; -program-suffix | --program-suffix | --program-suffi | --program-suff \ | --program-suf | --program-su | --program-s) ac_prev=program_suffix ;; -program-suffix=* | --program-suffix=* | --program-suffi=* \ | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) program_suffix=$ac_optarg ;; -program-transform-name | --program-transform-name \ | --program-transform-nam | --program-transform-na \ | --program-transform-n | --program-transform- \ | --program-transform | --program-transfor \ | --program-transfo | --program-transf \ | --program-trans | --program-tran \ | --progr-tra | --program-tr | --program-t) ac_prev=program_transform_name ;; -program-transform-name=* | --program-transform-name=* \ | --program-transform-nam=* | --program-transform-na=* \ | --program-transform-n=* | --program-transform-=* \ | --program-transform=* | --program-transfor=* \ | --program-transfo=* | --program-transf=* \ | --program-trans=* | --program-tran=* \ | --progr-tra=* | --program-tr=* | --program-t=*) program_transform_name=$ac_optarg ;; -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd) ac_prev=pdfdir ;; -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*) pdfdir=$ac_optarg ;; -psdir | --psdir | --psdi | --psd | --ps) ac_prev=psdir ;; -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*) psdir=$ac_optarg ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) silent=yes ;; -runstatedir | --runstatedir | --runstatedi | --runstated \ | --runstate | --runstat | --runsta | --runst | --runs \ | --run | --ru | --r) ac_prev=runstatedir ;; -runstatedir=* | --runstatedir=* | --runstatedi=* | --runstated=* \ | --runstate=* | --runstat=* | --runsta=* | --runst=* | --runs=* \ | --run=* | --ru=* | --r=*) runstatedir=$ac_optarg ;; -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) ac_prev=sbindir ;; -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ | --sbi=* | --sb=*) sbindir=$ac_optarg ;; -sharedstatedir | --sharedstatedir | --sharedstatedi \ | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ | --sharedst | --shareds | --shared | --share | --shar \ | --sha | --sh) ac_prev=sharedstatedir ;; -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ | --sha=* | --sh=*) sharedstatedir=$ac_optarg ;; -site | --site | --sit) ac_prev=site ;; -site=* | --site=* | --sit=*) site=$ac_optarg ;; -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) ac_prev=srcdir ;; -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) srcdir=$ac_optarg ;; -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ | --syscon | --sysco | --sysc | --sys | --sy) ac_prev=sysconfdir ;; -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) sysconfdir=$ac_optarg ;; -target | --target | --targe | --targ | --tar | --ta | --t) ac_prev=target_alias ;; -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) target_alias=$ac_optarg ;; -v | -verbose | --verbose | --verbos | --verbo | --verb) verbose=yes ;; -version | --version | --versio | --versi | --vers | -V) ac_init_version=: ;; -with-* | --with-*) ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid package name: '$ac_useropt'" ac_useropt_orig=$ac_useropt ac_useropt=`printf "%s\n" "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval with_$ac_useropt=\$ac_optarg ;; -without-* | --without-*) ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid package name: '$ac_useropt'" ac_useropt_orig=$ac_useropt ac_useropt=`printf "%s\n" "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval with_$ac_useropt=no ;; --x) # Obsolete; use --with-x. with_x=yes ;; -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ | --x-incl | --x-inc | --x-in | --x-i) ac_prev=x_includes ;; -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) x_includes=$ac_optarg ;; -x-libraries | --x-libraries | --x-librarie | --x-librari \ | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) ac_prev=x_libraries ;; -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) x_libraries=$ac_optarg ;; -*) as_fn_error $? "unrecognized option: '$ac_option' Try '$0 --help' for more information" ;; *=*) ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` # Reject names that are not valid shell variable names. case $ac_envvar in #( '' | [0-9]* | *[!_$as_cr_alnum]* ) as_fn_error $? "invalid variable name: '$ac_envvar'" ;; esac eval $ac_envvar=\$ac_optarg export $ac_envvar ;; *) # FIXME: should be removed in autoconf 3.0. printf "%s\n" "$as_me: WARNING: you should use --build, --host, --target" >&2 expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && printf "%s\n" "$as_me: WARNING: invalid host type: $ac_option" >&2 : "${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}" ;; esac done if test -n "$ac_prev"; then ac_option=--`echo $ac_prev | sed 's/_/-/g'` as_fn_error $? "missing argument to $ac_option" fi if test -n "$ac_unrecognized_opts"; then case $enable_option_checking in no) ;; fatal) as_fn_error $? "unrecognized options: $ac_unrecognized_opts" ;; *) printf "%s\n" "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;; esac fi # Check all directory arguments for consistency. for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \ datadir sysconfdir sharedstatedir localstatedir includedir \ oldincludedir docdir infodir htmldir dvidir pdfdir psdir \ libdir localedir mandir runstatedir do eval ac_val=\$$ac_var # Remove trailing slashes. case $ac_val in */ ) ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'` eval $ac_var=\$ac_val;; esac # Be sure to have absolute directory names. case $ac_val in [\\/$]* | ?:[\\/]* ) continue;; NONE | '' ) case $ac_var in *prefix ) continue;; esac;; esac as_fn_error $? "expected an absolute directory name for --$ac_var: $ac_val" done # There might be people who depend on the old broken behavior: '$host' # used to hold the argument of --host etc. # FIXME: To remove some day. build=$build_alias host=$host_alias target=$target_alias # FIXME: To remove some day. if test "x$host_alias" != x; then if test "x$build_alias" = x; then cross_compiling=maybe elif test "x$build_alias" != "x$host_alias"; then cross_compiling=yes fi fi ac_tool_prefix= test -n "$host_alias" && ac_tool_prefix=$host_alias- test "$silent" = yes && exec 6>/dev/null ac_pwd=`pwd` && test -n "$ac_pwd" && ac_ls_di=`ls -di .` && ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` || as_fn_error $? "working directory cannot be determined" test "X$ac_ls_di" = "X$ac_pwd_ls_di" || as_fn_error $? "pwd does not report name of working directory" # Find the source files, if location was not specified. if test -z "$srcdir"; then ac_srcdir_defaulted=yes # Try the directory containing this script, then the parent directory. ac_confdir=`$as_dirname -- "$as_myself" || $as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_myself" : 'X\(//\)[^/]' \| \ X"$as_myself" : 'X\(//\)$' \| \ X"$as_myself" : 'X\(/\)' \| . 2>/dev/null || printf "%s\n" X"$as_myself" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` srcdir=$ac_confdir if test ! -r "$srcdir/$ac_unique_file"; then srcdir=.. fi else ac_srcdir_defaulted=no fi if test ! -r "$srcdir/$ac_unique_file"; then test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .." as_fn_error $? "cannot find sources ($ac_unique_file) in $srcdir" fi ac_msg="sources are in $srcdir, but 'cd $srcdir' does not work" ac_abs_confdir=`( cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error $? "$ac_msg" pwd)` # When building in place, set srcdir=. if test "$ac_abs_confdir" = "$ac_pwd"; then srcdir=. fi # Remove unnecessary trailing slashes from srcdir. # Double slashes in file names in object file debugging info # mess up M-x gdb in Emacs. case $srcdir in */) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;; esac for ac_var in $ac_precious_vars; do eval ac_env_${ac_var}_set=\${${ac_var}+set} eval ac_env_${ac_var}_value=\$${ac_var} eval ac_cv_env_${ac_var}_set=\${${ac_var}+set} eval ac_cv_env_${ac_var}_value=\$${ac_var} done # # Report the --help message. # 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 GNU Screen 5.0.2 to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... To assign environment variables (e.g., CC, CFLAGS...), specify them as VAR=VALUE. See below for descriptions of some of the useful variables. Defaults for the options are specified in brackets. Configuration: -h, --help display this help and exit --help=short display options specific to this package --help=recursive display the short help of all the included packages -V, --version display version information and exit -q, --quiet, --silent do not print 'checking ...' messages --cache-file=FILE cache test results in FILE [disabled] -C, --config-cache alias for '--cache-file=config.cache' -n, --no-create do not create output files --srcdir=DIR find the sources in DIR [configure dir or '..'] Installation directories: --prefix=PREFIX install architecture-independent files in PREFIX @<:@@S|@ac_default_prefix@:>@ --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX @<:@PREFIX@:>@ By default, 'make install' will install all the files in '$ac_default_prefix/bin', '$ac_default_prefix/lib' etc. You can specify an installation prefix other than '$ac_default_prefix' using '--prefix', for instance '--prefix=\$HOME'. For better control, use the options below. Fine tuning of the installation directories: --bindir=DIR user executables [EPREFIX/bin] --sbindir=DIR system admin executables [EPREFIX/sbin] --libexecdir=DIR program executables [EPREFIX/libexec] --sysconfdir=DIR read-only single-machine data [PREFIX/etc] --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] --localstatedir=DIR modifiable single-machine data [PREFIX/var] --runstatedir=DIR modifiable per-process data [LOCALSTATEDIR/run] --libdir=DIR object code libraries [EPREFIX/lib] --includedir=DIR C header files [PREFIX/include] --oldincludedir=DIR C header files for non-gcc [/usr/include] --datarootdir=DIR read-only arch.-independent data root [PREFIX/share] --datadir=DIR read-only architecture-independent data [DATAROOTDIR] --infodir=DIR info documentation [DATAROOTDIR/info] --localedir=DIR locale-dependent data [DATAROOTDIR/locale] --mandir=DIR man documentation [DATAROOTDIR/man] --docdir=DIR documentation root @<:@DATAROOTDIR/doc/screen@:>@ --htmldir=DIR html documentation [DOCDIR] --dvidir=DIR dvi documentation [DOCDIR] --pdfdir=DIR pdf documentation [DOCDIR] --psdir=DIR ps documentation [DOCDIR] _ACEOF cat <<\_ACEOF _ACEOF fi if test -n "$ac_init_help"; then case $ac_init_help in short | recursive ) echo "Configuration of GNU Screen 5.0.2:";; esac cat <<\_ACEOF Optional Features: --disable-option-checking ignore unrecognized --enable/--with options --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) --enable-FEATURE[=ARG] include FEATURE [ARG=yes] --enable-pam enable PAM support (default: enabled) --enable-utmp enable utmp support (default: disabled) --enable-telnet enable telnet support (default: disabled) --enable-socket-dir enable global socket directory (default: disabled) Optional Packages: --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) --with-system_screenrc set location of system screenrc (default: /etc/screenrc) --with-pty-mode set pty mode (default: 0620) --with-pty-group set pty group (default: 5) --with-pty-rofs set rofs handling (default: no) Some influential environment variables: CC C compiler command CFLAGS C compiler flags LDFLAGS linker flags, e.g. -L if you have libraries in a nonstandard directory LIBS libraries to pass to the linker, e.g. -l CPPFLAGS (Objective) C/C++ preprocessor flags, e.g. -I if you have headers in a nonstandard directory Use these variables to override the choices made by 'configure' or to help it to find libraries and programs with nonstandard names/locations. Report bugs to . GNU Screen home page: . General help using GNU software: . _ACEOF ac_status=$? fi if test "$ac_init_help" = "recursive"; then # If there are subdirs, report their specific --help. for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue test -d "$ac_dir" || { cd "$srcdir" && ac_pwd=`pwd` && srcdir=. && test -d "$ac_dir"; } || continue ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`printf "%s\n" "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`printf "%s\n" "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix cd "$ac_dir" || { ac_status=$?; continue; } # Check for configure.gnu first; this name is used for a wrapper for # Metaconfig's "Configure" on case-insensitive file systems. if test -f "$ac_srcdir/configure.gnu"; then echo && $SHELL "$ac_srcdir/configure.gnu" --help=recursive elif test -f "$ac_srcdir/configure"; then echo && $SHELL "$ac_srcdir/configure" --help=recursive else printf "%s\n" "$as_me: WARNING: no configuration information is in $ac_dir" >&2 fi || ac_status=$? cd "$ac_pwd" || { ac_status=$?; break; } done fi test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF GNU Screen configure 5.0.2 generated by GNU Autoconf 2.72 Copyright (C) 2023 Free Software Foundation, Inc. This configure script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it. _ACEOF exit fi ## ------------------------ ## ## Autoconf initialization. ## ## ------------------------ ## @%:@ ac_fn_c_try_compile LINENO @%:@ -------------------------- @%:@ Try to compile conftest.@S|@ac_ext, and return whether this succeeded. ac_fn_c_try_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext conftest.beam if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" printf "%s\n" "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext then : ac_retval=0 else case e in @%:@( e) printf "%s\n" "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 ;; esac fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } @%:@ ac_fn_c_try_compile @%:@ ac_fn_c_check_header_compile LINENO HEADER VAR INCLUDES @%:@ ------------------------------------------------------- @%:@ Tests whether HEADER exists and can be compiled using the include files in @%:@ INCLUDES, setting the cache variable VAR accordingly. ac_fn_c_check_header_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 printf %s "checking for $2... " >&6; } if eval test \${$3+y} then : printf %s "(cached) " >&6 else case e in @%:@( e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 @%:@include <$2> _ACEOF if ac_fn_c_try_compile "$LINENO" then : eval "$3=yes" else case e in @%:@( e) eval "$3=no" ;; esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ;; esac fi eval ac_res=\$$3 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 printf "%s\n" "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } @%:@ ac_fn_c_check_header_compile @%:@ ac_fn_c_try_link LINENO @%:@ ----------------------- @%:@ Try to link conftest.@S|@ac_ext, and return whether this succeeded. ac_fn_c_try_link () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext conftest.beam conftest$ac_exeext if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" printf "%s\n" "$ac_try_echo"; } >&5 (eval "$ac_link") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && { test "$cross_compiling" = yes || test -x conftest$ac_exeext } then : ac_retval=0 else case e in @%:@( e) printf "%s\n" "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 ;; esac fi # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would # interfere with the next link command; also delete a directory that is # left behind by Apple's compiler. We do this before executing the actions. rm -rf conftest.dSYM conftest_ipa8_conftest.oo eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } @%:@ ac_fn_c_try_link @%:@ ac_fn_c_check_func LINENO FUNC VAR @%:@ ---------------------------------- @%:@ Tests whether FUNC exists, setting the cache variable VAR accordingly ac_fn_c_check_func () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 printf %s "checking for $2... " >&6; } if eval test \${$3+y} then : printf %s "(cached) " >&6 else case e in @%:@( e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Define $2 to an innocuous variant, in case declares $2. For example, HP-UX 11i declares gettimeofday. */ #define $2 innocuous_$2 /* System header to define __stub macros and hopefully few prototypes, which can conflict with char $2 (void); below. */ #include #undef $2 /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char $2 (void); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ #if defined __stub_$2 || defined __stub___$2 choke me #endif int main (void) { return $2 (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO" then : eval "$3=yes" else case e in @%:@( e) eval "$3=no" ;; esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext ;; esac fi eval ac_res=\$$3 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 printf "%s\n" "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } @%:@ ac_fn_c_check_func ac_configure_args_raw= for ac_arg do case $ac_arg in *\'*) ac_arg=`printf "%s\n" "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; esac as_fn_append ac_configure_args_raw " '$ac_arg'" done case $ac_configure_args_raw in *$as_nl*) ac_safe_unquote= ;; *) ac_unsafe_z='|&;<>()$`\\"*?@<:@ '' ' # This string ends in space, tab. ac_unsafe_a="$ac_unsafe_z#~" ac_safe_unquote="s/ '\\([^$ac_unsafe_a][^$ac_unsafe_z]*\\)'/ \\1/g" ac_configure_args_raw=` printf "%s\n" "$ac_configure_args_raw" | sed "$ac_safe_unquote"`;; esac 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 GNU Screen $as_me 5.0.2, which was generated by GNU Autoconf 2.72. Invocation command line was $ $0$ac_configure_args_raw _ACEOF exec 5>>config.log { cat <<_ASUNAME ## --------- ## ## Platform. ## ## --------- ## hostname = `(hostname || uname -n) 2>/dev/null | sed 1q` uname -m = `(uname -m) 2>/dev/null || echo unknown` uname -r = `(uname -r) 2>/dev/null || echo unknown` uname -s = `(uname -s) 2>/dev/null || echo unknown` uname -v = `(uname -v) 2>/dev/null || echo unknown` /usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown` /bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown` /bin/arch = `(/bin/arch) 2>/dev/null || echo unknown` /usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown` /usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown` /usr/bin/hostinfo = `(/usr/bin/hostinfo) 2>/dev/null || echo unknown` /bin/machine = `(/bin/machine) 2>/dev/null || echo unknown` /usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown` /bin/universe = `(/bin/universe) 2>/dev/null || echo unknown` _ASUNAME as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in @%:@((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac printf "%s\n" "PATH: $as_dir" done IFS=$as_save_IFS } >&5 cat >&5 <<_ACEOF ## ----------- ## ## Core tests. ## ## ----------- ## _ACEOF # Keep a trace of the command line. # Strip out --no-create and --no-recursion so they do not pile up. # Strip out --silent because we don't want to record it for future runs. # Also quote any args containing shell meta-characters. # Make two passes to allow for proper duplicate-argument suppression. ac_configure_args= ac_configure_args0= ac_configure_args1= ac_must_keep_next=false for ac_pass in 1 2 do for ac_arg do case $ac_arg in -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) continue ;; *\'*) ac_arg=`printf "%s\n" "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; esac case $ac_pass in 1) as_fn_append ac_configure_args0 " '$ac_arg'" ;; 2) as_fn_append ac_configure_args1 " '$ac_arg'" if test $ac_must_keep_next = true; then ac_must_keep_next=false # Got value, back to normal. else case $ac_arg in *=* | --config-cache | -C | -disable-* | --disable-* \ | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \ | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \ | -with-* | --with-* | -without-* | --without-* | --x) case "$ac_configure_args0 " in "$ac_configure_args1"*" '$ac_arg' "* ) continue ;; esac ;; -* ) ac_must_keep_next=true ;; esac fi as_fn_append ac_configure_args " '$ac_arg'" ;; esac done done { ac_configure_args0=; unset ac_configure_args0;} { ac_configure_args1=; unset ac_configure_args1;} # When interrupted or exit'd, cleanup temporary files, and complete # config.log. We remove comments because anyway the quotes in there # would cause problems or look ugly. # WARNING: Use '\'' to represent an apostrophe within the trap. # WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug. trap 'exit_status=$? # Sanitize IFS. IFS=" "" $as_nl" # Save into config.log some information that might help in debugging. { echo printf "%s\n" "## ---------------- ## ## Cache variables. ## ## ---------------- ##" echo # The following way of writing the cache mishandles newlines in values, ( for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 printf "%s\n" "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #( *${as_nl}ac_space=\ *) sed -n \ "s/'\''/'\''\\\\'\'''\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p" ;; #( *) sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) echo printf "%s\n" "## ----------------- ## ## Output variables. ## ## ----------------- ##" echo for ac_var in $ac_subst_vars do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`printf "%s\n" "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac printf "%s\n" "$ac_var='\''$ac_val'\''" done | sort echo if test -n "$ac_subst_files"; then printf "%s\n" "## ------------------- ## ## File substitutions. ## ## ------------------- ##" echo for ac_var in $ac_subst_files do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`printf "%s\n" "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac printf "%s\n" "$ac_var='\''$ac_val'\''" done | sort echo fi if test -s confdefs.h; then printf "%s\n" "## ----------- ## ## confdefs.h. ## ## ----------- ##" echo cat confdefs.h echo fi test "$ac_signal" != 0 && printf "%s\n" "$as_me: caught signal $ac_signal" printf "%s\n" "$as_me: exit $exit_status" } >&5 rm -f core *.core core.conftest.* && rm -f -r conftest* confdefs* conf$$* $ac_clean_files && exit $exit_status ' 0 for ac_signal in 1 2 13 15; do trap 'ac_signal='$ac_signal'; as_fn_exit 1' $ac_signal done ac_signal=0 # confdefs.h avoids OS command line length limits that DEFS can exceed. rm -f -r conftest* confdefs.h printf "%s\n" "/* confdefs.h */" > confdefs.h # Predefined preprocessor variables. printf "%s\n" "@%:@define PACKAGE_NAME \"$PACKAGE_NAME\"" >>confdefs.h printf "%s\n" "@%:@define PACKAGE_TARNAME \"$PACKAGE_TARNAME\"" >>confdefs.h printf "%s\n" "@%:@define PACKAGE_VERSION \"$PACKAGE_VERSION\"" >>confdefs.h printf "%s\n" "@%:@define PACKAGE_STRING \"$PACKAGE_STRING\"" >>confdefs.h printf "%s\n" "@%:@define PACKAGE_BUGREPORT \"$PACKAGE_BUGREPORT\"" >>confdefs.h printf "%s\n" "@%:@define PACKAGE_URL \"$PACKAGE_URL\"" >>confdefs.h # Let the site file select an alternate cache file if it wants to. # Prefer an explicitly selected file to automatically selected ones. if test -n "$CONFIG_SITE"; then ac_site_files="$CONFIG_SITE" elif test "x$prefix" != xNONE; then ac_site_files="$prefix/share/config.site $prefix/etc/config.site" else ac_site_files="$ac_default_prefix/share/config.site $ac_default_prefix/etc/config.site" fi for ac_site_file in $ac_site_files do case $ac_site_file in @%:@( */*) : ;; @%:@( *) : ac_site_file=./$ac_site_file ;; esac if test -f "$ac_site_file" && test -r "$ac_site_file"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5 printf "%s\n" "$as_me: loading site script $ac_site_file" >&6;} sed 's/^/| /' "$ac_site_file" >&5 . "$ac_site_file" \ || { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in '$ac_pwd':" >&5 printf "%s\n" "$as_me: error: in '$ac_pwd':" >&2;} as_fn_error $? "failed to load site script $ac_site_file See 'config.log' for more details" "$LINENO" 5; } fi done if test -r "$cache_file"; then # Some versions of bash will fail to source /dev/null (special files # actually), so we avoid doing that. DJGPP emulates it as a regular file. if test /dev/null != "$cache_file" && test -f "$cache_file"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5 printf "%s\n" "$as_me: loading cache $cache_file" >&6;} case $cache_file in [\\/]* | ?:[\\/]* ) . "$cache_file";; *) . "./$cache_file";; esac fi else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5 printf "%s\n" "$as_me: creating cache $cache_file" >&6;} >$cache_file fi as_fn_append ac_header_c_list " stdio.h stdio_h HAVE_STDIO_H" # Test code for whether the C compiler supports C89 (global declarations) ac_c_conftest_c89_globals=' /* Does the compiler advertise C89 conformance? Do not test the value of __STDC__, because some compilers set it to 0 while being otherwise adequately conformant. */ #if !defined __STDC__ # error "Compiler does not advertise C89 conformance" #endif #include #include struct stat; /* Most of the following tests are stolen from RCS 5.7 src/conf.sh. */ struct buf { int x; }; struct buf * (*rcsopen) (struct buf *, struct stat *, int); static char *e (char **p, int i) { return p[i]; } static char *f (char * (*g) (char **, int), char **p, ...) { char *s; va_list v; va_start (v,p); s = g (p, va_arg (v,int)); va_end (v); return s; } /* C89 style stringification. */ #define noexpand_stringify(a) #a const char *stringified = noexpand_stringify(arbitrary+token=sequence); /* C89 style token pasting. Exercises some of the corner cases that e.g. old MSVC gets wrong, but not very hard. */ #define noexpand_concat(a,b) a##b #define expand_concat(a,b) noexpand_concat(a,b) extern int vA; extern int vbee; #define aye A #define bee B int *pvA = &expand_concat(v,aye); int *pvbee = &noexpand_concat(v,bee); /* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has function prototypes and stuff, but not \xHH hex character constants. These do not provoke an error unfortunately, instead are silently treated as an "x". The following induces an error, until -std is added to get proper ANSI mode. Curiously \x00 != x always comes out true, for an array size at least. It is necessary to write \x00 == 0 to get something that is true only with -std. */ int osf4_cc_array ['\''\x00'\'' == 0 ? 1 : -1]; /* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters inside strings and character constants. */ #define FOO(x) '\''x'\'' int xlc6_cc_array[FOO(a) == '\''x'\'' ? 1 : -1]; int test (int i, double x); struct s1 {int (*f) (int a);}; struct s2 {int (*f) (double a);}; int pairnames (int, char **, int *(*)(struct buf *, struct stat *, int), int, int);' # Test code for whether the C compiler supports C89 (body of main). ac_c_conftest_c89_main=' ok |= (argc == 0 || f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]); ' # Test code for whether the C compiler supports C99 (global declarations) ac_c_conftest_c99_globals=' /* Does the compiler advertise C99 conformance? */ #if !defined __STDC_VERSION__ || __STDC_VERSION__ < 199901L # error "Compiler does not advertise C99 conformance" #endif // See if C++-style comments work. #include extern int puts (const char *); extern int printf (const char *, ...); extern int dprintf (int, const char *, ...); extern void *malloc (size_t); extern void free (void *); // Check varargs macros. These examples are taken from C99 6.10.3.5. // dprintf is used instead of fprintf to avoid needing to declare // FILE and stderr. #define debug(...) dprintf (2, __VA_ARGS__) #define showlist(...) puts (#__VA_ARGS__) #define report(test,...) ((test) ? puts (#test) : printf (__VA_ARGS__)) static void test_varargs_macros (void) { int x = 1234; int y = 5678; debug ("Flag"); debug ("X = %d\n", x); showlist (The first, second, and third items.); report (x>y, "x is %d but y is %d", x, y); } // Check long long types. #define BIG64 18446744073709551615ull #define BIG32 4294967295ul #define BIG_OK (BIG64 / BIG32 == 4294967297ull && BIG64 % BIG32 == 0) #if !BIG_OK #error "your preprocessor is broken" #endif #if BIG_OK #else #error "your preprocessor is broken" #endif static long long int bignum = -9223372036854775807LL; static unsigned long long int ubignum = BIG64; struct incomplete_array { int datasize; double data[]; }; struct named_init { int number; const wchar_t *name; double average; }; typedef const char *ccp; static inline int test_restrict (ccp restrict text) { // Iterate through items via the restricted pointer. // Also check for declarations in for loops. for (unsigned int i = 0; *(text+i) != '\''\0'\''; ++i) continue; return 0; } // Check varargs and va_copy. static bool test_varargs (const char *format, ...) { va_list args; va_start (args, format); va_list args_copy; va_copy (args_copy, args); const char *str = ""; int number = 0; float fnumber = 0; while (*format) { switch (*format++) { case '\''s'\'': // string str = va_arg (args_copy, const char *); break; case '\''d'\'': // int number = va_arg (args_copy, int); break; case '\''f'\'': // float fnumber = va_arg (args_copy, double); break; default: break; } } va_end (args_copy); va_end (args); return *str && number && fnumber; } ' # Test code for whether the C compiler supports C99 (body of main). ac_c_conftest_c99_main=' // Check bool. _Bool success = false; success |= (argc != 0); // Check restrict. if (test_restrict ("String literal") == 0) success = true; char *restrict newvar = "Another string"; // Check varargs. success &= test_varargs ("s, d'\'' f .", "string", 65, 34.234); test_varargs_macros (); // Check flexible array members. struct incomplete_array *ia = malloc (sizeof (struct incomplete_array) + (sizeof (double) * 10)); ia->datasize = 10; for (int i = 0; i < ia->datasize; ++i) ia->data[i] = i * 1.234; // Work around memory leak warnings. free (ia); // Check named initializers. struct named_init ni = { .number = 34, .name = L"Test wide string", .average = 543.34343, }; ni.number = 58; int dynamic_array[ni.number]; dynamic_array[0] = argv[0][0]; dynamic_array[ni.number - 1] = 543; // work around unused variable warnings ok |= (!success || bignum == 0LL || ubignum == 0uLL || newvar[0] == '\''x'\'' || dynamic_array[ni.number - 1] != 543); ' # Test code for whether the C compiler supports C11 (global declarations) ac_c_conftest_c11_globals=' /* Does the compiler advertise C11 conformance? */ #if !defined __STDC_VERSION__ || __STDC_VERSION__ < 201112L # error "Compiler does not advertise C11 conformance" #endif // Check _Alignas. char _Alignas (double) aligned_as_double; char _Alignas (0) no_special_alignment; extern char aligned_as_int; char _Alignas (0) _Alignas (int) aligned_as_int; // Check _Alignof. enum { int_alignment = _Alignof (int), int_array_alignment = _Alignof (int[100]), char_alignment = _Alignof (char) }; _Static_assert (0 < -_Alignof (int), "_Alignof is signed"); // Check _Noreturn. int _Noreturn does_not_return (void) { for (;;) continue; } // Check _Static_assert. struct test_static_assert { int x; _Static_assert (sizeof (int) <= sizeof (long int), "_Static_assert does not work in struct"); long int y; }; // Check UTF-8 literals. #define u8 syntax error! char const utf8_literal[] = u8"happens to be ASCII" "another string"; // Check duplicate typedefs. typedef long *long_ptr; typedef long int *long_ptr; typedef long_ptr long_ptr; // Anonymous structures and unions -- taken from C11 6.7.2.1 Example 1. struct anonymous { union { struct { int i; int j; }; struct { int k; long int l; } w; }; int m; } v1; ' # Test code for whether the C compiler supports C11 (body of main). ac_c_conftest_c11_main=' _Static_assert ((offsetof (struct anonymous, i) == offsetof (struct anonymous, w.k)), "Anonymous union alignment botch"); v1.i = 2; v1.w.k = 5; ok |= v1.i != 5; ' # Test code for whether the C compiler supports C11 (complete). ac_c_conftest_c11_program="${ac_c_conftest_c89_globals} ${ac_c_conftest_c99_globals} ${ac_c_conftest_c11_globals} int main (int argc, char **argv) { int ok = 0; ${ac_c_conftest_c89_main} ${ac_c_conftest_c99_main} ${ac_c_conftest_c11_main} return ok; } " # Test code for whether the C compiler supports C99 (complete). ac_c_conftest_c99_program="${ac_c_conftest_c89_globals} ${ac_c_conftest_c99_globals} int main (int argc, char **argv) { int ok = 0; ${ac_c_conftest_c89_main} ${ac_c_conftest_c99_main} return ok; } " # Test code for whether the C compiler supports C89 (complete). ac_c_conftest_c89_program="${ac_c_conftest_c89_globals} int main (int argc, char **argv) { int ok = 0; ${ac_c_conftest_c89_main} return ok; } " as_fn_append ac_header_c_list " stdlib.h stdlib_h HAVE_STDLIB_H" as_fn_append ac_header_c_list " string.h string_h HAVE_STRING_H" as_fn_append ac_header_c_list " inttypes.h inttypes_h HAVE_INTTYPES_H" as_fn_append ac_header_c_list " stdint.h stdint_h HAVE_STDINT_H" as_fn_append ac_header_c_list " strings.h strings_h HAVE_STRINGS_H" as_fn_append ac_header_c_list " sys/stat.h sys_stat_h HAVE_SYS_STAT_H" as_fn_append ac_header_c_list " sys/types.h sys_types_h HAVE_SYS_TYPES_H" as_fn_append ac_header_c_list " unistd.h unistd_h HAVE_UNISTD_H" as_fn_append ac_header_c_list " wchar.h wchar_h HAVE_WCHAR_H" as_fn_append ac_header_c_list " minix/config.h minix_config_h HAVE_MINIX_CONFIG_H" # Auxiliary files required by this configure script. ac_aux_files="install-sh" # Locations in which to look for auxiliary files. ac_aux_dir_candidates="${srcdir}${PATH_SEPARATOR}${srcdir}/..${PATH_SEPARATOR}${srcdir}/../.." # Search for a directory containing all of the required auxiliary files, # $ac_aux_files, from the $PATH-style list $ac_aux_dir_candidates. # If we don't find one directory that contains all the files we need, # we report the set of missing files from the *first* directory in # $ac_aux_dir_candidates and give up. ac_missing_aux_files="" ac_first_candidate=: printf "%s\n" "$as_me:${as_lineno-$LINENO}: looking for aux files: $ac_aux_files" >&5 as_save_IFS=$IFS; IFS=$PATH_SEPARATOR as_found=false for as_dir in $ac_aux_dir_candidates do IFS=$as_save_IFS case $as_dir in @%:@((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac as_found=: printf "%s\n" "$as_me:${as_lineno-$LINENO}: trying $as_dir" >&5 ac_aux_dir_found=yes ac_install_sh= for ac_aux in $ac_aux_files do # As a special case, if "install-sh" is required, that requirement # can be satisfied by any of "install-sh", "install.sh", or "shtool", # and $ac_install_sh is set appropriately for whichever one is found. if test x"$ac_aux" = x"install-sh" then if test -f "${as_dir}install-sh"; then printf "%s\n" "$as_me:${as_lineno-$LINENO}: ${as_dir}install-sh found" >&5 ac_install_sh="${as_dir}install-sh -c" elif test -f "${as_dir}install.sh"; then printf "%s\n" "$as_me:${as_lineno-$LINENO}: ${as_dir}install.sh found" >&5 ac_install_sh="${as_dir}install.sh -c" elif test -f "${as_dir}shtool"; then printf "%s\n" "$as_me:${as_lineno-$LINENO}: ${as_dir}shtool found" >&5 ac_install_sh="${as_dir}shtool install -c" else ac_aux_dir_found=no if $ac_first_candidate; then ac_missing_aux_files="${ac_missing_aux_files} install-sh" else break fi fi else if test -f "${as_dir}${ac_aux}"; then printf "%s\n" "$as_me:${as_lineno-$LINENO}: ${as_dir}${ac_aux} found" >&5 else ac_aux_dir_found=no if $ac_first_candidate; then ac_missing_aux_files="${ac_missing_aux_files} ${ac_aux}" else break fi fi fi done if test "$ac_aux_dir_found" = yes; then ac_aux_dir="$as_dir" break fi ac_first_candidate=false as_found=false done IFS=$as_save_IFS if $as_found then : else case e in @%:@( e) as_fn_error $? "cannot find required auxiliary files:$ac_missing_aux_files" "$LINENO" 5 ;; esac fi # These three variables are undocumented and unsupported, # and are intended to be withdrawn in a future Autoconf release. # They can cause serious problems if a builder's source tree is in a directory # whose full name contains unusual characters. if test -f "${ac_aux_dir}config.guess"; then ac_@&t@config_guess="$SHELL ${ac_aux_dir}config.guess" fi if test -f "${ac_aux_dir}config.sub"; then ac_@&t@config_sub="$SHELL ${ac_aux_dir}config.sub" fi if test -f "$ac_aux_dir/configure"; then ac_@&t@configure="$SHELL ${ac_aux_dir}configure" fi # Check that the precious variables saved in the cache have kept the same # value. ac_cache_corrupted=false for ac_var in $ac_precious_vars; do eval ac_old_set=\$ac_cv_env_${ac_var}_set eval ac_new_set=\$ac_env_${ac_var}_set eval ac_old_val=\$ac_cv_env_${ac_var}_value eval ac_new_val=\$ac_env_${ac_var}_value case $ac_old_set,$ac_new_set in set,) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: '$ac_var' was set to '$ac_old_val' in the previous run" >&5 printf "%s\n" "$as_me: error: '$ac_var' was set to '$ac_old_val' in the previous run" >&2;} ac_cache_corrupted=: ;; ,set) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: '$ac_var' was not set in the previous run" >&5 printf "%s\n" "$as_me: error: '$ac_var' was not set in the previous run" >&2;} ac_cache_corrupted=: ;; ,);; *) if test "x$ac_old_val" != "x$ac_new_val"; then # differences in whitespace do not lead to failure. ac_old_val_w=`echo x $ac_old_val` ac_new_val_w=`echo x $ac_new_val` if test "$ac_old_val_w" != "$ac_new_val_w"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: '$ac_var' has changed since the previous run:" >&5 printf "%s\n" "$as_me: error: '$ac_var' has changed since the previous run:" >&2;} ac_cache_corrupted=: else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in '$ac_var' since the previous run:" >&5 printf "%s\n" "$as_me: warning: ignoring whitespace changes in '$ac_var' since the previous run:" >&2;} eval $ac_var=\$ac_old_val fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: former value: '$ac_old_val'" >&5 printf "%s\n" "$as_me: former value: '$ac_old_val'" >&2;} { printf "%s\n" "$as_me:${as_lineno-$LINENO}: current value: '$ac_new_val'" >&5 printf "%s\n" "$as_me: current value: '$ac_new_val'" >&2;} fi;; esac # Pass precious variables to config.status. if test "$ac_new_set" = set; then case $ac_new_val in *\'*) ac_arg=$ac_var=`printf "%s\n" "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;; *) ac_arg=$ac_var=$ac_new_val ;; esac case " $ac_configure_args " in *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy. *) as_fn_append ac_configure_args " '$ac_arg'" ;; esac fi done if $ac_cache_corrupted; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in '$ac_pwd':" >&5 printf "%s\n" "$as_me: error: in '$ac_pwd':" >&2;} { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5 printf "%s\n" "$as_me: error: changes in the environment can compromise the build" >&2;} as_fn_error $? "run '${MAKE-make} distclean' and/or 'rm $cache_file' and start over" "$LINENO" 5 fi ## -------------------- ## ## Main body of script. ## ## -------------------- ## ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu ac_config_headers="$ac_config_headers config.h" cat >>confdefs.h <<_ACEOF @%:@define VERSION_MAJOR `echo $PACKAGE_VERSION | cut -d . -f 1` _ACEOF cat >>confdefs.h <<_ACEOF @%:@define VERSION_MINOR `echo $PACKAGE_VERSION | cut -d . -f 2 | cut -d - -f 1` _ACEOF cat >>confdefs.h <<_ACEOF @%:@define VERSION_REVISION `echo $PACKAGE_VERSION | cut -d . -f 3 | cut -d - -f 1` _ACEOF ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. set dummy ${ac_tool_prefix}gcc; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_CC+y} then : printf %s "(cached) " >&6 else case e in @%:@( e) if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in @%:@((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}gcc" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi ;; esac fi CC=$ac_cv_prog_CC if test -n "$CC"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 printf "%s\n" "$CC" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi fi if test -z "$ac_cv_prog_CC"; then ac_ct_CC=$CC # Extract the first word of "gcc", so it can be a program name with args. set dummy gcc; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_ac_ct_CC+y} then : printf %s "(cached) " >&6 else case e in @%:@( e) if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in @%:@((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="gcc" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi ;; esac fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 printf "%s\n" "$ac_ct_CC" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi else CC="$ac_cv_prog_CC" fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. set dummy ${ac_tool_prefix}cc; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_CC+y} then : printf %s "(cached) " >&6 else case e in @%:@( e) if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in @%:@((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}cc" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi ;; esac fi CC=$ac_cv_prog_CC if test -n "$CC"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 printf "%s\n" "$CC" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi fi fi if test -z "$CC"; then # Extract the first word of "cc", so it can be a program name with args. set dummy cc; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_CC+y} then : printf %s "(cached) " >&6 else case e in @%:@( e) if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else ac_prog_rejected=no as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in @%:@((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then if test "$as_dir$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then ac_prog_rejected=yes continue fi ac_cv_prog_CC="cc" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS if test $ac_prog_rejected = yes; then # We found a bogon in the path, so make sure we never use it. set dummy $ac_cv_prog_CC shift if test $@%:@ != 0; then # We chose a different compiler from the bogus one. # However, it has the same basename, so the bogon will be chosen # first if we set CC to just the basename; use the full file name. shift ac_cv_prog_CC="$as_dir$ac_word${1+' '}$@" fi fi fi ;; esac fi CC=$ac_cv_prog_CC if test -n "$CC"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 printf "%s\n" "$CC" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then for ac_prog in cl.exe do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_CC+y} then : printf %s "(cached) " >&6 else case e in @%:@( e) if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in @%:@((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_CC="$ac_tool_prefix$ac_prog" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi ;; esac fi CC=$ac_cv_prog_CC if test -n "$CC"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 printf "%s\n" "$CC" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi test -n "$CC" && break done fi if test -z "$CC"; then ac_ct_CC=$CC for ac_prog in cl.exe do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_ac_ct_CC+y} then : printf %s "(cached) " >&6 else case e in @%:@( e) if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in @%:@((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="$ac_prog" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi ;; esac fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 printf "%s\n" "$ac_ct_CC" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi test -n "$ac_ct_CC" && break done if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi fi fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}clang", so it can be a program name with args. set dummy ${ac_tool_prefix}clang; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_CC+y} then : printf %s "(cached) " >&6 else case e in @%:@( e) if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in @%:@((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}clang" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi ;; esac fi CC=$ac_cv_prog_CC if test -n "$CC"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 printf "%s\n" "$CC" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi fi if test -z "$ac_cv_prog_CC"; then ac_ct_CC=$CC # Extract the first word of "clang", so it can be a program name with args. set dummy clang; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_ac_ct_CC+y} then : printf %s "(cached) " >&6 else case e in @%:@( e) if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in @%:@((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="clang" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi ;; esac fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 printf "%s\n" "$ac_ct_CC" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi else CC="$ac_cv_prog_CC" fi fi test -z "$CC" && { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in '$ac_pwd':" >&5 printf "%s\n" "$as_me: error: in '$ac_pwd':" >&2;} as_fn_error $? "no acceptable C compiler found in \$PATH See 'config.log' for more details" "$LINENO" 5; } # Provide some information about the compiler. printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5 set X $ac_compile ac_compiler=$2 for ac_option in --version -v -V -qversion -version; do { { ac_try="$ac_compiler $ac_option >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" printf "%s\n" "$ac_try_echo"; } >&5 (eval "$ac_compiler $ac_option >&5") 2>conftest.err ac_status=$? if test -s conftest.err; then sed '10a\ ... rest of stderr output deleted ... 10q' conftest.err >conftest.er1 cat conftest.er1 >&5 fi rm -f conftest.er1 conftest.err printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } done cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main (void) { ; return 0; } _ACEOF ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out" # Try to create an executable without -o first, disregard a.out. # It will help us diagnose broken compilers, and finding out an intuition # of exeext. { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the C compiler works" >&5 printf %s "checking whether the C compiler works... " >&6; } ac_link_default=`printf "%s\n" "$ac_link" | sed 's/ -o *conftest[^ ]*//'` # The possible output files: ac_files="a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*" ac_rmfiles= for ac_file in $ac_files do case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; * ) ac_rmfiles="$ac_rmfiles $ac_file";; esac done rm -f $ac_rmfiles if { { ac_try="$ac_link_default" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" printf "%s\n" "$ac_try_echo"; } >&5 (eval "$ac_link_default") 2>&5 ac_status=$? printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } then : # Autoconf-2.13 could set the ac_cv_exeext variable to 'no'. # So ignore a value of 'no', otherwise this would lead to 'EXEEXT = no' # in a Makefile. We should not override ac_cv_exeext if it was cached, # so that the user can short-circuit this test for compilers unknown to # Autoconf. for ac_file in $ac_files '' do test -f "$ac_file" || continue case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; [ab].out ) # We found the default executable, but exeext='' is most # certainly right. break;; *.* ) if test ${ac_cv_exeext+y} && test "$ac_cv_exeext" != no; then :; else ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` fi # We set ac_cv_exeext here because the later test for it is not # safe: cross compilers may not add the suffix if given an '-o' # argument, so we may need to know it at that point already. # Even if this section looks crufty: it has the advantage of # actually working. break;; * ) break;; esac done test "$ac_cv_exeext" = no && ac_cv_exeext= else case e in @%:@( e) ac_file='' ;; esac fi if test -z "$ac_file" then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } printf "%s\n" "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in '$ac_pwd':" >&5 printf "%s\n" "$as_me: error: in '$ac_pwd':" >&2;} as_fn_error 77 "C compiler cannot create executables See 'config.log' for more details" "$LINENO" 5; } else case e in @%:@( e) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 printf "%s\n" "yes" >&6; } ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for C compiler default output file name" >&5 printf %s "checking for C compiler default output file name... " >&6; } { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5 printf "%s\n" "$ac_file" >&6; } ac_exeext=$ac_cv_exeext rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out ac_clean_files=$ac_clean_files_save { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5 printf %s "checking for suffix of executables... " >&6; } if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" printf "%s\n" "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } then : # If both 'conftest.exe' and 'conftest' are 'present' (well, observable) # catch 'conftest.exe'. For instance with Cygwin, 'ls conftest' will # work properly (i.e., refer to 'conftest.exe'), while it won't with # 'rm'. for ac_file in conftest.exe conftest conftest.*; do test -f "$ac_file" || continue case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` break;; * ) break;; esac done else case e in @%:@( e) { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in '$ac_pwd':" >&5 printf "%s\n" "$as_me: error: in '$ac_pwd':" >&2;} as_fn_error $? "cannot compute suffix of executables: cannot compile and link See 'config.log' for more details" "$LINENO" 5; } ;; esac fi rm -f conftest conftest$ac_cv_exeext { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5 printf "%s\n" "$ac_cv_exeext" >&6; } rm -f conftest.$ac_ext EXEEXT=$ac_cv_exeext ac_exeext=$EXEEXT cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ @%:@include int main (void) { FILE *f = fopen ("conftest.out", "w"); if (!f) return 1; return ferror (f) || fclose (f) != 0; ; return 0; } _ACEOF ac_clean_files="$ac_clean_files conftest.out" # Check that the compiler produces executables we can run. If not, either # the compiler is broken, or we cross compile. { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5 printf %s "checking whether we are cross compiling... " >&6; } if test "$cross_compiling" != yes; then { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" printf "%s\n" "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } if { ac_try='./conftest$ac_cv_exeext' { { case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" printf "%s\n" "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; }; then cross_compiling=no else if test "$cross_compiling" = maybe; then cross_compiling=yes else { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in '$ac_pwd':" >&5 printf "%s\n" "$as_me: error: in '$ac_pwd':" >&2;} as_fn_error 77 "cannot run C compiled programs. If you meant to cross compile, use '--host'. See 'config.log' for more details" "$LINENO" 5; } fi fi fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5 printf "%s\n" "$cross_compiling" >&6; } rm -f conftest.$ac_ext conftest$ac_cv_exeext \ conftest.o conftest.obj conftest.out ac_clean_files=$ac_clean_files_save { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5 printf %s "checking for suffix of object files... " >&6; } if test ${ac_cv_objext+y} then : printf %s "(cached) " >&6 else case e in @%:@( e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main (void) { ; return 0; } _ACEOF rm -f conftest.o conftest.obj if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" printf "%s\n" "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>&5 ac_status=$? printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } then : for ac_file in conftest.o conftest.obj conftest.*; do test -f "$ac_file" || continue; case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM ) ;; *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'` break;; esac done else case e in @%:@( e) printf "%s\n" "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in '$ac_pwd':" >&5 printf "%s\n" "$as_me: error: in '$ac_pwd':" >&2;} as_fn_error $? "cannot compute suffix of object files: cannot compile See 'config.log' for more details" "$LINENO" 5; } ;; esac fi rm -f conftest.$ac_cv_objext conftest.$ac_ext ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5 printf "%s\n" "$ac_cv_objext" >&6; } OBJEXT=$ac_cv_objext ac_objext=$OBJEXT { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the compiler supports GNU C" >&5 printf %s "checking whether the compiler supports GNU C... " >&6; } if test ${ac_cv_c_compiler_gnu+y} then : printf %s "(cached) " >&6 else case e in @%:@( e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main (void) { #ifndef __GNUC__ choke me #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : ac_compiler_gnu=yes else case e in @%:@( e) ac_compiler_gnu=no ;; esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ac_cv_c_compiler_gnu=$ac_compiler_gnu ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5 printf "%s\n" "$ac_cv_c_compiler_gnu" >&6; } ac_compiler_gnu=$ac_cv_c_compiler_gnu if test $ac_compiler_gnu = yes; then GCC=yes else GCC= fi ac_test_CFLAGS=${CFLAGS+y} ac_save_CFLAGS=$CFLAGS { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5 printf %s "checking whether $CC accepts -g... " >&6; } if test ${ac_cv_prog_cc_g+y} then : printf %s "(cached) " >&6 else case e in @%:@( e) ac_save_c_werror_flag=$ac_c_werror_flag ac_c_werror_flag=yes ac_cv_prog_cc_g=no CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main (void) { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : ac_cv_prog_cc_g=yes else case e in @%:@( e) CFLAGS="" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main (void) { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : else case e in @%:@( e) ac_c_werror_flag=$ac_save_c_werror_flag CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main (void) { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : ac_cv_prog_cc_g=yes fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ;; esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ;; esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ac_c_werror_flag=$ac_save_c_werror_flag ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5 printf "%s\n" "$ac_cv_prog_cc_g" >&6; } if test $ac_test_CFLAGS; then CFLAGS=$ac_save_CFLAGS elif test $ac_cv_prog_cc_g = yes; then if test "$GCC" = yes; then CFLAGS="-g -O2" else CFLAGS="-g" fi else if test "$GCC" = yes; then CFLAGS="-O2" else CFLAGS= fi fi ac_prog_cc_stdc=no if test x$ac_prog_cc_stdc = xno then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $CC option to enable C11 features" >&5 printf %s "checking for $CC option to enable C11 features... " >&6; } if test ${ac_cv_prog_cc_c11+y} then : printf %s "(cached) " >&6 else case e in @%:@( e) ac_cv_prog_cc_c11=no ac_save_CC=$CC cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_c_conftest_c11_program _ACEOF for ac_arg in '' -std=gnu11 do CC="$ac_save_CC $ac_arg" if ac_fn_c_try_compile "$LINENO" then : ac_cv_prog_cc_c11=$ac_arg fi rm -f core conftest.err conftest.$ac_objext conftest.beam test "x$ac_cv_prog_cc_c11" != "xno" && break done rm -f conftest.$ac_ext CC=$ac_save_CC ;; esac fi if test "x$ac_cv_prog_cc_c11" = xno then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 printf "%s\n" "unsupported" >&6; } else case e in @%:@( e) if test "x$ac_cv_prog_cc_c11" = x then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 printf "%s\n" "none needed" >&6; } else case e in @%:@( e) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c11" >&5 printf "%s\n" "$ac_cv_prog_cc_c11" >&6; } CC="$CC $ac_cv_prog_cc_c11" ;; esac fi ac_cv_prog_cc_stdc=$ac_cv_prog_cc_c11 ac_prog_cc_stdc=c11 ;; esac fi fi if test x$ac_prog_cc_stdc = xno then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $CC option to enable C99 features" >&5 printf %s "checking for $CC option to enable C99 features... " >&6; } if test ${ac_cv_prog_cc_c99+y} then : printf %s "(cached) " >&6 else case e in @%:@( e) ac_cv_prog_cc_c99=no ac_save_CC=$CC cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_c_conftest_c99_program _ACEOF for ac_arg in '' -std=gnu99 -std=c99 -c99 -qlanglvl=extc1x -qlanglvl=extc99 -AC99 -D_STDC_C99= do CC="$ac_save_CC $ac_arg" if ac_fn_c_try_compile "$LINENO" then : ac_cv_prog_cc_c99=$ac_arg fi rm -f core conftest.err conftest.$ac_objext conftest.beam test "x$ac_cv_prog_cc_c99" != "xno" && break done rm -f conftest.$ac_ext CC=$ac_save_CC ;; esac fi if test "x$ac_cv_prog_cc_c99" = xno then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 printf "%s\n" "unsupported" >&6; } else case e in @%:@( e) if test "x$ac_cv_prog_cc_c99" = x then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 printf "%s\n" "none needed" >&6; } else case e in @%:@( e) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c99" >&5 printf "%s\n" "$ac_cv_prog_cc_c99" >&6; } CC="$CC $ac_cv_prog_cc_c99" ;; esac fi ac_cv_prog_cc_stdc=$ac_cv_prog_cc_c99 ac_prog_cc_stdc=c99 ;; esac fi fi if test x$ac_prog_cc_stdc = xno then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $CC option to enable C89 features" >&5 printf %s "checking for $CC option to enable C89 features... " >&6; } if test ${ac_cv_prog_cc_c89+y} then : printf %s "(cached) " >&6 else case e in @%:@( e) ac_cv_prog_cc_c89=no ac_save_CC=$CC cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_c_conftest_c89_program _ACEOF for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" do CC="$ac_save_CC $ac_arg" if ac_fn_c_try_compile "$LINENO" then : ac_cv_prog_cc_c89=$ac_arg fi rm -f core conftest.err conftest.$ac_objext conftest.beam test "x$ac_cv_prog_cc_c89" != "xno" && break done rm -f conftest.$ac_ext CC=$ac_save_CC ;; esac fi if test "x$ac_cv_prog_cc_c89" = xno then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 printf "%s\n" "unsupported" >&6; } else case e in @%:@( e) if test "x$ac_cv_prog_cc_c89" = x then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 printf "%s\n" "none needed" >&6; } else case e in @%:@( e) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 printf "%s\n" "$ac_cv_prog_cc_c89" >&6; } CC="$CC $ac_cv_prog_cc_c89" ;; esac fi ac_cv_prog_cc_stdc=$ac_cv_prog_cc_c89 ac_prog_cc_stdc=c89 ;; esac fi fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu ac_header= ac_cache= for ac_item in $ac_header_c_list do if test $ac_cache; then ac_fn_c_check_header_compile "$LINENO" $ac_header ac_cv_header_$ac_cache "$ac_includes_default" if eval test \"x\$ac_cv_header_$ac_cache\" = xyes; then printf "%s\n" "#define $ac_item 1" >> confdefs.h fi ac_header= ac_cache= elif test $ac_header; then ac_cache=$ac_item else ac_header=$ac_item fi done if test $ac_cv_header_stdlib_h = yes && test $ac_cv_header_string_h = yes then : printf "%s\n" "@%:@define STDC_HEADERS 1" >>confdefs.h fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether it is safe to define __EXTENSIONS__" >&5 printf %s "checking whether it is safe to define __EXTENSIONS__... " >&6; } if test ${ac_cv_safe_to_define___extensions__+y} then : printf %s "(cached) " >&6 else case e in @%:@( e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ # define __EXTENSIONS__ 1 $ac_includes_default int main (void) { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : ac_cv_safe_to_define___extensions__=yes else case e in @%:@( e) ac_cv_safe_to_define___extensions__=no ;; esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_safe_to_define___extensions__" >&5 printf "%s\n" "$ac_cv_safe_to_define___extensions__" >&6; } { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether _XOPEN_SOURCE should be defined" >&5 printf %s "checking whether _XOPEN_SOURCE should be defined... " >&6; } if test ${ac_cv_should_define__xopen_source+y} then : printf %s "(cached) " >&6 else case e in @%:@( e) ac_cv_should_define__xopen_source=no if test $ac_cv_header_wchar_h = yes then : cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include mbstate_t x; int main (void) { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : else case e in @%:@( e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #define _XOPEN_SOURCE 500 #include mbstate_t x; int main (void) { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : ac_cv_should_define__xopen_source=yes fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ;; esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext fi ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_should_define__xopen_source" >&5 printf "%s\n" "$ac_cv_should_define__xopen_source" >&6; } printf "%s\n" "@%:@define _ALL_SOURCE 1" >>confdefs.h printf "%s\n" "@%:@define _DARWIN_C_SOURCE 1" >>confdefs.h printf "%s\n" "@%:@define _GNU_SOURCE 1" >>confdefs.h printf "%s\n" "@%:@define _HPUX_ALT_XOPEN_SOCKET_API 1" >>confdefs.h printf "%s\n" "@%:@define _NETBSD_SOURCE 1" >>confdefs.h printf "%s\n" "@%:@define _OPENBSD_SOURCE 1" >>confdefs.h printf "%s\n" "@%:@define _POSIX_PTHREAD_SEMANTICS 1" >>confdefs.h printf "%s\n" "@%:@define __STDC_WANT_IEC_60559_ATTRIBS_EXT__ 1" >>confdefs.h printf "%s\n" "@%:@define __STDC_WANT_IEC_60559_BFP_EXT__ 1" >>confdefs.h printf "%s\n" "@%:@define __STDC_WANT_IEC_60559_DFP_EXT__ 1" >>confdefs.h printf "%s\n" "@%:@define __STDC_WANT_IEC_60559_EXT__ 1" >>confdefs.h printf "%s\n" "@%:@define __STDC_WANT_IEC_60559_FUNCS_EXT__ 1" >>confdefs.h printf "%s\n" "@%:@define __STDC_WANT_IEC_60559_TYPES_EXT__ 1" >>confdefs.h printf "%s\n" "@%:@define __STDC_WANT_LIB_EXT2__ 1" >>confdefs.h printf "%s\n" "@%:@define __STDC_WANT_MATH_SPEC_FUNCS__ 1" >>confdefs.h printf "%s\n" "@%:@define _TANDEM_SOURCE 1" >>confdefs.h if test $ac_cv_header_minix_config_h = yes then : MINIX=yes printf "%s\n" "@%:@define _MINIX 1" >>confdefs.h printf "%s\n" "@%:@define _POSIX_SOURCE 1" >>confdefs.h printf "%s\n" "@%:@define _POSIX_1_SOURCE 2" >>confdefs.h else case e in @%:@( e) MINIX= ;; esac fi if test $ac_cv_safe_to_define___extensions__ = yes then : printf "%s\n" "@%:@define __EXTENSIONS__ 1" >>confdefs.h fi if test $ac_cv_should_define__xopen_source = yes then : printf "%s\n" "@%:@define _XOPEN_SOURCE 500" >>confdefs.h fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. set dummy ${ac_tool_prefix}gcc; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_CC+y} then : printf %s "(cached) " >&6 else case e in @%:@( e) if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in @%:@((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}gcc" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi ;; esac fi CC=$ac_cv_prog_CC if test -n "$CC"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 printf "%s\n" "$CC" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi fi if test -z "$ac_cv_prog_CC"; then ac_ct_CC=$CC # Extract the first word of "gcc", so it can be a program name with args. set dummy gcc; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_ac_ct_CC+y} then : printf %s "(cached) " >&6 else case e in @%:@( e) if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in @%:@((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="gcc" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi ;; esac fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 printf "%s\n" "$ac_ct_CC" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi else CC="$ac_cv_prog_CC" fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. set dummy ${ac_tool_prefix}cc; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_CC+y} then : printf %s "(cached) " >&6 else case e in @%:@( e) if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in @%:@((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}cc" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi ;; esac fi CC=$ac_cv_prog_CC if test -n "$CC"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 printf "%s\n" "$CC" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi fi fi if test -z "$CC"; then # Extract the first word of "cc", so it can be a program name with args. set dummy cc; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_CC+y} then : printf %s "(cached) " >&6 else case e in @%:@( e) if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else ac_prog_rejected=no as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in @%:@((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then if test "$as_dir$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then ac_prog_rejected=yes continue fi ac_cv_prog_CC="cc" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS if test $ac_prog_rejected = yes; then # We found a bogon in the path, so make sure we never use it. set dummy $ac_cv_prog_CC shift if test $@%:@ != 0; then # We chose a different compiler from the bogus one. # However, it has the same basename, so the bogon will be chosen # first if we set CC to just the basename; use the full file name. shift ac_cv_prog_CC="$as_dir$ac_word${1+' '}$@" fi fi fi ;; esac fi CC=$ac_cv_prog_CC if test -n "$CC"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 printf "%s\n" "$CC" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then for ac_prog in cl.exe do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_CC+y} then : printf %s "(cached) " >&6 else case e in @%:@( e) if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in @%:@((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_CC="$ac_tool_prefix$ac_prog" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi ;; esac fi CC=$ac_cv_prog_CC if test -n "$CC"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 printf "%s\n" "$CC" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi test -n "$CC" && break done fi if test -z "$CC"; then ac_ct_CC=$CC for ac_prog in cl.exe do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_ac_ct_CC+y} then : printf %s "(cached) " >&6 else case e in @%:@( e) if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in @%:@((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="$ac_prog" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi ;; esac fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 printf "%s\n" "$ac_ct_CC" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi test -n "$ac_ct_CC" && break done if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi fi fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}clang", so it can be a program name with args. set dummy ${ac_tool_prefix}clang; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_CC+y} then : printf %s "(cached) " >&6 else case e in @%:@( e) if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in @%:@((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}clang" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi ;; esac fi CC=$ac_cv_prog_CC if test -n "$CC"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 printf "%s\n" "$CC" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi fi if test -z "$ac_cv_prog_CC"; then ac_ct_CC=$CC # Extract the first word of "clang", so it can be a program name with args. set dummy clang; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_ac_ct_CC+y} then : printf %s "(cached) " >&6 else case e in @%:@( e) if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in @%:@((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="clang" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi ;; esac fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 printf "%s\n" "$ac_ct_CC" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi else CC="$ac_cv_prog_CC" fi fi test -z "$CC" && { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in '$ac_pwd':" >&5 printf "%s\n" "$as_me: error: in '$ac_pwd':" >&2;} as_fn_error $? "no acceptable C compiler found in \$PATH See 'config.log' for more details" "$LINENO" 5; } # Provide some information about the compiler. printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5 set X $ac_compile ac_compiler=$2 for ac_option in --version -v -V -qversion -version; do { { ac_try="$ac_compiler $ac_option >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" printf "%s\n" "$ac_try_echo"; } >&5 (eval "$ac_compiler $ac_option >&5") 2>conftest.err ac_status=$? if test -s conftest.err; then sed '10a\ ... rest of stderr output deleted ... 10q' conftest.err >conftest.er1 cat conftest.er1 >&5 fi rm -f conftest.er1 conftest.err printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } done { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the compiler supports GNU C" >&5 printf %s "checking whether the compiler supports GNU C... " >&6; } if test ${ac_cv_c_compiler_gnu+y} then : printf %s "(cached) " >&6 else case e in @%:@( e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main (void) { #ifndef __GNUC__ choke me #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : ac_compiler_gnu=yes else case e in @%:@( e) ac_compiler_gnu=no ;; esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ac_cv_c_compiler_gnu=$ac_compiler_gnu ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5 printf "%s\n" "$ac_cv_c_compiler_gnu" >&6; } ac_compiler_gnu=$ac_cv_c_compiler_gnu if test $ac_compiler_gnu = yes; then GCC=yes else GCC= fi ac_test_CFLAGS=${CFLAGS+y} ac_save_CFLAGS=$CFLAGS { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5 printf %s "checking whether $CC accepts -g... " >&6; } if test ${ac_cv_prog_cc_g+y} then : printf %s "(cached) " >&6 else case e in @%:@( e) ac_save_c_werror_flag=$ac_c_werror_flag ac_c_werror_flag=yes ac_cv_prog_cc_g=no CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main (void) { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : ac_cv_prog_cc_g=yes else case e in @%:@( e) CFLAGS="" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main (void) { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : else case e in @%:@( e) ac_c_werror_flag=$ac_save_c_werror_flag CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main (void) { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : ac_cv_prog_cc_g=yes fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ;; esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ;; esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ac_c_werror_flag=$ac_save_c_werror_flag ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5 printf "%s\n" "$ac_cv_prog_cc_g" >&6; } if test $ac_test_CFLAGS; then CFLAGS=$ac_save_CFLAGS elif test $ac_cv_prog_cc_g = yes; then if test "$GCC" = yes; then CFLAGS="-g -O2" else CFLAGS="-g" fi else if test "$GCC" = yes; then CFLAGS="-O2" else CFLAGS= fi fi ac_prog_cc_stdc=no if test x$ac_prog_cc_stdc = xno then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $CC option to enable C11 features" >&5 printf %s "checking for $CC option to enable C11 features... " >&6; } if test ${ac_cv_prog_cc_c11+y} then : printf %s "(cached) " >&6 else case e in @%:@( e) ac_cv_prog_cc_c11=no ac_save_CC=$CC cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_c_conftest_c11_program _ACEOF for ac_arg in '' -std=gnu11 do CC="$ac_save_CC $ac_arg" if ac_fn_c_try_compile "$LINENO" then : ac_cv_prog_cc_c11=$ac_arg fi rm -f core conftest.err conftest.$ac_objext conftest.beam test "x$ac_cv_prog_cc_c11" != "xno" && break done rm -f conftest.$ac_ext CC=$ac_save_CC ;; esac fi if test "x$ac_cv_prog_cc_c11" = xno then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 printf "%s\n" "unsupported" >&6; } else case e in @%:@( e) if test "x$ac_cv_prog_cc_c11" = x then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 printf "%s\n" "none needed" >&6; } else case e in @%:@( e) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c11" >&5 printf "%s\n" "$ac_cv_prog_cc_c11" >&6; } CC="$CC $ac_cv_prog_cc_c11" ;; esac fi ac_cv_prog_cc_stdc=$ac_cv_prog_cc_c11 ac_prog_cc_stdc=c11 ;; esac fi fi if test x$ac_prog_cc_stdc = xno then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $CC option to enable C99 features" >&5 printf %s "checking for $CC option to enable C99 features... " >&6; } if test ${ac_cv_prog_cc_c99+y} then : printf %s "(cached) " >&6 else case e in @%:@( e) ac_cv_prog_cc_c99=no ac_save_CC=$CC cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_c_conftest_c99_program _ACEOF for ac_arg in '' -std=gnu99 -std=c99 -c99 -qlanglvl=extc1x -qlanglvl=extc99 -AC99 -D_STDC_C99= do CC="$ac_save_CC $ac_arg" if ac_fn_c_try_compile "$LINENO" then : ac_cv_prog_cc_c99=$ac_arg fi rm -f core conftest.err conftest.$ac_objext conftest.beam test "x$ac_cv_prog_cc_c99" != "xno" && break done rm -f conftest.$ac_ext CC=$ac_save_CC ;; esac fi if test "x$ac_cv_prog_cc_c99" = xno then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 printf "%s\n" "unsupported" >&6; } else case e in @%:@( e) if test "x$ac_cv_prog_cc_c99" = x then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 printf "%s\n" "none needed" >&6; } else case e in @%:@( e) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c99" >&5 printf "%s\n" "$ac_cv_prog_cc_c99" >&6; } CC="$CC $ac_cv_prog_cc_c99" ;; esac fi ac_cv_prog_cc_stdc=$ac_cv_prog_cc_c99 ac_prog_cc_stdc=c99 ;; esac fi fi if test x$ac_prog_cc_stdc = xno then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $CC option to enable C89 features" >&5 printf %s "checking for $CC option to enable C89 features... " >&6; } if test ${ac_cv_prog_cc_c89+y} then : printf %s "(cached) " >&6 else case e in @%:@( e) ac_cv_prog_cc_c89=no ac_save_CC=$CC cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_c_conftest_c89_program _ACEOF for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" do CC="$ac_save_CC $ac_arg" if ac_fn_c_try_compile "$LINENO" then : ac_cv_prog_cc_c89=$ac_arg fi rm -f core conftest.err conftest.$ac_objext conftest.beam test "x$ac_cv_prog_cc_c89" != "xno" && break done rm -f conftest.$ac_ext CC=$ac_save_CC ;; esac fi if test "x$ac_cv_prog_cc_c89" = xno then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 printf "%s\n" "unsupported" >&6; } else case e in @%:@( e) if test "x$ac_cv_prog_cc_c89" = x then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 printf "%s\n" "none needed" >&6; } else case e in @%:@( e) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 printf "%s\n" "$ac_cv_prog_cc_c89" >&6; } CC="$CC $ac_cv_prog_cc_c89" ;; esac fi ac_cv_prog_cc_stdc=$ac_cv_prog_cc_c89 ac_prog_cc_stdc=c89 ;; esac fi fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu for ac_prog in gawk mawk nawk awk do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_AWK+y} then : printf %s "(cached) " >&6 else case e in @%:@( e) if test -n "$AWK"; then ac_cv_prog_AWK="$AWK" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in @%:@((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_AWK="$ac_prog" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi ;; esac fi AWK=$ac_cv_prog_AWK if test -n "$AWK"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $AWK" >&5 printf "%s\n" "$AWK" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi test -n "$AWK" && break done # Find a good install program. We prefer a C program (faster), # so one script is as good as another. But avoid the broken or # incompatible versions: # SysV /etc/install, /usr/sbin/install # SunOS /usr/etc/install # IRIX /sbin/install # AIX /bin/install # AmigaOS /C/install, which installs bootblocks on floppy discs # AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag # AFS /usr/afsws/bin/install, which mishandles nonexistent args # SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" # OS/2's system install, which has a completely different semantic # ./install, which can be erroneously created by make from ./install.sh. # Reject install programs that cannot install multiple files. { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for a BSD-compatible install" >&5 printf %s "checking for a BSD-compatible install... " >&6; } if test -z "$INSTALL"; then if test ${ac_cv_path_install+y} then : printf %s "(cached) " >&6 else case e in @%:@( e) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in @%:@((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac # Account for fact that we put trailing slashes in our PATH walk. case $as_dir in @%:@(( ./ | /[cC]/* | \ /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \ ?:[\\/]os2[\\/]install[\\/]* | ?:[\\/]OS2[\\/]INSTALL[\\/]* | \ /usr/ucb/* ) ;; *) # OSF1 and SCO ODT 3.0 have their own names for install. # Don't use installbsd from OSF since it installs stuff as root # by default. for ac_prog in ginstall scoinst install; do for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_prog$ac_exec_ext"; then if test $ac_prog = install && grep dspmsg "$as_dir$ac_prog$ac_exec_ext" >/dev/null 2>&1; then # AIX install. It has an incompatible calling convention. : elif test $ac_prog = install && grep pwplus "$as_dir$ac_prog$ac_exec_ext" >/dev/null 2>&1; then # program-specific install script used by HP pwplus--don't use. : else rm -rf conftest.one conftest.two conftest.dir echo one > conftest.one echo two > conftest.two mkdir conftest.dir if "$as_dir$ac_prog$ac_exec_ext" -c conftest.one conftest.two "`pwd`/conftest.dir/" && test -s conftest.one && test -s conftest.two && test -s conftest.dir/conftest.one && test -s conftest.dir/conftest.two then ac_cv_path_install="$as_dir$ac_prog$ac_exec_ext -c" break 3 fi fi fi done done ;; esac done IFS=$as_save_IFS rm -rf conftest.one conftest.two conftest.dir ;; esac fi if test ${ac_cv_path_install+y}; then INSTALL=$ac_cv_path_install else # As a last resort, use the slow shell script. Don't cache a # value for INSTALL within a source directory, because that will # break other packages using the cache if that directory is # removed, or if the value is a relative name. INSTALL=$ac_install_sh fi fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $INSTALL" >&5 printf "%s\n" "$INSTALL" >&6; } # Use test -z because SunOS4 sh mishandles braces in ${var-val}. # It thinks the first close brace ends the variable substitution. test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}' test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}' test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' ac_fn_c_check_func "$LINENO" "execvpe" "ac_cv_func_execvpe" if test "x$ac_cv_func_execvpe" = xyes then : printf "%s\n" "@%:@define HAVE_EXECVPE 1" >>confdefs.h fi ac_fn_c_check_func "$LINENO" "seteuid" "ac_cv_func_seteuid" if test "x$ac_cv_func_seteuid" = xyes then : printf "%s\n" "@%:@define HAVE_SETEUID 1" >>confdefs.h fi ac_fn_c_check_func "$LINENO" "setegid" "ac_cv_func_setegid" if test "x$ac_cv_func_setegid" = xyes then : printf "%s\n" "@%:@define HAVE_SETEGID 1" >>confdefs.h fi ac_fn_c_check_func "$LINENO" "setreuid" "ac_cv_func_setreuid" if test "x$ac_cv_func_setreuid" = xyes then : printf "%s\n" "@%:@define HAVE_SETREUID 1" >>confdefs.h fi ac_fn_c_check_func "$LINENO" "setresuid" "ac_cv_func_setresuid" if test "x$ac_cv_func_setresuid" = xyes then : printf "%s\n" "@%:@define HAVE_SETRESUID 1" >>confdefs.h fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for library containing tgetent" >&5 printf %s "checking for library containing tgetent... " >&6; } if test ${ac_cv_search_tgetent+y} then : printf %s "(cached) " >&6 else case e in @%:@( e) ac_func_search_save_LIBS=$LIBS cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. The 'extern "C"' is for builds by C++ compilers; although this is not generally supported in C code supporting it here has little cost and some practical benefit (sr 110532). */ #ifdef __cplusplus extern "C" #endif char tgetent (void); int main (void) { return tgetent (); ; return 0; } _ACEOF for ac_lib in '' curses termcap termlib ncursesw tinfow ncurses tinfo do if test -z "$ac_lib"; then ac_res="none required" else ac_res=-l$ac_lib LIBS="-l$ac_lib $ac_func_search_save_LIBS" fi if ac_fn_c_try_link "$LINENO" then : ac_cv_search_tgetent=$ac_res fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext if test ${ac_cv_search_tgetent+y} then : break fi done if test ${ac_cv_search_tgetent+y} then : else case e in @%:@( e) ac_cv_search_tgetent=no ;; esac fi rm conftest.$ac_ext LIBS=$ac_func_search_save_LIBS ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_tgetent" >&5 printf "%s\n" "$ac_cv_search_tgetent" >&6; } ac_res=$ac_cv_search_tgetent if test "$ac_res" != no then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" else case e in @%:@( e) as_fn_error $? "unable to find tgetent() function" "$LINENO" 5 ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for library containing crypt" >&5 printf %s "checking for library containing crypt... " >&6; } if test ${ac_cv_search_crypt+y} then : printf %s "(cached) " >&6 else case e in @%:@( e) ac_func_search_save_LIBS=$LIBS cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. The 'extern "C"' is for builds by C++ compilers; although this is not generally supported in C code supporting it here has little cost and some practical benefit (sr 110532). */ #ifdef __cplusplus extern "C" #endif char crypt (void); int main (void) { return crypt (); ; return 0; } _ACEOF for ac_lib in '' crypt do if test -z "$ac_lib"; then ac_res="none required" else ac_res=-l$ac_lib LIBS="-l$ac_lib $ac_func_search_save_LIBS" fi if ac_fn_c_try_link "$LINENO" then : ac_cv_search_crypt=$ac_res fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext if test ${ac_cv_search_crypt+y} then : break fi done if test ${ac_cv_search_crypt+y} then : else case e in @%:@( e) ac_cv_search_crypt=no ;; esac fi rm conftest.$ac_ext LIBS=$ac_func_search_save_LIBS ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_crypt" >&5 printf "%s\n" "$ac_cv_search_crypt" >&6; } ac_res=$ac_cv_search_crypt if test "$ac_res" != no then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" else case e in @%:@( e) as_fn_error $? "unable to find crypt() function" "$LINENO" 5 ;; esac fi ac_fn_c_check_header_compile "$LINENO" "pty.h" "ac_cv_header_pty_h" "$ac_includes_default" if test "x$ac_cv_header_pty_h" = xyes then : printf "%s\n" "@%:@define HAVE_PTY_H 1" >>confdefs.h fi ac_fn_c_check_header_compile "$LINENO" "util.h" "ac_cv_header_util_h" "$ac_includes_default" if test "x$ac_cv_header_util_h" = xyes then : printf "%s\n" "@%:@define HAVE_UTIL_H 1" >>confdefs.h fi ac_fn_c_check_header_compile "$LINENO" "libutil.h" "ac_cv_header_libutil_h" "$ac_includes_default" if test "x$ac_cv_header_libutil_h" = xyes then : printf "%s\n" "@%:@define HAVE_LIBUTIL_H 1" >>confdefs.h fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for library containing openpty" >&5 printf %s "checking for library containing openpty... " >&6; } if test ${ac_cv_search_openpty+y} then : printf %s "(cached) " >&6 else case e in @%:@( e) ac_func_search_save_LIBS=$LIBS cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. The 'extern "C"' is for builds by C++ compilers; although this is not generally supported in C code supporting it here has little cost and some practical benefit (sr 110532). */ #ifdef __cplusplus extern "C" #endif char openpty (void); int main (void) { return openpty (); ; return 0; } _ACEOF for ac_lib in '' util openpty bsd do if test -z "$ac_lib"; then ac_res="none required" else ac_res=-l$ac_lib LIBS="-l$ac_lib $ac_func_search_save_LIBS" fi if ac_fn_c_try_link "$LINENO" then : ac_cv_search_openpty=$ac_res fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext if test ${ac_cv_search_openpty+y} then : break fi done if test ${ac_cv_search_openpty+y} then : else case e in @%:@( e) ac_cv_search_openpty=no ;; esac fi rm conftest.$ac_ext LIBS=$ac_func_search_save_LIBS ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_openpty" >&5 printf "%s\n" "$ac_cv_search_openpty" >&6; } ac_res=$ac_cv_search_openpty if test "$ac_res" != no then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" printf "%s\n" "@%:@define HAVE_OPENPTY 1" >>confdefs.h else case e in @%:@( e) as_fn_error $? "unable to find openpty() function" "$LINENO" 5 ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for library containing socket" >&5 printf %s "checking for library containing socket... " >&6; } if test ${ac_cv_search_socket+y} then : printf %s "(cached) " >&6 else case e in @%:@( e) ac_func_search_save_LIBS=$LIBS cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. The 'extern "C"' is for builds by C++ compilers; although this is not generally supported in C code supporting it here has little cost and some practical benefit (sr 110532). */ #ifdef __cplusplus extern "C" #endif char socket (void); int main (void) { return socket (); ; return 0; } _ACEOF for ac_lib in '' network do if test -z "$ac_lib"; then ac_res="none required" else ac_res=-l$ac_lib LIBS="-l$ac_lib $ac_func_search_save_LIBS" fi if ac_fn_c_try_link "$LINENO" then : ac_cv_search_socket=$ac_res fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext if test ${ac_cv_search_socket+y} then : break fi done if test ${ac_cv_search_socket+y} then : else case e in @%:@( e) ac_cv_search_socket=no ;; esac fi rm conftest.$ac_ext LIBS=$ac_func_search_save_LIBS ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_socket" >&5 printf "%s\n" "$ac_cv_search_socket" >&6; } ac_res=$ac_cv_search_socket if test "$ac_res" != no then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" else case e in @%:@( e) as_fn_error $? "unable to find socket() function" "$LINENO" 5 ;; esac fi ac_fn_c_check_header_compile "$LINENO" "langinfo.h" "ac_cv_header_langinfo_h" "$ac_includes_default" if test "x$ac_cv_header_langinfo_h" = xyes then : printf "%s\n" "@%:@define HAVE_LANGINFO_H 1" >>confdefs.h fi ac_fn_c_check_header_compile "$LINENO" "dirent.h" "ac_cv_header_dirent_h" "$ac_includes_default" if test "x$ac_cv_header_dirent_h" = xyes then : printf "%s\n" "@%:@define HAVE_DIRENT_H 1" >>confdefs.h fi @%:@ Check whether --enable-pam was given. if test ${enable_pam+y} then : enableval=$enable_pam; enable_pam=$enableval else case e in @%:@( e) enable_pam=yes ;; esac fi @%:@ Check whether --enable-utmp was given. if test ${enable_utmp+y} then : enableval=$enable_utmp; enable_utmp=$enableval else case e in @%:@( e) enable_utmp=no ;; esac fi @%:@ Check whether --enable-telnet was given. if test ${enable_telnet+y} then : enableval=$enable_telnet; enable_telnet=$enableval else case e in @%:@( e) enable_telnet=no ;; esac fi @%:@ Check whether --enable-socket-dir was given. if test ${enable_socket_dir+y} then : enableval=$enable_socket_dir; enable_socket_dir=$enableval else case e in @%:@( e) enable_socket_dir=no ;; esac fi @%:@ Check whether --with-system_screenrc was given. if test ${with_system_screenrc+y} then : withval=$with_system_screenrc; with_system_screenrc=$withval else case e in @%:@( e) with_system_screenrc=/etc/screenrc ;; esac fi @%:@ Check whether --with-pty-mode was given. if test ${with_pty_mode+y} then : withval=$with_pty_mode; with_pty_mode=$withval else case e in @%:@( e) with_pty_mode=0620 ;; esac fi @%:@ Check whether --with-pty-group was given. if test ${with_pty_group+y} then : withval=$with_pty_group; with_pty_group=$withval else case e in @%:@( e) with_pty_group=5 ;; esac fi @%:@ Check whether --with-pty-rofs was given. if test ${with_pty_rofs+y} then : withval=$with_pty_rofs; with_pty_rofs=$withval else case e in @%:@( e) with_pty_rofs=no ;; esac fi if test "x$enable_pam" = "xyes" then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for PAM support" >&5 printf %s "checking for PAM support... " >&6; } oldlibs="$LIBS" LIBS="$LIBS -lpam" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main (void) { pam_start(0, 0, 0, 0); pam_authenticate(0, 0); pam_end(0,0); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO" then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 printf "%s\n" "yes" >&6; }; printf "%s\n" "@%:@define ENABLE_PAM 1" >>confdefs.h else case e in @%:@( e) as_fn_error $? "no" "$LINENO" 5;LIBS="$oldlibs" ;; esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext fi if test "x$enable_utmp" = "xyes" then : for ac_header in utmpx.h do : ac_fn_c_check_header_compile "$LINENO" "utmpx.h" "ac_cv_header_utmpx_h" "$ac_includes_default" if test "x$ac_cv_header_utmpx_h" = xyes then : printf "%s\n" "@%:@define HAVE_UTMPX_H 1" >>confdefs.h have_utmpx=yes else case e in @%:@( e) have_utmpx=no ;; esac fi done if test "x$have_utmpx" != "xyes" then : as_fn_error $? "Missing utmpx.h" "$LINENO" 5 fi ac_fn_c_check_header_compile "$LINENO" "utempter.h" "ac_cv_header_utempter_h" "$ac_includes_default" if test "x$ac_cv_header_utempter_h" = xyes then : have_utempter=yes else case e in @%:@( e) have_utempter=no ;; esac fi if test "x$have_utempter" = "xyes" then : printf "%s\n" "@%:@define HAVE_UTEMPTER 1" >>confdefs.h LIBS="$LIBS -lutempter" fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if utmpx struct has ut_host field" >&5 printf %s "checking if utmpx struct has ut_host field... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main (void) { struct utmpx u; u.ut_host[0] = 0; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 printf "%s\n" "yes" >&6; } printf "%s\n" "@%:@define HAVE_UT_HOST 1" >>confdefs.h else case e in @%:@( e) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } ;; esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if utmpx struct has ut_exit field" >&5 printf %s "checking if utmpx struct has ut_exit field... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main (void) { struct utmpx u; u.ut_exit.e_exit; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 printf "%s\n" "yes" >&6; } printf "%s\n" "@%:@define HAVE_UT_EXIT 1" >>confdefs.h else case e in @%:@( e) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } ;; esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext printf "%s\n" "@%:@define ENABLE_UTMP 1" >>confdefs.h fi if test "x$enable_telnet" = "xyes" then : printf "%s\n" "@%:@define ENABLE_TELNET 1" >>confdefs.h fi if test "x$enable_socket_dir" != "xno" then : if test "x$enable_socket_dir" = "xyes" then : enable_socket_dir="/run/screen" fi printf "%s\n" "@%:@define SOCKET_DIR \"$enable_socket_dir\"" >>confdefs.h fi printf "%s\n" "@%:@define SYSTEM_SCREENRC \"$with_system_screenrc\"" >>confdefs.h printf "%s\n" "@%:@define PTY_MODE $with_pty_mode" >>confdefs.h printf "%s\n" "@%:@define PTY_GROUP $with_pty_group" >>confdefs.h if test "x$with_pty_rofs" = "xyes" then : printf "%s\n" "@%:@define PTY_ROFS 1" >>confdefs.h fi ac_config_files="$ac_config_files Makefile doc/Makefile" cat >confcache <<\_ACEOF # This file is a shell script that caches the results of configure # tests run on this system so they can be shared between configure # scripts and configure runs, see configure's option --config-cache. # It is not useful on other systems. If it contains results you don't # want to keep, you may remove or edit it. # # config.status only pays attention to the cache file if you give it # the --recheck option to rerun configure. # # 'ac_cv_env_foo' variables (set or unset) will be overridden when # loading this file, other *unset* 'ac_cv_foo' will be assigned the # following values. _ACEOF # The following way of writing the cache mishandles newlines in values, # but we know of no workaround that is simple, portable, and efficient. # So, we kill variables containing newlines. # Ultrix sh set writes to stderr and can't be redirected directly, # and sets the high bit in the cache file unless we assign to the vars. ( for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 printf "%s\n" "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space=' '; set) 2>&1` in #( *${as_nl}ac_space=\ *) # 'set' does not quote correctly, so add quotes: double-quote # substitution turns \\\\ into \\, and sed turns \\ into \. sed -n \ "s/'/'\\\\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" ;; #( *) # 'set' quotes correctly as required by POSIX, so do not add quotes. sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) | sed ' /^ac_cv_env_/b end t clear :clear s/^\([^=]*\)=\(.*[{}].*\)$/test ${\1+y} || &/ t end s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ :end' >>confcache if diff "$cache_file" confcache >/dev/null 2>&1; then :; else if test -w "$cache_file"; then if test "x$cache_file" != "x/dev/null"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5 printf "%s\n" "$as_me: updating cache $cache_file" >&6;} if test ! -f "$cache_file" || test -h "$cache_file"; then cat confcache >"$cache_file" else case $cache_file in #( */* | ?:*) mv -f confcache "$cache_file"$$ && mv -f "$cache_file"$$ "$cache_file" ;; #( *) mv -f confcache "$cache_file" ;; esac fi fi else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5 printf "%s\n" "$as_me: not updating unwritable cache $cache_file" >&6;} fi fi rm -f confcache test "x$prefix" = xNONE && prefix=$ac_default_prefix # Let make expand exec_prefix. test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' DEFS=-DHAVE_CONFIG_H ac_libobjs= ac_ltlibobjs= U= for ac_i in : $LIB@&t@OBJS; do test "x$ac_i" = x: && continue # 1. Remove the extension, and $U if already installed. ac_script='s/\$U\././;s/\.o$//;s/\.obj$//' ac_i=`printf "%s\n" "$ac_i" | sed "$ac_script"` # 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR # will be set to the directory where LIBOBJS objects are built. as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext" as_fn_append ac_ltlibobjs " \${LIBOBJDIR}$ac_i"'$U.lo' done LIB@&t@OBJS=$ac_libobjs LTLIBOBJS=$ac_ltlibobjs : "${CONFIG_STATUS=./config.status}" ac_write_fail=0 ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files $CONFIG_STATUS" { printf "%s\n" "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5 printf "%s\n" "$as_me: creating $CONFIG_STATUS" >&6;} as_write_fail=0 cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1 #! $SHELL # Generated by $as_me. # Run this file to recreate the current configuration. # Compiler output produced by configure, useful for debugging # configure, is in config.log if it exists. debug=false ac_cs_recheck=false ac_cs_silent=false SHELL=\${CONFIG_SHELL-$SHELL} export SHELL _ASEOF cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1 ## -------------------- ## ## M4sh Initialization. ## ## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test ${ZSH_VERSION+y} && (emulate sh) >/dev/null 2>&1 then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case e in @%:@( e) case `(set -o) 2>/dev/null` in @%:@( *posix*) : set -o posix ;; @%:@( *) : ;; esac ;; esac fi # Reset variables that may have inherited troublesome values from # the environment. # IFS needs to be set, to space, tab, and newline, in precisely that order. # (If _AS_PATH_WALK were called with IFS unset, it would have the # side effect of setting IFS to empty, thus disabling word splitting.) # Quoting is to prevent editors from complaining about space-tab. as_nl=' ' export as_nl IFS=" "" $as_nl" PS1='$ ' PS2='> ' PS4='+ ' # Ensure predictable behavior from utilities with locale-dependent output. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # We cannot yet rely on "unset" to work, but we need these variables # to be unset--not just set to an empty or harmless value--now, to # avoid bugs in old shells (e.g. pre-3.0 UWIN ksh). This construct # also avoids known problems related to "unset" and subshell syntax # in other old shells (e.g. bash 2.01 and pdksh 5.2.14). for as_var in BASH_ENV ENV MAIL MAILPATH CDPATH do eval test \${$as_var+y} \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done # Ensure that fds 0, 1, and 2 are open. if (exec 3>&0) 2>/dev/null; then :; else exec 0&1) 2>/dev/null; then :; else exec 1>/dev/null; fi if (exec 3>&2) ; then :; else exec 2>/dev/null; fi # The user is always right. if ${PATH_SEPARATOR+false} :; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # Find who we are. Look in the path if we contain no directory separator. as_myself= case $0 in @%:@(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in @%:@((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac test -r "$as_dir$0" && as_myself=$as_dir$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as 'sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then printf "%s\n" "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi @%:@ as_fn_error STATUS ERROR [LINENO LOG_FD] @%:@ ---------------------------------------- @%:@ Output "`basename @S|@0`: error: ERROR" to stderr. If LINENO and LOG_FD are @%:@ provided, also output the error to LOG_FD, referencing LINENO. Then exit the @%:@ script with STATUS, using 1 if that was 0. as_fn_error () { as_status=$1; test $as_status -eq 0 && as_status=1 if test "$4"; then as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi printf "%s\n" "$as_me: error: $2" >&2 as_fn_exit $as_status } @%:@ as_fn_error @%:@ as_fn_set_status STATUS @%:@ ----------------------- @%:@ Set @S|@? to STATUS, without forking. as_fn_set_status () { return $1 } @%:@ as_fn_set_status @%:@ as_fn_exit STATUS @%:@ ----------------- @%:@ Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } @%:@ as_fn_exit @%:@ as_fn_unset VAR @%:@ --------------- @%:@ Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset @%:@ as_fn_append VAR VALUE @%:@ ---------------------- @%:@ Append the text in VALUE to the end of the definition contained in VAR. Take @%:@ advantage of any shell optimizations that allow amortized linear growth over @%:@ repeated appends, instead of the typical quadratic growth present in naive @%:@ implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null then : eval 'as_fn_append () { eval $1+=\$2 }' else case e in @%:@( e) as_fn_append () { eval $1=\$$1\$2 } ;; esac fi # as_fn_append @%:@ as_fn_arith ARG... @%:@ ------------------ @%:@ Perform arithmetic evaluation on the ARGs, and store the result in the @%:@ global @S|@as_val. Take advantage of shells that can avoid forks. The arguments @%:@ must be portable across @S|@(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null then : eval 'as_fn_arith () { as_val=$(( $* )) }' else case e in @%:@( e) as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } ;; esac fi # as_fn_arith if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || printf "%s\n" X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits # Determine whether it's possible to make 'echo' print without a newline. # These variables are no longer used directly by Autoconf, but are AC_SUBSTed # for compatibility with existing Makefiles. ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in @%:@((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac # For backward compatibility with old third-party macros, we provide # the shell variables $as_echo and $as_echo_n. New code should use # AS_ECHO(["message"]) and AS_ECHO_N(["message"]), respectively. as_@&t@echo='printf %s\n' as_@&t@echo_n='printf %s' rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both 'ln -s file dir' and 'ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; 'ln -s' creates a wrapper executable. # In both cases, we have to default to 'cp -pR'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -pR' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -pR' fi else as_ln_s='cp -pR' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null @%:@ as_fn_mkdir_p @%:@ ------------- @%:@ Create "@S|@as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`printf "%s\n" "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || printf "%s\n" X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" } @%:@ as_fn_mkdir_p if mkdir -p . 2>/dev/null; then as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi @%:@ as_fn_executable_p FILE @%:@ ----------------------- @%:@ Test if FILE is an executable regular file. as_fn_executable_p () { test -f "$1" && test -x "$1" } @%:@ as_fn_executable_p as_test_x='test -x' as_executable_p=as_fn_executable_p # Sed expression to map a string onto a valid CPP name. as_sed_cpp="y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g" as_tr_cpp="eval sed '$as_sed_cpp'" # deprecated # Sed expression to map a string onto a valid variable name. as_sed_sh="y%*+%pp%;s%[^_$as_cr_alnum]%_%g" as_tr_sh="eval sed '$as_sed_sh'" # deprecated exec 6>&1 ## ----------------------------------- ## ## Main body of $CONFIG_STATUS script. ## ## ----------------------------------- ## _ASEOF test $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1 cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # Save the log message, to keep $0 and so on meaningful, and to # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log=" This file was extended by GNU Screen $as_me 5.0.2, which was generated by GNU Autoconf 2.72. Invocation command line was CONFIG_FILES = $CONFIG_FILES CONFIG_HEADERS = $CONFIG_HEADERS CONFIG_LINKS = $CONFIG_LINKS CONFIG_COMMANDS = $CONFIG_COMMANDS $ $0 $@ on `(hostname || uname -n) 2>/dev/null | sed 1q` " _ACEOF case $ac_config_files in *" "*) set x $ac_config_files; shift; ac_config_files=$*;; esac case $ac_config_headers in *" "*) set x $ac_config_headers; shift; ac_config_headers=$*;; esac cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 # Files that config.status was made for. config_files="$ac_config_files" config_headers="$ac_config_headers" _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 ac_cs_usage="\ '$as_me' instantiates files and other configuration actions from templates according to the current configuration. Unless the files and actions are specified as TAGs, all are instantiated by default. Usage: $0 [OPTION]... [TAG]... -h, --help print this help, then exit -V, --version print version number and configuration settings, then exit --config print configuration, then exit -q, --quiet, --silent do not print progress messages -d, --debug don't remove temporary files --recheck update $as_me by reconfiguring in the same conditions --file=FILE[:TEMPLATE] instantiate the configuration file FILE --header=FILE[:TEMPLATE] instantiate the configuration header FILE Configuration files: $config_files Configuration headers: $config_headers Report bugs to . GNU Screen home page: . General help using GNU software: ." _ACEOF ac_cs_config=`printf "%s\n" "$ac_configure_args" | sed "$ac_safe_unquote"` ac_cs_config_escaped=`printf "%s\n" "$ac_cs_config" | sed "s/^ //; s/'/'\\\\\\\\''/g"` cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_cs_config='$ac_cs_config_escaped' ac_cs_version="\\ GNU Screen config.status 5.0.2 configured by $0, generated by GNU Autoconf 2.72, with options \\"\$ac_cs_config\\" Copyright (C) 2023 Free Software Foundation, Inc. This config.status script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it." ac_pwd='$ac_pwd' srcdir='$srcdir' INSTALL='$INSTALL' AWK='$AWK' test -n "\$AWK" || AWK=awk _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # The default lists apply if the user does not specify any file. ac_need_defaults=: while test $# != 0 do case $1 in --*=?*) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'` ac_shift=: ;; --*=) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg= ac_shift=: ;; *) ac_option=$1 ac_optarg=$2 ac_shift=shift ;; esac case $ac_option in # Handling of the options. -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) ac_cs_recheck=: ;; --version | --versio | --versi | --vers | --ver | --ve | --v | -V ) printf "%s\n" "$ac_cs_version"; exit ;; --config | --confi | --conf | --con | --co | --c ) printf "%s\n" "$ac_cs_config"; exit ;; --debug | --debu | --deb | --de | --d | -d ) debug=: ;; --file | --fil | --fi | --f ) $ac_shift case $ac_optarg in *\'*) ac_optarg=`printf "%s\n" "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; '') as_fn_error $? "missing file argument" ;; esac as_fn_append CONFIG_FILES " '$ac_optarg'" ac_need_defaults=false;; --header | --heade | --head | --hea ) $ac_shift case $ac_optarg in *\'*) ac_optarg=`printf "%s\n" "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; esac as_fn_append CONFIG_HEADERS " '$ac_optarg'" ac_need_defaults=false;; --he | --h) # Conflict between --help and --header as_fn_error $? "ambiguous option: '$1' Try '$0 --help' for more information.";; --help | --hel | -h ) printf "%s\n" "$ac_cs_usage"; exit ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil | --si | --s) ac_cs_silent=: ;; # This is an error. -*) as_fn_error $? "unrecognized option: '$1' Try '$0 --help' for more information." ;; *) as_fn_append ac_config_targets " $1" ac_need_defaults=false ;; esac shift done ac_configure_extra_args= if $ac_cs_silent; then exec 6>/dev/null ac_configure_extra_args="$ac_configure_extra_args --silent" fi _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 if \$ac_cs_recheck; then set X $SHELL '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion shift \printf "%s\n" "running CONFIG_SHELL=$SHELL \$*" >&6 CONFIG_SHELL='$SHELL' export CONFIG_SHELL exec "\$@" fi _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 exec 5>>config.log { echo sed 'h;s/./-/g;s/^.../@%:@@%:@ /;s/...$/ @%:@@%:@/;p;x;p;x' <<_ASBOX @%:@@%:@ Running $as_me. @%:@@%:@ _ASBOX printf "%s\n" "$ac_log" } >&5 _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # Handling of arguments. for ac_config_target in $ac_config_targets do case $ac_config_target in "config.h") CONFIG_HEADERS="$CONFIG_HEADERS config.h" ;; "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;; "doc/Makefile") CONFIG_FILES="$CONFIG_FILES doc/Makefile" ;; *) as_fn_error $? "invalid argument: '$ac_config_target'" "$LINENO" 5;; esac done # If the user did not use the arguments to specify the items to instantiate, # then the envvar interface is used. Set only those that are not. # We use the long form for the default assignment because of an extremely # bizarre bug on SunOS 4.1.3. if $ac_need_defaults; then test ${CONFIG_FILES+y} || CONFIG_FILES=$config_files test ${CONFIG_HEADERS+y} || CONFIG_HEADERS=$config_headers fi # Have a temporary directory for convenience. Make it in the build tree # simply because there is no reason against having it here, and in addition, # creating and moving files from /tmp can sometimes cause problems. # Hook for its removal unless debugging. # Note that there is a small window in which the directory will not be cleaned: # after its creation but before its name has been assigned to '$tmp'. $debug || { tmp= ac_tmp= trap 'exit_status=$? : "${ac_tmp:=$tmp}" { test ! -d "$ac_tmp" || rm -fr "$ac_tmp"; } && exit $exit_status ' 0 trap 'as_fn_exit 1' 1 2 13 15 } # Create a (secure) tmp directory for tmp files. { tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` && test -d "$tmp" } || { tmp=./conf$$-$RANDOM (umask 077 && mkdir "$tmp") } || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5 ac_tmp=$tmp # Set up the scripts for CONFIG_FILES section. # No need to generate them if there are no CONFIG_FILES. # This happens for instance with './config.status config.h'. if test -n "$CONFIG_FILES"; then ac_cr=`echo X | tr X '\015'` # On cygwin, bash can eat \r inside `` if the user requested igncr. # But we know of no other shell where ac_cr would be empty at this # point, so we can use a bashism as a fallback. if test "x$ac_cr" = x; then eval ac_cr=\$\'\\r\' fi ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' /dev/null` if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then ac_cs_awk_cr='\\r' else ac_cs_awk_cr=$ac_cr fi echo 'BEGIN {' >"$ac_tmp/subs1.awk" && _ACEOF { echo "cat >conf$$subs.awk <<_ACEOF" && echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' && echo "_ACEOF" } >conf$$subs.sh || as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_num=`echo "$ac_subst_vars" | grep -c '^'` ac_delim='%!_!# ' for ac_last_try in false false false false false :; do . ./conf$$subs.sh || as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X` if test $ac_delim_n = $ac_delim_num; then break elif $ac_last_try; then as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 else ac_delim="$ac_delim!$ac_delim _$ac_delim!! " fi done rm -f conf$$subs.sh cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 cat >>"\$ac_tmp/subs1.awk" <<\\_ACAWK && _ACEOF sed -n ' h s/^/S["/; s/!.*/"]=/ p g s/^[^!]*!// :repl t repl s/'"$ac_delim"'$// t delim :nl h s/\(.\{148\}\)..*/\1/ t more1 s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/ p n b repl :more1 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t nl :delim h s/\(.\{148\}\)..*/\1/ t more2 s/["\\]/\\&/g; s/^/"/; s/$/"/ p b :more2 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t delim ' >$CONFIG_STATUS || ac_write_fail=1 rm -f conf$$subs.awk cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 _ACAWK cat >>"\$ac_tmp/subs1.awk" <<_ACAWK && for (key in S) S_is_set[key] = 1 FS = "" } { line = $ 0 nfields = split(line, field, "@") substed = 0 len = length(field[1]) for (i = 2; i < nfields; i++) { key = field[i] keylen = length(key) if (S_is_set[key]) { value = S[key] line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3) len += length(value) + length(field[++i]) substed = 1 } else len += 1 + keylen } print line } _ACAWK _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g" else cat fi < "$ac_tmp/subs1.awk" > "$ac_tmp/subs.awk" \ || as_fn_error $? "could not setup config files machinery" "$LINENO" 5 _ACEOF # VPATH may cause trouble with some makes, so we remove sole $(srcdir), # ${srcdir} and @srcdir@ entries from VPATH if srcdir is ".", strip leading and # trailing colons and then remove the whole line if VPATH becomes empty # (actually we leave an empty line to preserve line numbers). if test "x$srcdir" = x.; then ac_vpsub='/^[ ]*VPATH[ ]*=[ ]*/{ h s/// s/^/:/ s/[ ]*$/:/ s/:\$(srcdir):/:/g s/:\${srcdir}:/:/g s/:@srcdir@:/:/g s/^:*// s/:*$// x s/\(=[ ]*\).*/\1/ G s/\n// s/^[^=]*=[ ]*$// }' fi cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 fi # test -n "$CONFIG_FILES" # Set up the scripts for CONFIG_HEADERS section. # No need to generate them if there are no CONFIG_HEADERS. # This happens for instance with './config.status Makefile'. if test -n "$CONFIG_HEADERS"; then cat >"$ac_tmp/defines.awk" <<\_ACAWK || BEGIN { _ACEOF # Transform confdefs.h into an awk script 'defines.awk', embedded as # here-document in config.status, that substitutes the proper values into # config.h.in to produce config.h. # Create a delimiter string that does not exist in confdefs.h, to ease # handling of long lines. ac_delim='%!_!# ' for ac_last_try in false false :; do ac_tt=`sed -n "/$ac_delim/p" confdefs.h` if test -z "$ac_tt"; then break elif $ac_last_try; then as_fn_error $? "could not make $CONFIG_HEADERS" "$LINENO" 5 else ac_delim="$ac_delim!$ac_delim _$ac_delim!! " fi done # For the awk script, D is an array of macro values keyed by name, # likewise P contains macro parameters if any. Preserve backslash # newline sequences. ac_word_re=[_$as_cr_Letters][_$as_cr_alnum]* sed -n ' s/.\{148\}/&'"$ac_delim"'/g t rset :rset s/^[ ]*#[ ]*define[ ][ ]*/ / t def d :def s/\\$// t bsnl s/["\\]/\\&/g s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ D["\1"]=" \3"/p s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2"/p d :bsnl s/["\\]/\\&/g s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ D["\1"]=" \3\\\\\\n"\\/p t cont s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2\\\\\\n"\\/p t cont d :cont n s/.\{148\}/&'"$ac_delim"'/g t clear :clear s/\\$// t bsnlc s/["\\]/\\&/g; s/^/"/; s/$/"/p d :bsnlc s/["\\]/\\&/g; s/^/"/; s/$/\\\\\\n"\\/p b cont ' >$CONFIG_STATUS || ac_write_fail=1 cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 for (key in D) D_is_set[key] = 1 FS = "" } /^[\t ]*#[\t ]*(define|undef)[\t ]+$ac_word_re([\t (]|\$)/ { line = \$ 0 split(line, arg, " ") if (arg[1] == "#") { defundef = arg[2] mac1 = arg[3] } else { defundef = substr(arg[1], 2) mac1 = arg[2] } split(mac1, mac2, "(") #) macro = mac2[1] prefix = substr(line, 1, index(line, defundef) - 1) if (D_is_set[macro]) { # Preserve the white space surrounding the "#". print prefix "define", macro P[macro] D[macro] next } else { # Replace #undef with comments. This is necessary, for example, # in the case of _POSIX_SOURCE, which is predefined and required # on some systems where configure will not decide to define it. if (defundef == "undef") { print "/*", prefix defundef, macro, "*/" next } } } { print } _ACAWK _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 as_fn_error $? "could not setup config headers machinery" "$LINENO" 5 fi # test -n "$CONFIG_HEADERS" eval set X " :F $CONFIG_FILES :H $CONFIG_HEADERS " shift for ac_tag do case $ac_tag in :[FHLC]) ac_mode=$ac_tag; continue;; esac case $ac_mode$ac_tag in :[FHL]*:*);; :L* | :C*:*) as_fn_error $? "invalid tag '$ac_tag'" "$LINENO" 5;; :[FH]-) ac_tag=-:-;; :[FH]*) ac_tag=$ac_tag:$ac_tag.in;; esac ac_save_IFS=$IFS IFS=: set x $ac_tag IFS=$ac_save_IFS shift ac_file=$1 shift case $ac_mode in :L) ac_source=$1;; :[FH]) ac_file_inputs= for ac_f do case $ac_f in -) ac_f="$ac_tmp/stdin";; *) # Look for the file first in the build tree, then in the source tree # (if the path is not absolute). The absolute path cannot be DOS-style, # because $ac_f cannot contain ':'. test -f "$ac_f" || case $ac_f in [\\/$]*) false;; *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";; esac || as_fn_error 1 "cannot find input file: '$ac_f'" "$LINENO" 5;; esac case $ac_f in *\'*) ac_f=`printf "%s\n" "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac as_fn_append ac_file_inputs " '$ac_f'" done # Let's still pretend it is 'configure' which instantiates (i.e., don't # use $as_me), people would be surprised to read: # /* config.h. Generated by config.status. */ configure_input='Generated from '` printf "%s\n" "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g' `' by configure.' if test x"$ac_file" != x-; then configure_input="$ac_file. $configure_input" { printf "%s\n" "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5 printf "%s\n" "$as_me: creating $ac_file" >&6;} fi # Neutralize special characters interpreted by sed in replacement strings. case $configure_input in #( *\&* | *\|* | *\\* ) ac_sed_conf_input=`printf "%s\n" "$configure_input" | sed 's/[\\\\&|]/\\\\&/g'`;; #( *) ac_sed_conf_input=$configure_input;; esac case $ac_tag in *:-:* | *:-) cat >"$ac_tmp/stdin" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; esac ;; esac ac_dir=`$as_dirname -- "$ac_file" || $as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$ac_file" : 'X\(//\)[^/]' \| \ X"$ac_file" : 'X\(//\)$' \| \ X"$ac_file" : 'X\(/\)' \| . 2>/dev/null || printf "%s\n" X"$ac_file" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` as_dir="$ac_dir"; as_fn_mkdir_p ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`printf "%s\n" "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`printf "%s\n" "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix case $ac_mode in :F) # # CONFIG_FILE # case $INSTALL in [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;; *) ac_INSTALL=$ac_top_build_prefix$INSTALL ;; esac _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # If the template does not know about datarootdir, expand it. # FIXME: This hack should be removed a few years after 2.60. ac_datarootdir_hack=; ac_datarootdir_seen= ac_sed_dataroot=' /datarootdir/ { p q } /@datadir@/p /@docdir@/p /@infodir@/p /@localedir@/p /@mandir@/p' case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in *datarootdir*) ac_datarootdir_seen=yes;; *@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 printf "%s\n" "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;} _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_datarootdir_hack=' s&@datadir@&$datadir&g s&@docdir@&$docdir&g s&@infodir@&$infodir&g s&@localedir@&$localedir&g s&@mandir@&$mandir&g s&\\\${datarootdir}&$datarootdir&g' ;; esac _ACEOF # Neutralize VPATH when '$srcdir' = '.'. # Shell code in configure.ac might set extrasub. # FIXME: do we really want to maintain this feature? cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_sed_extra="$ac_vpsub $extrasub _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 :t /@[a-zA-Z_][a-zA-Z_0-9]*@/!b s|@configure_input@|$ac_sed_conf_input|;t t s&@top_builddir@&$ac_top_builddir_sub&;t t s&@top_build_prefix@&$ac_top_build_prefix&;t t s&@srcdir@&$ac_srcdir&;t t s&@abs_srcdir@&$ac_abs_srcdir&;t t s&@top_srcdir@&$ac_top_srcdir&;t t s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t s&@builddir@&$ac_builddir&;t t s&@abs_builddir@&$ac_abs_builddir&;t t s&@abs_top_builddir@&$ac_abs_top_builddir&;t t s&@INSTALL@&$ac_INSTALL&;t t $ac_datarootdir_hack " eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$ac_tmp/subs.awk" \ >$ac_tmp/out || as_fn_error $? "could not create $ac_file" "$LINENO" 5 test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && { ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_out"; } && { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' \ "$ac_tmp/out"`; test -z "$ac_out"; } && { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable 'datarootdir' which seems to be undefined. Please make sure it is defined" >&5 printf "%s\n" "$as_me: WARNING: $ac_file contains a reference to the variable 'datarootdir' which seems to be undefined. Please make sure it is defined" >&2;} rm -f "$ac_tmp/stdin" case $ac_file in -) cat "$ac_tmp/out" && rm -f "$ac_tmp/out";; *) rm -f "$ac_file" && mv "$ac_tmp/out" "$ac_file";; esac \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; :H) # # CONFIG_HEADER # if test x"$ac_file" != x-; then { printf "%s\n" "/* $configure_input */" >&1 \ && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" } >"$ac_tmp/config.h" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 if diff "$ac_file" "$ac_tmp/config.h" >/dev/null 2>&1; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: $ac_file is unchanged" >&5 printf "%s\n" "$as_me: $ac_file is unchanged" >&6;} else rm -f "$ac_file" mv "$ac_tmp/config.h" "$ac_file" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 fi else printf "%s\n" "/* $configure_input */" >&1 \ && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" \ || as_fn_error $? "could not create -" "$LINENO" 5 fi ;; esac done # for ac_tag as_fn_exit 0 _ACEOF ac_clean_files=$ac_clean_files_save test $ac_write_fail = 0 || as_fn_error $? "write failure creating $CONFIG_STATUS" "$LINENO" 5 # configure is writing to config.log, and then calls config.status. # config.status does its own redirection, appending to config.log. # Unfortunately, on DOS this fails, as config.log is still kept open # by configure, so config.status won't be able to write to it; its # output is simply discarded. So we exec the FD to /dev/null, # effectively closing config.log, so it can be properly (re)opened and # appended to by config.status. When coming back to configure, we # need to make the FD available again. if test "$no_create" != yes; then ac_cs_success=: ac_config_status_args= test "$silent" = yes && ac_config_status_args="$ac_config_status_args --quiet" exec 5>/dev/null $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false exec 5>>config.log # Use ||, not &&, to avoid exiting from the if with $? = 1, which # would make configure fail if this is the last instruction. $ac_cs_success || as_fn_exit 1 fi if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5 printf "%s\n" "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;} fi echo "" echo "Configuration:" echo "" echo " PAM support: .............................. $enable_pam" echo " telnet support: ........................... $enable_telnet" echo " utmp support: ............................. $enable_utmp" echo " global socket directory: .................. $enable_socket_dir" echo "" echo " system screenrc location: ................. $with_system_screenrc" echo " pty mode: ................................. $with_pty_mode" echo " pty group: ................................ $with_pty_group" echo " pty on read only file system: ............. $with_pty_rofs" echo "" if test "x$enable_pam" != "xyes" then : echo "!!! WARNING !!!" echo "YOU ARE DISABLING PAM SUPPORT!" echo "FOR screen TO WORK IT WILL NEED TO RUN AS SUID root BINARY" echo "THIS CONFIGURATION IS _HIGHLY_ NOT RECOMMENDED!" echo "!!! WARNING !!!" fi screen-5.0.2/autom4te.cache/traces.00000664000175000017500000002553415224432733015627 0ustar alexalexm4trace:configure.ac:1: -1- m4_pattern_forbid([^_?A[CHUM]_]) m4trace:configure.ac:1: -1- m4_pattern_forbid([_AC_]) m4trace:configure.ac:1: -1- m4_pattern_forbid([^LIBOBJS$], [do not use LIBOBJS directly, use AC_LIBOBJ (see section 'AC_LIBOBJ vs LIBOBJS']) m4trace:configure.ac:1: -1- m4_pattern_allow([^AS_FLAGS$]) m4trace:configure.ac:1: -1- m4_pattern_forbid([^_?m4_]) m4trace:configure.ac:1: -1- m4_pattern_forbid([^dnl$]) m4trace:configure.ac:1: -1- m4_pattern_forbid([^_?AS_]) m4trace:configure.ac:1: -1- m4_pattern_allow([^SHELL$]) m4trace:configure.ac:1: -1- m4_pattern_allow([^PATH_SEPARATOR$]) m4trace:configure.ac:1: -1- m4_pattern_allow([^PACKAGE_NAME$]) m4trace:configure.ac:1: -1- m4_pattern_allow([^PACKAGE_TARNAME$]) m4trace:configure.ac:1: -1- m4_pattern_allow([^PACKAGE_VERSION$]) m4trace:configure.ac:1: -1- m4_pattern_allow([^PACKAGE_STRING$]) m4trace:configure.ac:1: -1- m4_pattern_allow([^PACKAGE_BUGREPORT$]) m4trace:configure.ac:1: -1- m4_pattern_allow([^PACKAGE_URL$]) m4trace:configure.ac:1: -1- m4_pattern_allow([^exec_prefix$]) m4trace:configure.ac:1: -1- m4_pattern_allow([^prefix$]) m4trace:configure.ac:1: -1- m4_pattern_allow([^program_transform_name$]) m4trace:configure.ac:1: -1- m4_pattern_allow([^bindir$]) m4trace:configure.ac:1: -1- m4_pattern_allow([^sbindir$]) m4trace:configure.ac:1: -1- m4_pattern_allow([^libexecdir$]) m4trace:configure.ac:1: -1- m4_pattern_allow([^datarootdir$]) m4trace:configure.ac:1: -1- m4_pattern_allow([^datadir$]) m4trace:configure.ac:1: -1- m4_pattern_allow([^sysconfdir$]) m4trace:configure.ac:1: -1- m4_pattern_allow([^sharedstatedir$]) m4trace:configure.ac:1: -1- m4_pattern_allow([^localstatedir$]) m4trace:configure.ac:1: -1- m4_pattern_allow([^runstatedir$]) m4trace:configure.ac:1: -1- m4_pattern_allow([^includedir$]) m4trace:configure.ac:1: -1- m4_pattern_allow([^oldincludedir$]) m4trace:configure.ac:1: -1- m4_pattern_allow([^docdir$]) m4trace:configure.ac:1: -1- m4_pattern_allow([^infodir$]) m4trace:configure.ac:1: -1- m4_pattern_allow([^htmldir$]) m4trace:configure.ac:1: -1- m4_pattern_allow([^dvidir$]) m4trace:configure.ac:1: -1- m4_pattern_allow([^pdfdir$]) m4trace:configure.ac:1: -1- m4_pattern_allow([^psdir$]) m4trace:configure.ac:1: -1- m4_pattern_allow([^libdir$]) m4trace:configure.ac:1: -1- m4_pattern_allow([^localedir$]) m4trace:configure.ac:1: -1- m4_pattern_allow([^mandir$]) m4trace:configure.ac:1: -1- m4_pattern_allow([^PACKAGE_NAME$]) m4trace:configure.ac:1: -1- m4_pattern_allow([^PACKAGE_TARNAME$]) m4trace:configure.ac:1: -1- m4_pattern_allow([^PACKAGE_VERSION$]) m4trace:configure.ac:1: -1- m4_pattern_allow([^PACKAGE_STRING$]) m4trace:configure.ac:1: -1- m4_pattern_allow([^PACKAGE_BUGREPORT$]) m4trace:configure.ac:1: -1- m4_pattern_allow([^PACKAGE_URL$]) m4trace:configure.ac:1: -1- m4_pattern_allow([^DEFS$]) m4trace:configure.ac:1: -1- m4_pattern_allow([^ECHO_C$]) m4trace:configure.ac:1: -1- m4_pattern_allow([^ECHO_N$]) m4trace:configure.ac:1: -1- m4_pattern_allow([^ECHO_T$]) m4trace:configure.ac:1: -1- m4_pattern_allow([^LIBS$]) m4trace:configure.ac:1: -1- m4_pattern_allow([^build_alias$]) m4trace:configure.ac:1: -1- m4_pattern_allow([^host_alias$]) m4trace:configure.ac:1: -1- m4_pattern_allow([^target_alias$]) m4trace:configure.ac:7: -1- m4_pattern_allow([^VERSION_MAJOR$]) m4trace:configure.ac:10: -1- m4_pattern_allow([^VERSION_MINOR$]) m4trace:configure.ac:13: -1- m4_pattern_allow([^VERSION_REVISION$]) m4trace:configure.ac:49: -1- AC_DEFUN([_AC_Header_stdio_h], [m4_divert_text([INIT_PREPARE], [AS_VAR_APPEND([ac_header_]]_AC_LANG_ABBREV[[_list], [" stdio.h ]AS_TR_SH([stdio.h]) AS_TR_CPP([HAVE_stdio.h])["])])_AC_HEADERS_EXPANSION(_AC_LANG_ABBREV)]) m4trace:configure.ac:49: -1- m4_pattern_allow([^CC$]) m4trace:configure.ac:49: -1- m4_pattern_allow([^CFLAGS$]) m4trace:configure.ac:49: -1- m4_pattern_allow([^LDFLAGS$]) m4trace:configure.ac:49: -1- m4_pattern_allow([^LIBS$]) m4trace:configure.ac:49: -1- m4_pattern_allow([^CPPFLAGS$]) m4trace:configure.ac:49: -1- m4_pattern_allow([^CC$]) m4trace:configure.ac:49: -1- m4_pattern_allow([^CC$]) m4trace:configure.ac:49: -1- m4_pattern_allow([^CC$]) m4trace:configure.ac:49: -1- m4_pattern_allow([^CC$]) m4trace:configure.ac:49: -1- m4_pattern_allow([^ac_ct_CC$]) m4trace:configure.ac:49: -1- m4_pattern_allow([^CC$]) m4trace:configure.ac:49: -1- m4_pattern_allow([^EXEEXT$]) m4trace:configure.ac:49: -1- m4_pattern_allow([^OBJEXT$]) m4trace:configure.ac:49: -1- AC_DEFUN([_AC_Header_stdlib_h], [m4_divert_text([INIT_PREPARE], [AS_VAR_APPEND([ac_header_]]_AC_LANG_ABBREV[[_list], [" stdlib.h ]AS_TR_SH([stdlib.h]) AS_TR_CPP([HAVE_stdlib.h])["])])_AC_HEADERS_EXPANSION(_AC_LANG_ABBREV)]) m4trace:configure.ac:49: -1- AC_DEFUN([_AC_Header_string_h], [m4_divert_text([INIT_PREPARE], [AS_VAR_APPEND([ac_header_]]_AC_LANG_ABBREV[[_list], [" string.h ]AS_TR_SH([string.h]) AS_TR_CPP([HAVE_string.h])["])])_AC_HEADERS_EXPANSION(_AC_LANG_ABBREV)]) m4trace:configure.ac:49: -1- AC_DEFUN([_AC_Header_inttypes_h], [m4_divert_text([INIT_PREPARE], [AS_VAR_APPEND([ac_header_]]_AC_LANG_ABBREV[[_list], [" inttypes.h ]AS_TR_SH([inttypes.h]) AS_TR_CPP([HAVE_inttypes.h])["])])_AC_HEADERS_EXPANSION(_AC_LANG_ABBREV)]) m4trace:configure.ac:49: -1- AC_DEFUN([_AC_Header_stdint_h], [m4_divert_text([INIT_PREPARE], [AS_VAR_APPEND([ac_header_]]_AC_LANG_ABBREV[[_list], [" stdint.h ]AS_TR_SH([stdint.h]) AS_TR_CPP([HAVE_stdint.h])["])])_AC_HEADERS_EXPANSION(_AC_LANG_ABBREV)]) m4trace:configure.ac:49: -1- AC_DEFUN([_AC_Header_strings_h], [m4_divert_text([INIT_PREPARE], [AS_VAR_APPEND([ac_header_]]_AC_LANG_ABBREV[[_list], [" strings.h ]AS_TR_SH([strings.h]) AS_TR_CPP([HAVE_strings.h])["])])_AC_HEADERS_EXPANSION(_AC_LANG_ABBREV)]) m4trace:configure.ac:49: -1- AC_DEFUN([_AC_Header_sys_stat_h], [m4_divert_text([INIT_PREPARE], [AS_VAR_APPEND([ac_header_]]_AC_LANG_ABBREV[[_list], [" sys/stat.h ]AS_TR_SH([sys/stat.h]) AS_TR_CPP([HAVE_sys/stat.h])["])])_AC_HEADERS_EXPANSION(_AC_LANG_ABBREV)]) m4trace:configure.ac:49: -1- AC_DEFUN([_AC_Header_sys_types_h], [m4_divert_text([INIT_PREPARE], [AS_VAR_APPEND([ac_header_]]_AC_LANG_ABBREV[[_list], [" sys/types.h ]AS_TR_SH([sys/types.h]) AS_TR_CPP([HAVE_sys/types.h])["])])_AC_HEADERS_EXPANSION(_AC_LANG_ABBREV)]) m4trace:configure.ac:49: -1- AC_DEFUN([_AC_Header_unistd_h], [m4_divert_text([INIT_PREPARE], [AS_VAR_APPEND([ac_header_]]_AC_LANG_ABBREV[[_list], [" unistd.h ]AS_TR_SH([unistd.h]) AS_TR_CPP([HAVE_unistd.h])["])])_AC_HEADERS_EXPANSION(_AC_LANG_ABBREV)]) m4trace:configure.ac:49: -1- m4_pattern_allow([^STDC_HEADERS$]) m4trace:configure.ac:49: -1- AC_DEFUN([_AC_Header_wchar_h], [m4_divert_text([INIT_PREPARE], [AS_VAR_APPEND([ac_header_]]_AC_LANG_ABBREV[[_list], [" wchar.h ]AS_TR_SH([wchar.h]) AS_TR_CPP([HAVE_wchar.h])["])])_AC_HEADERS_EXPANSION(_AC_LANG_ABBREV)]) m4trace:configure.ac:49: -1- AC_DEFUN([_AC_Header_minix_config_h], [m4_divert_text([INIT_PREPARE], [AS_VAR_APPEND([ac_header_]]_AC_LANG_ABBREV[[_list], [" minix/config.h ]AS_TR_SH([minix/config.h]) AS_TR_CPP([HAVE_minix/config.h])["])])_AC_HEADERS_EXPANSION(_AC_LANG_ABBREV)]) m4trace:configure.ac:49: -1- m4_pattern_allow([^_ALL_SOURCE$]) m4trace:configure.ac:49: -1- m4_pattern_allow([^_DARWIN_C_SOURCE$]) m4trace:configure.ac:49: -1- m4_pattern_allow([^_GNU_SOURCE$]) m4trace:configure.ac:49: -1- m4_pattern_allow([^_HPUX_ALT_XOPEN_SOCKET_API$]) m4trace:configure.ac:49: -1- m4_pattern_allow([^_NETBSD_SOURCE$]) m4trace:configure.ac:49: -1- m4_pattern_allow([^_OPENBSD_SOURCE$]) m4trace:configure.ac:49: -1- m4_pattern_allow([^_POSIX_PTHREAD_SEMANTICS$]) m4trace:configure.ac:49: -1- m4_pattern_allow([^__STDC_WANT_IEC_60559_ATTRIBS_EXT__$]) m4trace:configure.ac:49: -1- m4_pattern_allow([^__STDC_WANT_IEC_60559_BFP_EXT__$]) m4trace:configure.ac:49: -1- m4_pattern_allow([^__STDC_WANT_IEC_60559_DFP_EXT__$]) m4trace:configure.ac:49: -1- m4_pattern_allow([^__STDC_WANT_IEC_60559_EXT__$]) m4trace:configure.ac:49: -1- m4_pattern_allow([^__STDC_WANT_IEC_60559_FUNCS_EXT__$]) m4trace:configure.ac:49: -1- m4_pattern_allow([^__STDC_WANT_IEC_60559_TYPES_EXT__$]) m4trace:configure.ac:49: -1- m4_pattern_allow([^__STDC_WANT_LIB_EXT2__$]) m4trace:configure.ac:49: -1- m4_pattern_allow([^__STDC_WANT_MATH_SPEC_FUNCS__$]) m4trace:configure.ac:49: -1- m4_pattern_allow([^_TANDEM_SOURCE$]) m4trace:configure.ac:49: -1- m4_pattern_allow([^_MINIX$]) m4trace:configure.ac:49: -1- m4_pattern_allow([^_POSIX_SOURCE$]) m4trace:configure.ac:49: -1- m4_pattern_allow([^_POSIX_1_SOURCE$]) m4trace:configure.ac:49: -1- m4_pattern_allow([^__EXTENSIONS__$]) m4trace:configure.ac:49: -1- m4_pattern_allow([^_XOPEN_SOURCE$]) m4trace:configure.ac:50: -1- m4_pattern_allow([^CC$]) m4trace:configure.ac:50: -1- m4_pattern_allow([^CFLAGS$]) m4trace:configure.ac:50: -1- m4_pattern_allow([^LDFLAGS$]) m4trace:configure.ac:50: -1- m4_pattern_allow([^LIBS$]) m4trace:configure.ac:50: -1- m4_pattern_allow([^CPPFLAGS$]) m4trace:configure.ac:50: -1- m4_pattern_allow([^CC$]) m4trace:configure.ac:50: -1- m4_pattern_allow([^CC$]) m4trace:configure.ac:50: -1- m4_pattern_allow([^CC$]) m4trace:configure.ac:50: -1- m4_pattern_allow([^CC$]) m4trace:configure.ac:50: -1- m4_pattern_allow([^ac_ct_CC$]) m4trace:configure.ac:50: -1- m4_pattern_allow([^CC$]) m4trace:configure.ac:51: -1- m4_pattern_allow([^AWK$]) m4trace:configure.ac:52: -1- m4_pattern_allow([^INSTALL_PROGRAM$]) m4trace:configure.ac:52: -1- m4_pattern_allow([^INSTALL_SCRIPT$]) m4trace:configure.ac:52: -1- m4_pattern_allow([^INSTALL_DATA$]) m4trace:configure.ac:60: -1- m4_pattern_allow([^HAVE_EXECVPE$]) m4trace:configure.ac:63: -1- m4_pattern_allow([^HAVE_SETEUID$]) m4trace:configure.ac:63: -1- m4_pattern_allow([^HAVE_SETEGID$]) m4trace:configure.ac:63: -1- m4_pattern_allow([^HAVE_SETREUID$]) m4trace:configure.ac:63: -1- m4_pattern_allow([^HAVE_SETRESUID$]) m4trace:configure.ac:76: -1- m4_pattern_allow([^HAVE_PTY_H$]) m4trace:configure.ac:76: -1- m4_pattern_allow([^HAVE_UTIL_H$]) m4trace:configure.ac:76: -1- m4_pattern_allow([^HAVE_LIBUTIL_H$]) m4trace:configure.ac:77: -1- m4_pattern_allow([^HAVE_OPENPTY$]) m4trace:configure.ac:89: -1- m4_pattern_allow([^HAVE_LANGINFO_H$]) m4trace:configure.ac:92: -1- m4_pattern_allow([^HAVE_DIRENT_H$]) m4trace:configure.ac:134: -1- m4_pattern_allow([^ENABLE_PAM$]) m4trace:configure.ac:148: -1- m4_pattern_allow([^HAVE_UTMPX_H$]) m4trace:configure.ac:148: -1- m4_pattern_allow([^HAVE_UTEMPTER$]) m4trace:configure.ac:148: -1- m4_pattern_allow([^HAVE_UT_HOST$]) m4trace:configure.ac:148: -1- m4_pattern_allow([^HAVE_UT_EXIT$]) m4trace:configure.ac:148: -1- m4_pattern_allow([^ENABLE_UTMP$]) m4trace:configure.ac:178: -1- m4_pattern_allow([^ENABLE_TELNET$]) m4trace:configure.ac:184: -1- m4_pattern_allow([^SOCKET_DIR$]) m4trace:configure.ac:192: -1- m4_pattern_allow([^SYSTEM_SCREENRC$]) m4trace:configure.ac:195: -1- m4_pattern_allow([^PTY_MODE$]) m4trace:configure.ac:198: -1- m4_pattern_allow([^PTY_GROUP$]) m4trace:configure.ac:201: -1- m4_pattern_allow([^PTY_ROFS$]) m4trace:configure.ac:210: -1- m4_pattern_allow([^LIB@&t@OBJS$]) m4trace:configure.ac:210: -1- m4_pattern_allow([^LTLIBOBJS$]) screen-5.0.2/autom4te.cache/output.00000664000175000017500000054302615224432733015707 0ustar alexalex@%:@! /bin/sh @%:@ Guess values for system-dependent variables and create Makefiles. @%:@ Generated by GNU Autoconf 2.72 for GNU Screen 5.0.2. @%:@ @%:@ Report bugs to . @%:@ @%:@ @%:@ Copyright (C) 1992-1996, 1998-2017, 2020-2023 Free Software Foundation, @%:@ Inc. @%:@ @%:@ @%:@ This configure script is free software; the Free Software Foundation @%:@ gives unlimited permission to copy, distribute and modify it. ## -------------------- ## ## M4sh Initialization. ## ## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test ${ZSH_VERSION+y} && (emulate sh) >/dev/null 2>&1 then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case e in @%:@( e) case `(set -o) 2>/dev/null` in @%:@( *posix*) : set -o posix ;; @%:@( *) : ;; esac ;; esac fi # Reset variables that may have inherited troublesome values from # the environment. # IFS needs to be set, to space, tab, and newline, in precisely that order. # (If _AS_PATH_WALK were called with IFS unset, it would have the # side effect of setting IFS to empty, thus disabling word splitting.) # Quoting is to prevent editors from complaining about space-tab. as_nl=' ' export as_nl IFS=" "" $as_nl" PS1='$ ' PS2='> ' PS4='+ ' # Ensure predictable behavior from utilities with locale-dependent output. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # We cannot yet rely on "unset" to work, but we need these variables # to be unset--not just set to an empty or harmless value--now, to # avoid bugs in old shells (e.g. pre-3.0 UWIN ksh). This construct # also avoids known problems related to "unset" and subshell syntax # in other old shells (e.g. bash 2.01 and pdksh 5.2.14). for as_var in BASH_ENV ENV MAIL MAILPATH CDPATH do eval test \${$as_var+y} \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done # Ensure that fds 0, 1, and 2 are open. if (exec 3>&0) 2>/dev/null; then :; else exec 0&1) 2>/dev/null; then :; else exec 1>/dev/null; fi if (exec 3>&2) ; then :; else exec 2>/dev/null; fi # The user is always right. if ${PATH_SEPARATOR+false} :; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # Find who we are. Look in the path if we contain no directory separator. as_myself= case $0 in @%:@(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in @%:@((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac test -r "$as_dir$0" && as_myself=$as_dir$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as 'sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then printf "%s\n" "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # Use a proper internal environment variable to ensure we don't fall # into an infinite loop, continuously re-executing ourselves. if test x"${_as_can_reexec}" != xno && test "x$CONFIG_SHELL" != x; then _as_can_reexec=no; export _as_can_reexec; # We cannot yet assume a decent shell, so we have to provide a # neutralization value for shells without unset; and this also # works around shells that cannot unset nonexistent variables. # Preserve -v and -x to the replacement shell. BASH_ENV=/dev/null ENV=/dev/null (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV case $- in @%:@ (((( *v*x* | *x*v* ) as_opts=-vx ;; *v* ) as_opts=-v ;; *x* ) as_opts=-x ;; * ) as_opts= ;; esac exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} # Admittedly, this is quite paranoid, since all the known shells bail # out after a failed 'exec'. printf "%s\n" "$0: could not re-execute with $CONFIG_SHELL" >&2 exit 255 fi # We don't want this to propagate to other subprocesses. { _as_can_reexec=; unset _as_can_reexec;} if test "x$CONFIG_SHELL" = x; then as_bourne_compatible="if test \${ZSH_VERSION+y} && (emulate sh) >/dev/null 2>&1 then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which # is contrary to our usage. Disable this feature. alias -g '\${1+\"\$@\"}'='\"\$@\"' setopt NO_GLOB_SUBST else case e in @%:@( e) case \`(set -o) 2>/dev/null\` in @%:@( *posix*) : set -o posix ;; @%:@( *) : ;; esac ;; esac fi " as_required="as_fn_return () { (exit \$1); } as_fn_success () { as_fn_return 0; } as_fn_failure () { as_fn_return 1; } as_fn_ret_success () { return 0; } as_fn_ret_failure () { return 1; } exitcode=0 as_fn_success || { exitcode=1; echo as_fn_success failed.; } as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; } as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; } as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; } if ( set x; as_fn_ret_success y && test x = \"\$1\" ) then : else case e in @%:@( e) exitcode=1; echo positional parameters were not saved. ;; esac fi test x\$exitcode = x0 || exit 1 blah=\$(echo \$(echo blah)) test x\"\$blah\" = xblah || exit 1 test -x / || exit 1" as_suggested=" as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" && test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1" if (eval "$as_required") 2>/dev/null then : as_have_required=yes else case e in @%:@( e) as_have_required=no ;; esac fi if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null then : else case e in @%:@( e) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR as_found=false for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH do IFS=$as_save_IFS case $as_dir in @%:@((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac as_found=: case $as_dir in @%:@( /*) for as_base in sh bash ksh sh5; do # Try only shells that exist, to save several forks. as_shell=$as_dir$as_base if { test -f "$as_shell" || test -f "$as_shell.exe"; } && as_run=a "$as_shell" -c "$as_bourne_compatible""$as_required" 2>/dev/null then : CONFIG_SHELL=$as_shell as_have_required=yes if as_run=a "$as_shell" -c "$as_bourne_compatible""$as_suggested" 2>/dev/null then : break 2 fi fi done;; esac as_found=false done IFS=$as_save_IFS if $as_found then : else case e in @%:@( e) if { test -f "$SHELL" || test -f "$SHELL.exe"; } && as_run=a "$SHELL" -c "$as_bourne_compatible""$as_required" 2>/dev/null then : CONFIG_SHELL=$SHELL as_have_required=yes fi ;; esac fi if test "x$CONFIG_SHELL" != x then : export CONFIG_SHELL # We cannot yet assume a decent shell, so we have to provide a # neutralization value for shells without unset; and this also # works around shells that cannot unset nonexistent variables. # Preserve -v and -x to the replacement shell. BASH_ENV=/dev/null ENV=/dev/null (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV case $- in @%:@ (((( *v*x* | *x*v* ) as_opts=-vx ;; *v* ) as_opts=-v ;; *x* ) as_opts=-x ;; * ) as_opts= ;; esac exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} # Admittedly, this is quite paranoid, since all the known shells bail # out after a failed 'exec'. printf "%s\n" "$0: could not re-execute with $CONFIG_SHELL" >&2 exit 255 fi if test x$as_have_required = xno then : printf "%s\n" "$0: This script requires a shell more modern than all" printf "%s\n" "$0: the shells that I found on your system." if test ${ZSH_VERSION+y} ; then printf "%s\n" "$0: In particular, zsh $ZSH_VERSION has bugs and should" printf "%s\n" "$0: be upgraded to zsh 4.3.4 or later." else printf "%s\n" "$0: Please tell bug-autoconf@gnu.org and $0: https://savannah.gnu.org/bugs/?group=screen about your $0: system, including any error possibly output before this $0: message. Then install a modern shell, or manually run $0: the script under such a shell if you do have one." fi exit 1 fi ;; esac fi fi SHELL=${CONFIG_SHELL-/bin/sh} export SHELL # Unset more variables known to interfere with behavior of common tools. CLICOLOR_FORCE= GREP_OPTIONS= unset CLICOLOR_FORCE GREP_OPTIONS ## --------------------- ## ## M4sh Shell Functions. ## ## --------------------- ## @%:@ as_fn_unset VAR @%:@ --------------- @%:@ Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset @%:@ as_fn_set_status STATUS @%:@ ----------------------- @%:@ Set @S|@? to STATUS, without forking. as_fn_set_status () { return $1 } @%:@ as_fn_set_status @%:@ as_fn_exit STATUS @%:@ ----------------- @%:@ Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } @%:@ as_fn_exit @%:@ as_fn_mkdir_p @%:@ ------------- @%:@ Create "@S|@as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`printf "%s\n" "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || printf "%s\n" X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" } @%:@ as_fn_mkdir_p @%:@ as_fn_executable_p FILE @%:@ ----------------------- @%:@ Test if FILE is an executable regular file. as_fn_executable_p () { test -f "$1" && test -x "$1" } @%:@ as_fn_executable_p @%:@ as_fn_append VAR VALUE @%:@ ---------------------- @%:@ Append the text in VALUE to the end of the definition contained in VAR. Take @%:@ advantage of any shell optimizations that allow amortized linear growth over @%:@ repeated appends, instead of the typical quadratic growth present in naive @%:@ implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null then : eval 'as_fn_append () { eval $1+=\$2 }' else case e in @%:@( e) as_fn_append () { eval $1=\$$1\$2 } ;; esac fi # as_fn_append @%:@ as_fn_arith ARG... @%:@ ------------------ @%:@ Perform arithmetic evaluation on the ARGs, and store the result in the @%:@ global @S|@as_val. Take advantage of shells that can avoid forks. The arguments @%:@ must be portable across @S|@(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null then : eval 'as_fn_arith () { as_val=$(( $* )) }' else case e in @%:@( e) as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } ;; esac fi # as_fn_arith @%:@ as_fn_error STATUS ERROR [LINENO LOG_FD] @%:@ ---------------------------------------- @%:@ Output "`basename @S|@0`: error: ERROR" to stderr. If LINENO and LOG_FD are @%:@ provided, also output the error to LOG_FD, referencing LINENO. Then exit the @%:@ script with STATUS, using 1 if that was 0. as_fn_error () { as_status=$1; test $as_status -eq 0 && as_status=1 if test "$4"; then as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi printf "%s\n" "$as_me: error: $2" >&2 as_fn_exit $as_status } @%:@ as_fn_error if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || printf "%s\n" X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits as_lineno_1=$LINENO as_lineno_1a=$LINENO as_lineno_2=$LINENO as_lineno_2a=$LINENO eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" && test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || { # Blame Lee E. McMahon (1931-1989) for sed's syntax. :-) sed -n ' p /[$]LINENO/= ' <$as_myself | sed ' t clear :clear s/[$]LINENO.*/&-/ t lineno b :lineno N :loop s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/ t loop s/-\n.*// ' >$as_me.lineno && chmod +x "$as_me.lineno" || { printf "%s\n" "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; } # If we had to re-execute with $CONFIG_SHELL, we're ensured to have # already done that, so ensure we don't try to do so again and fall # in an infinite loop. This has already happened in practice. _as_can_reexec=no; export _as_can_reexec # Don't try to exec as it changes $[0], causing all sort of problems # (the dirname of $[0] is not the place where we might find the # original and so on. Autoconf is especially sensitive to this). . "./$as_me.lineno" # Exit status is that of the last command. exit } # Determine whether it's possible to make 'echo' print without a newline. # These variables are no longer used directly by Autoconf, but are AC_SUBSTed # for compatibility with existing Makefiles. ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in @%:@((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac # For backward compatibility with old third-party macros, we provide # the shell variables $as_echo and $as_echo_n. New code should use # AS_ECHO(["message"]) and AS_ECHO_N(["message"]), respectively. as_@&t@echo='printf %s\n' as_@&t@echo_n='printf %s' rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both 'ln -s file dir' and 'ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; 'ln -s' creates a wrapper executable. # In both cases, we have to default to 'cp -pR'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -pR' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -pR' fi else as_ln_s='cp -pR' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null if mkdir -p . 2>/dev/null; then as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi as_test_x='test -x' as_executable_p=as_fn_executable_p # Sed expression to map a string onto a valid CPP name. as_sed_cpp="y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g" as_tr_cpp="eval sed '$as_sed_cpp'" # deprecated # Sed expression to map a string onto a valid variable name. as_sed_sh="y%*+%pp%;s%[^_$as_cr_alnum]%_%g" as_tr_sh="eval sed '$as_sed_sh'" # deprecated test -n "$DJDIR" || exec 7<&0 &1 # Name of the host. # hostname on some systems (SVR3.2, old GNU/Linux) returns a bogus exit status, # so uname gets run too. ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` # # Initializations. # ac_default_prefix=/usr/local ac_clean_files= ac_config_libobj_dir=. LIB@&t@OBJS= cross_compiling=no subdirs= MFLAGS= MAKEFLAGS= # Identity of this package. PACKAGE_NAME='GNU Screen' PACKAGE_TARNAME='screen' PACKAGE_VERSION='5.0.2' PACKAGE_STRING='GNU Screen 5.0.2' PACKAGE_BUGREPORT='https://savannah.gnu.org/bugs/?group=screen' PACKAGE_URL='https://www.gnu.org/software/screen/' # Factoring default headers for most tests. ac_includes_default="\ #include #ifdef HAVE_STDIO_H # include #endif #ifdef HAVE_STDLIB_H # include #endif #ifdef HAVE_STRING_H # include #endif #ifdef HAVE_INTTYPES_H # include #endif #ifdef HAVE_STDINT_H # include #endif #ifdef HAVE_STRINGS_H # include #endif #ifdef HAVE_SYS_TYPES_H # include #endif #ifdef HAVE_SYS_STAT_H # include #endif #ifdef HAVE_UNISTD_H # include #endif" ac_header_c_list= ac_subst_vars='LTLIBOBJS LIB@&t@OBJS INSTALL_DATA INSTALL_SCRIPT INSTALL_PROGRAM AWK OBJEXT EXEEXT ac_ct_CC CPPFLAGS LDFLAGS CFLAGS CC target_alias host_alias build_alias LIBS ECHO_T ECHO_N ECHO_C DEFS mandir localedir libdir psdir pdfdir dvidir htmldir infodir docdir oldincludedir includedir runstatedir localstatedir sharedstatedir sysconfdir datadir datarootdir libexecdir sbindir bindir program_transform_name prefix exec_prefix PACKAGE_URL PACKAGE_BUGREPORT PACKAGE_STRING PACKAGE_VERSION PACKAGE_TARNAME PACKAGE_NAME PATH_SEPARATOR SHELL' ac_subst_files='' ac_user_opts=' enable_option_checking enable_pam enable_utmp enable_telnet enable_socket_dir with_system_screenrc with_pty_mode with_pty_group with_pty_rofs ' ac_precious_vars='build_alias host_alias target_alias CC CFLAGS LDFLAGS LIBS CPPFLAGS' # Initialize some variables set by options. ac_init_help= ac_init_version=false ac_unrecognized_opts= ac_unrecognized_sep= # The variables have the same names as the options, with # dashes changed to underlines. cache_file=/dev/null exec_prefix=NONE no_create= no_recursion= prefix=NONE program_prefix=NONE program_suffix=NONE program_transform_name=s,x,x, silent= site= srcdir= verbose= x_includes=NONE x_libraries=NONE # Installation directory options. # These are left unexpanded so users can "make install exec_prefix=/foo" # and all the variables that are supposed to be based on exec_prefix # by default will actually change. # Use braces instead of parens because sh, perl, etc. also accept them. # (The list follows the same order as the GNU Coding Standards.) bindir='${exec_prefix}/bin' sbindir='${exec_prefix}/sbin' libexecdir='${exec_prefix}/libexec' datarootdir='${prefix}/share' datadir='${datarootdir}' sysconfdir='${prefix}/etc' sharedstatedir='${prefix}/com' localstatedir='${prefix}/var' runstatedir='${localstatedir}/run' includedir='${prefix}/include' oldincludedir='/usr/include' docdir='${datarootdir}/doc/${PACKAGE_TARNAME}' infodir='${datarootdir}/info' htmldir='${docdir}' dvidir='${docdir}' pdfdir='${docdir}' psdir='${docdir}' libdir='${exec_prefix}/lib' localedir='${datarootdir}/locale' mandir='${datarootdir}/man' ac_prev= ac_dashdash= for ac_option do # If the previous option needs an argument, assign it. if test -n "$ac_prev"; then eval $ac_prev=\$ac_option ac_prev= continue fi case $ac_option in *=?*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;; *=) ac_optarg= ;; *) ac_optarg=yes ;; esac case $ac_dashdash$ac_option in --) ac_dashdash=yes ;; -bindir | --bindir | --bindi | --bind | --bin | --bi) ac_prev=bindir ;; -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) bindir=$ac_optarg ;; -build | --build | --buil | --bui | --bu) ac_prev=build_alias ;; -build=* | --build=* | --buil=* | --bui=* | --bu=*) build_alias=$ac_optarg ;; -cache-file | --cache-file | --cache-fil | --cache-fi \ | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) ac_prev=cache_file ;; -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) cache_file=$ac_optarg ;; --config-cache | -C) cache_file=config.cache ;; -datadir | --datadir | --datadi | --datad) ac_prev=datadir ;; -datadir=* | --datadir=* | --datadi=* | --datad=*) datadir=$ac_optarg ;; -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \ | --dataroo | --dataro | --datar) ac_prev=datarootdir ;; -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \ | --dataroot=* | --dataroo=* | --dataro=* | --datar=*) datarootdir=$ac_optarg ;; -disable-* | --disable-*) ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid feature name: '$ac_useropt'" ac_useropt_orig=$ac_useropt ac_useropt=`printf "%s\n" "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval enable_$ac_useropt=no ;; -docdir | --docdir | --docdi | --doc | --do) ac_prev=docdir ;; -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*) docdir=$ac_optarg ;; -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv) ac_prev=dvidir ;; -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*) dvidir=$ac_optarg ;; -enable-* | --enable-*) ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid feature name: '$ac_useropt'" ac_useropt_orig=$ac_useropt ac_useropt=`printf "%s\n" "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval enable_$ac_useropt=\$ac_optarg ;; -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ | --exec | --exe | --ex) ac_prev=exec_prefix ;; -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ | --exec=* | --exe=* | --ex=*) exec_prefix=$ac_optarg ;; -gas | --gas | --ga | --g) # Obsolete; use --with-gas. with_gas=yes ;; -help | --help | --hel | --he | -h) ac_init_help=long ;; -help=r* | --help=r* | --hel=r* | --he=r* | -hr*) ac_init_help=recursive ;; -help=s* | --help=s* | --hel=s* | --he=s* | -hs*) ac_init_help=short ;; -host | --host | --hos | --ho) ac_prev=host_alias ;; -host=* | --host=* | --hos=* | --ho=*) host_alias=$ac_optarg ;; -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht) ac_prev=htmldir ;; -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \ | --ht=*) htmldir=$ac_optarg ;; -includedir | --includedir | --includedi | --included | --include \ | --includ | --inclu | --incl | --inc) ac_prev=includedir ;; -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ | --includ=* | --inclu=* | --incl=* | --inc=*) includedir=$ac_optarg ;; -infodir | --infodir | --infodi | --infod | --info | --inf) ac_prev=infodir ;; -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) infodir=$ac_optarg ;; -libdir | --libdir | --libdi | --libd) ac_prev=libdir ;; -libdir=* | --libdir=* | --libdi=* | --libd=*) libdir=$ac_optarg ;; -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ | --libexe | --libex | --libe) ac_prev=libexecdir ;; -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ | --libexe=* | --libex=* | --libe=*) libexecdir=$ac_optarg ;; -localedir | --localedir | --localedi | --localed | --locale) ac_prev=localedir ;; -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*) localedir=$ac_optarg ;; -localstatedir | --localstatedir | --localstatedi | --localstated \ | --localstate | --localstat | --localsta | --localst | --locals) ac_prev=localstatedir ;; -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*) localstatedir=$ac_optarg ;; -mandir | --mandir | --mandi | --mand | --man | --ma | --m) ac_prev=mandir ;; -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) mandir=$ac_optarg ;; -nfp | --nfp | --nf) # Obsolete; use --without-fp. with_fp=no ;; -no-create | --no-create | --no-creat | --no-crea | --no-cre \ | --no-cr | --no-c | -n) no_create=yes ;; -no-recursion | --no-recursion | --no-recursio | --no-recursi \ | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) no_recursion=yes ;; -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ | --oldin | --oldi | --old | --ol | --o) ac_prev=oldincludedir ;; -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) oldincludedir=$ac_optarg ;; -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) ac_prev=prefix ;; -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) prefix=$ac_optarg ;; -program-prefix | --program-prefix | --program-prefi | --program-pref \ | --program-pre | --program-pr | --program-p) ac_prev=program_prefix ;; -program-prefix=* | --program-prefix=* | --program-prefi=* \ | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) program_prefix=$ac_optarg ;; -program-suffix | --program-suffix | --program-suffi | --program-suff \ | --program-suf | --program-su | --program-s) ac_prev=program_suffix ;; -program-suffix=* | --program-suffix=* | --program-suffi=* \ | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) program_suffix=$ac_optarg ;; -program-transform-name | --program-transform-name \ | --program-transform-nam | --program-transform-na \ | --program-transform-n | --program-transform- \ | --program-transform | --program-transfor \ | --program-transfo | --program-transf \ | --program-trans | --program-tran \ | --progr-tra | --program-tr | --program-t) ac_prev=program_transform_name ;; -program-transform-name=* | --program-transform-name=* \ | --program-transform-nam=* | --program-transform-na=* \ | --program-transform-n=* | --program-transform-=* \ | --program-transform=* | --program-transfor=* \ | --program-transfo=* | --program-transf=* \ | --program-trans=* | --program-tran=* \ | --progr-tra=* | --program-tr=* | --program-t=*) program_transform_name=$ac_optarg ;; -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd) ac_prev=pdfdir ;; -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*) pdfdir=$ac_optarg ;; -psdir | --psdir | --psdi | --psd | --ps) ac_prev=psdir ;; -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*) psdir=$ac_optarg ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) silent=yes ;; -runstatedir | --runstatedir | --runstatedi | --runstated \ | --runstate | --runstat | --runsta | --runst | --runs \ | --run | --ru | --r) ac_prev=runstatedir ;; -runstatedir=* | --runstatedir=* | --runstatedi=* | --runstated=* \ | --runstate=* | --runstat=* | --runsta=* | --runst=* | --runs=* \ | --run=* | --ru=* | --r=*) runstatedir=$ac_optarg ;; -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) ac_prev=sbindir ;; -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ | --sbi=* | --sb=*) sbindir=$ac_optarg ;; -sharedstatedir | --sharedstatedir | --sharedstatedi \ | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ | --sharedst | --shareds | --shared | --share | --shar \ | --sha | --sh) ac_prev=sharedstatedir ;; -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ | --sha=* | --sh=*) sharedstatedir=$ac_optarg ;; -site | --site | --sit) ac_prev=site ;; -site=* | --site=* | --sit=*) site=$ac_optarg ;; -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) ac_prev=srcdir ;; -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) srcdir=$ac_optarg ;; -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ | --syscon | --sysco | --sysc | --sys | --sy) ac_prev=sysconfdir ;; -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) sysconfdir=$ac_optarg ;; -target | --target | --targe | --targ | --tar | --ta | --t) ac_prev=target_alias ;; -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) target_alias=$ac_optarg ;; -v | -verbose | --verbose | --verbos | --verbo | --verb) verbose=yes ;; -version | --version | --versio | --versi | --vers | -V) ac_init_version=: ;; -with-* | --with-*) ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid package name: '$ac_useropt'" ac_useropt_orig=$ac_useropt ac_useropt=`printf "%s\n" "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval with_$ac_useropt=\$ac_optarg ;; -without-* | --without-*) ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid package name: '$ac_useropt'" ac_useropt_orig=$ac_useropt ac_useropt=`printf "%s\n" "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval with_$ac_useropt=no ;; --x) # Obsolete; use --with-x. with_x=yes ;; -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ | --x-incl | --x-inc | --x-in | --x-i) ac_prev=x_includes ;; -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) x_includes=$ac_optarg ;; -x-libraries | --x-libraries | --x-librarie | --x-librari \ | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) ac_prev=x_libraries ;; -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) x_libraries=$ac_optarg ;; -*) as_fn_error $? "unrecognized option: '$ac_option' Try '$0 --help' for more information" ;; *=*) ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` # Reject names that are not valid shell variable names. case $ac_envvar in #( '' | [0-9]* | *[!_$as_cr_alnum]* ) as_fn_error $? "invalid variable name: '$ac_envvar'" ;; esac eval $ac_envvar=\$ac_optarg export $ac_envvar ;; *) # FIXME: should be removed in autoconf 3.0. printf "%s\n" "$as_me: WARNING: you should use --build, --host, --target" >&2 expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && printf "%s\n" "$as_me: WARNING: invalid host type: $ac_option" >&2 : "${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}" ;; esac done if test -n "$ac_prev"; then ac_option=--`echo $ac_prev | sed 's/_/-/g'` as_fn_error $? "missing argument to $ac_option" fi if test -n "$ac_unrecognized_opts"; then case $enable_option_checking in no) ;; fatal) as_fn_error $? "unrecognized options: $ac_unrecognized_opts" ;; *) printf "%s\n" "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;; esac fi # Check all directory arguments for consistency. for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \ datadir sysconfdir sharedstatedir localstatedir includedir \ oldincludedir docdir infodir htmldir dvidir pdfdir psdir \ libdir localedir mandir runstatedir do eval ac_val=\$$ac_var # Remove trailing slashes. case $ac_val in */ ) ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'` eval $ac_var=\$ac_val;; esac # Be sure to have absolute directory names. case $ac_val in [\\/$]* | ?:[\\/]* ) continue;; NONE | '' ) case $ac_var in *prefix ) continue;; esac;; esac as_fn_error $? "expected an absolute directory name for --$ac_var: $ac_val" done # There might be people who depend on the old broken behavior: '$host' # used to hold the argument of --host etc. # FIXME: To remove some day. build=$build_alias host=$host_alias target=$target_alias # FIXME: To remove some day. if test "x$host_alias" != x; then if test "x$build_alias" = x; then cross_compiling=maybe elif test "x$build_alias" != "x$host_alias"; then cross_compiling=yes fi fi ac_tool_prefix= test -n "$host_alias" && ac_tool_prefix=$host_alias- test "$silent" = yes && exec 6>/dev/null ac_pwd=`pwd` && test -n "$ac_pwd" && ac_ls_di=`ls -di .` && ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` || as_fn_error $? "working directory cannot be determined" test "X$ac_ls_di" = "X$ac_pwd_ls_di" || as_fn_error $? "pwd does not report name of working directory" # Find the source files, if location was not specified. if test -z "$srcdir"; then ac_srcdir_defaulted=yes # Try the directory containing this script, then the parent directory. ac_confdir=`$as_dirname -- "$as_myself" || $as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_myself" : 'X\(//\)[^/]' \| \ X"$as_myself" : 'X\(//\)$' \| \ X"$as_myself" : 'X\(/\)' \| . 2>/dev/null || printf "%s\n" X"$as_myself" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` srcdir=$ac_confdir if test ! -r "$srcdir/$ac_unique_file"; then srcdir=.. fi else ac_srcdir_defaulted=no fi if test ! -r "$srcdir/$ac_unique_file"; then test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .." as_fn_error $? "cannot find sources ($ac_unique_file) in $srcdir" fi ac_msg="sources are in $srcdir, but 'cd $srcdir' does not work" ac_abs_confdir=`( cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error $? "$ac_msg" pwd)` # When building in place, set srcdir=. if test "$ac_abs_confdir" = "$ac_pwd"; then srcdir=. fi # Remove unnecessary trailing slashes from srcdir. # Double slashes in file names in object file debugging info # mess up M-x gdb in Emacs. case $srcdir in */) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;; esac for ac_var in $ac_precious_vars; do eval ac_env_${ac_var}_set=\${${ac_var}+set} eval ac_env_${ac_var}_value=\$${ac_var} eval ac_cv_env_${ac_var}_set=\${${ac_var}+set} eval ac_cv_env_${ac_var}_value=\$${ac_var} done # # Report the --help message. # 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 GNU Screen 5.0.2 to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... To assign environment variables (e.g., CC, CFLAGS...), specify them as VAR=VALUE. See below for descriptions of some of the useful variables. Defaults for the options are specified in brackets. Configuration: -h, --help display this help and exit --help=short display options specific to this package --help=recursive display the short help of all the included packages -V, --version display version information and exit -q, --quiet, --silent do not print 'checking ...' messages --cache-file=FILE cache test results in FILE [disabled] -C, --config-cache alias for '--cache-file=config.cache' -n, --no-create do not create output files --srcdir=DIR find the sources in DIR [configure dir or '..'] Installation directories: --prefix=PREFIX install architecture-independent files in PREFIX @<:@@S|@ac_default_prefix@:>@ --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX @<:@PREFIX@:>@ By default, 'make install' will install all the files in '$ac_default_prefix/bin', '$ac_default_prefix/lib' etc. You can specify an installation prefix other than '$ac_default_prefix' using '--prefix', for instance '--prefix=\$HOME'. For better control, use the options below. Fine tuning of the installation directories: --bindir=DIR user executables [EPREFIX/bin] --sbindir=DIR system admin executables [EPREFIX/sbin] --libexecdir=DIR program executables [EPREFIX/libexec] --sysconfdir=DIR read-only single-machine data [PREFIX/etc] --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] --localstatedir=DIR modifiable single-machine data [PREFIX/var] --runstatedir=DIR modifiable per-process data [LOCALSTATEDIR/run] --libdir=DIR object code libraries [EPREFIX/lib] --includedir=DIR C header files [PREFIX/include] --oldincludedir=DIR C header files for non-gcc [/usr/include] --datarootdir=DIR read-only arch.-independent data root [PREFIX/share] --datadir=DIR read-only architecture-independent data [DATAROOTDIR] --infodir=DIR info documentation [DATAROOTDIR/info] --localedir=DIR locale-dependent data [DATAROOTDIR/locale] --mandir=DIR man documentation [DATAROOTDIR/man] --docdir=DIR documentation root @<:@DATAROOTDIR/doc/screen@:>@ --htmldir=DIR html documentation [DOCDIR] --dvidir=DIR dvi documentation [DOCDIR] --pdfdir=DIR pdf documentation [DOCDIR] --psdir=DIR ps documentation [DOCDIR] _ACEOF cat <<\_ACEOF _ACEOF fi if test -n "$ac_init_help"; then case $ac_init_help in short | recursive ) echo "Configuration of GNU Screen 5.0.2:";; esac cat <<\_ACEOF Optional Features: --disable-option-checking ignore unrecognized --enable/--with options --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) --enable-FEATURE[=ARG] include FEATURE [ARG=yes] --enable-pam enable PAM support (default: enabled) --enable-utmp enable utmp support (default: disabled) --enable-telnet enable telnet support (default: disabled) --enable-socket-dir enable global socket directory (default: disabled) Optional Packages: --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) --with-system_screenrc set location of system screenrc (default: /etc/screenrc) --with-pty-mode set pty mode (default: 0620) --with-pty-group set pty group (default: 5) --with-pty-rofs set rofs handling (default: no) Some influential environment variables: CC C compiler command CFLAGS C compiler flags LDFLAGS linker flags, e.g. -L if you have libraries in a nonstandard directory LIBS libraries to pass to the linker, e.g. -l CPPFLAGS (Objective) C/C++ preprocessor flags, e.g. -I if you have headers in a nonstandard directory Use these variables to override the choices made by 'configure' or to help it to find libraries and programs with nonstandard names/locations. Report bugs to . GNU Screen home page: . General help using GNU software: . _ACEOF ac_status=$? fi if test "$ac_init_help" = "recursive"; then # If there are subdirs, report their specific --help. for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue test -d "$ac_dir" || { cd "$srcdir" && ac_pwd=`pwd` && srcdir=. && test -d "$ac_dir"; } || continue ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`printf "%s\n" "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`printf "%s\n" "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix cd "$ac_dir" || { ac_status=$?; continue; } # Check for configure.gnu first; this name is used for a wrapper for # Metaconfig's "Configure" on case-insensitive file systems. if test -f "$ac_srcdir/configure.gnu"; then echo && $SHELL "$ac_srcdir/configure.gnu" --help=recursive elif test -f "$ac_srcdir/configure"; then echo && $SHELL "$ac_srcdir/configure" --help=recursive else printf "%s\n" "$as_me: WARNING: no configuration information is in $ac_dir" >&2 fi || ac_status=$? cd "$ac_pwd" || { ac_status=$?; break; } done fi test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF GNU Screen configure 5.0.2 generated by GNU Autoconf 2.72 Copyright (C) 2023 Free Software Foundation, Inc. This configure script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it. _ACEOF exit fi ## ------------------------ ## ## Autoconf initialization. ## ## ------------------------ ## @%:@ ac_fn_c_try_compile LINENO @%:@ -------------------------- @%:@ Try to compile conftest.@S|@ac_ext, and return whether this succeeded. ac_fn_c_try_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext conftest.beam if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" printf "%s\n" "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext then : ac_retval=0 else case e in @%:@( e) printf "%s\n" "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 ;; esac fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } @%:@ ac_fn_c_try_compile @%:@ ac_fn_c_check_header_compile LINENO HEADER VAR INCLUDES @%:@ ------------------------------------------------------- @%:@ Tests whether HEADER exists and can be compiled using the include files in @%:@ INCLUDES, setting the cache variable VAR accordingly. ac_fn_c_check_header_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 printf %s "checking for $2... " >&6; } if eval test \${$3+y} then : printf %s "(cached) " >&6 else case e in @%:@( e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 @%:@include <$2> _ACEOF if ac_fn_c_try_compile "$LINENO" then : eval "$3=yes" else case e in @%:@( e) eval "$3=no" ;; esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ;; esac fi eval ac_res=\$$3 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 printf "%s\n" "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } @%:@ ac_fn_c_check_header_compile @%:@ ac_fn_c_try_link LINENO @%:@ ----------------------- @%:@ Try to link conftest.@S|@ac_ext, and return whether this succeeded. ac_fn_c_try_link () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext conftest.beam conftest$ac_exeext if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" printf "%s\n" "$ac_try_echo"; } >&5 (eval "$ac_link") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && { test "$cross_compiling" = yes || test -x conftest$ac_exeext } then : ac_retval=0 else case e in @%:@( e) printf "%s\n" "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 ;; esac fi # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would # interfere with the next link command; also delete a directory that is # left behind by Apple's compiler. We do this before executing the actions. rm -rf conftest.dSYM conftest_ipa8_conftest.oo eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } @%:@ ac_fn_c_try_link @%:@ ac_fn_c_check_func LINENO FUNC VAR @%:@ ---------------------------------- @%:@ Tests whether FUNC exists, setting the cache variable VAR accordingly ac_fn_c_check_func () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 printf %s "checking for $2... " >&6; } if eval test \${$3+y} then : printf %s "(cached) " >&6 else case e in @%:@( e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Define $2 to an innocuous variant, in case declares $2. For example, HP-UX 11i declares gettimeofday. */ #define $2 innocuous_$2 /* System header to define __stub macros and hopefully few prototypes, which can conflict with char $2 (void); below. */ #include #undef $2 /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char $2 (void); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ #if defined __stub_$2 || defined __stub___$2 choke me #endif int main (void) { return $2 (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO" then : eval "$3=yes" else case e in @%:@( e) eval "$3=no" ;; esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext ;; esac fi eval ac_res=\$$3 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 printf "%s\n" "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } @%:@ ac_fn_c_check_func ac_configure_args_raw= for ac_arg do case $ac_arg in *\'*) ac_arg=`printf "%s\n" "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; esac as_fn_append ac_configure_args_raw " '$ac_arg'" done case $ac_configure_args_raw in *$as_nl*) ac_safe_unquote= ;; *) ac_unsafe_z='|&;<>()$`\\"*?@<:@ '' ' # This string ends in space, tab. ac_unsafe_a="$ac_unsafe_z#~" ac_safe_unquote="s/ '\\([^$ac_unsafe_a][^$ac_unsafe_z]*\\)'/ \\1/g" ac_configure_args_raw=` printf "%s\n" "$ac_configure_args_raw" | sed "$ac_safe_unquote"`;; esac 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 GNU Screen $as_me 5.0.2, which was generated by GNU Autoconf 2.72. Invocation command line was $ $0$ac_configure_args_raw _ACEOF exec 5>>config.log { cat <<_ASUNAME ## --------- ## ## Platform. ## ## --------- ## hostname = `(hostname || uname -n) 2>/dev/null | sed 1q` uname -m = `(uname -m) 2>/dev/null || echo unknown` uname -r = `(uname -r) 2>/dev/null || echo unknown` uname -s = `(uname -s) 2>/dev/null || echo unknown` uname -v = `(uname -v) 2>/dev/null || echo unknown` /usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown` /bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown` /bin/arch = `(/bin/arch) 2>/dev/null || echo unknown` /usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown` /usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown` /usr/bin/hostinfo = `(/usr/bin/hostinfo) 2>/dev/null || echo unknown` /bin/machine = `(/bin/machine) 2>/dev/null || echo unknown` /usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown` /bin/universe = `(/bin/universe) 2>/dev/null || echo unknown` _ASUNAME as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in @%:@((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac printf "%s\n" "PATH: $as_dir" done IFS=$as_save_IFS } >&5 cat >&5 <<_ACEOF ## ----------- ## ## Core tests. ## ## ----------- ## _ACEOF # Keep a trace of the command line. # Strip out --no-create and --no-recursion so they do not pile up. # Strip out --silent because we don't want to record it for future runs. # Also quote any args containing shell meta-characters. # Make two passes to allow for proper duplicate-argument suppression. ac_configure_args= ac_configure_args0= ac_configure_args1= ac_must_keep_next=false for ac_pass in 1 2 do for ac_arg do case $ac_arg in -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) continue ;; *\'*) ac_arg=`printf "%s\n" "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; esac case $ac_pass in 1) as_fn_append ac_configure_args0 " '$ac_arg'" ;; 2) as_fn_append ac_configure_args1 " '$ac_arg'" if test $ac_must_keep_next = true; then ac_must_keep_next=false # Got value, back to normal. else case $ac_arg in *=* | --config-cache | -C | -disable-* | --disable-* \ | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \ | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \ | -with-* | --with-* | -without-* | --without-* | --x) case "$ac_configure_args0 " in "$ac_configure_args1"*" '$ac_arg' "* ) continue ;; esac ;; -* ) ac_must_keep_next=true ;; esac fi as_fn_append ac_configure_args " '$ac_arg'" ;; esac done done { ac_configure_args0=; unset ac_configure_args0;} { ac_configure_args1=; unset ac_configure_args1;} # When interrupted or exit'd, cleanup temporary files, and complete # config.log. We remove comments because anyway the quotes in there # would cause problems or look ugly. # WARNING: Use '\'' to represent an apostrophe within the trap. # WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug. trap 'exit_status=$? # Sanitize IFS. IFS=" "" $as_nl" # Save into config.log some information that might help in debugging. { echo printf "%s\n" "## ---------------- ## ## Cache variables. ## ## ---------------- ##" echo # The following way of writing the cache mishandles newlines in values, ( for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 printf "%s\n" "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #( *${as_nl}ac_space=\ *) sed -n \ "s/'\''/'\''\\\\'\'''\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p" ;; #( *) sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) echo printf "%s\n" "## ----------------- ## ## Output variables. ## ## ----------------- ##" echo for ac_var in $ac_subst_vars do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`printf "%s\n" "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac printf "%s\n" "$ac_var='\''$ac_val'\''" done | sort echo if test -n "$ac_subst_files"; then printf "%s\n" "## ------------------- ## ## File substitutions. ## ## ------------------- ##" echo for ac_var in $ac_subst_files do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`printf "%s\n" "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac printf "%s\n" "$ac_var='\''$ac_val'\''" done | sort echo fi if test -s confdefs.h; then printf "%s\n" "## ----------- ## ## confdefs.h. ## ## ----------- ##" echo cat confdefs.h echo fi test "$ac_signal" != 0 && printf "%s\n" "$as_me: caught signal $ac_signal" printf "%s\n" "$as_me: exit $exit_status" } >&5 rm -f core *.core core.conftest.* && rm -f -r conftest* confdefs* conf$$* $ac_clean_files && exit $exit_status ' 0 for ac_signal in 1 2 13 15; do trap 'ac_signal='$ac_signal'; as_fn_exit 1' $ac_signal done ac_signal=0 # confdefs.h avoids OS command line length limits that DEFS can exceed. rm -f -r conftest* confdefs.h printf "%s\n" "/* confdefs.h */" > confdefs.h # Predefined preprocessor variables. printf "%s\n" "@%:@define PACKAGE_NAME \"$PACKAGE_NAME\"" >>confdefs.h printf "%s\n" "@%:@define PACKAGE_TARNAME \"$PACKAGE_TARNAME\"" >>confdefs.h printf "%s\n" "@%:@define PACKAGE_VERSION \"$PACKAGE_VERSION\"" >>confdefs.h printf "%s\n" "@%:@define PACKAGE_STRING \"$PACKAGE_STRING\"" >>confdefs.h printf "%s\n" "@%:@define PACKAGE_BUGREPORT \"$PACKAGE_BUGREPORT\"" >>confdefs.h printf "%s\n" "@%:@define PACKAGE_URL \"$PACKAGE_URL\"" >>confdefs.h # Let the site file select an alternate cache file if it wants to. # Prefer an explicitly selected file to automatically selected ones. if test -n "$CONFIG_SITE"; then ac_site_files="$CONFIG_SITE" elif test "x$prefix" != xNONE; then ac_site_files="$prefix/share/config.site $prefix/etc/config.site" else ac_site_files="$ac_default_prefix/share/config.site $ac_default_prefix/etc/config.site" fi for ac_site_file in $ac_site_files do case $ac_site_file in @%:@( */*) : ;; @%:@( *) : ac_site_file=./$ac_site_file ;; esac if test -f "$ac_site_file" && test -r "$ac_site_file"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5 printf "%s\n" "$as_me: loading site script $ac_site_file" >&6;} sed 's/^/| /' "$ac_site_file" >&5 . "$ac_site_file" \ || { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in '$ac_pwd':" >&5 printf "%s\n" "$as_me: error: in '$ac_pwd':" >&2;} as_fn_error $? "failed to load site script $ac_site_file See 'config.log' for more details" "$LINENO" 5; } fi done if test -r "$cache_file"; then # Some versions of bash will fail to source /dev/null (special files # actually), so we avoid doing that. DJGPP emulates it as a regular file. if test /dev/null != "$cache_file" && test -f "$cache_file"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5 printf "%s\n" "$as_me: loading cache $cache_file" >&6;} case $cache_file in [\\/]* | ?:[\\/]* ) . "$cache_file";; *) . "./$cache_file";; esac fi else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5 printf "%s\n" "$as_me: creating cache $cache_file" >&6;} >$cache_file fi as_fn_append ac_header_c_list " stdio.h stdio_h HAVE_STDIO_H" # Test code for whether the C compiler supports C89 (global declarations) ac_c_conftest_c89_globals=' /* Does the compiler advertise C89 conformance? Do not test the value of __STDC__, because some compilers set it to 0 while being otherwise adequately conformant. */ #if !defined __STDC__ # error "Compiler does not advertise C89 conformance" #endif #include #include struct stat; /* Most of the following tests are stolen from RCS 5.7 src/conf.sh. */ struct buf { int x; }; struct buf * (*rcsopen) (struct buf *, struct stat *, int); static char *e (char **p, int i) { return p[i]; } static char *f (char * (*g) (char **, int), char **p, ...) { char *s; va_list v; va_start (v,p); s = g (p, va_arg (v,int)); va_end (v); return s; } /* C89 style stringification. */ #define noexpand_stringify(a) #a const char *stringified = noexpand_stringify(arbitrary+token=sequence); /* C89 style token pasting. Exercises some of the corner cases that e.g. old MSVC gets wrong, but not very hard. */ #define noexpand_concat(a,b) a##b #define expand_concat(a,b) noexpand_concat(a,b) extern int vA; extern int vbee; #define aye A #define bee B int *pvA = &expand_concat(v,aye); int *pvbee = &noexpand_concat(v,bee); /* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has function prototypes and stuff, but not \xHH hex character constants. These do not provoke an error unfortunately, instead are silently treated as an "x". The following induces an error, until -std is added to get proper ANSI mode. Curiously \x00 != x always comes out true, for an array size at least. It is necessary to write \x00 == 0 to get something that is true only with -std. */ int osf4_cc_array ['\''\x00'\'' == 0 ? 1 : -1]; /* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters inside strings and character constants. */ #define FOO(x) '\''x'\'' int xlc6_cc_array[FOO(a) == '\''x'\'' ? 1 : -1]; int test (int i, double x); struct s1 {int (*f) (int a);}; struct s2 {int (*f) (double a);}; int pairnames (int, char **, int *(*)(struct buf *, struct stat *, int), int, int);' # Test code for whether the C compiler supports C89 (body of main). ac_c_conftest_c89_main=' ok |= (argc == 0 || f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]); ' # Test code for whether the C compiler supports C99 (global declarations) ac_c_conftest_c99_globals=' /* Does the compiler advertise C99 conformance? */ #if !defined __STDC_VERSION__ || __STDC_VERSION__ < 199901L # error "Compiler does not advertise C99 conformance" #endif // See if C++-style comments work. #include extern int puts (const char *); extern int printf (const char *, ...); extern int dprintf (int, const char *, ...); extern void *malloc (size_t); extern void free (void *); // Check varargs macros. These examples are taken from C99 6.10.3.5. // dprintf is used instead of fprintf to avoid needing to declare // FILE and stderr. #define debug(...) dprintf (2, __VA_ARGS__) #define showlist(...) puts (#__VA_ARGS__) #define report(test,...) ((test) ? puts (#test) : printf (__VA_ARGS__)) static void test_varargs_macros (void) { int x = 1234; int y = 5678; debug ("Flag"); debug ("X = %d\n", x); showlist (The first, second, and third items.); report (x>y, "x is %d but y is %d", x, y); } // Check long long types. #define BIG64 18446744073709551615ull #define BIG32 4294967295ul #define BIG_OK (BIG64 / BIG32 == 4294967297ull && BIG64 % BIG32 == 0) #if !BIG_OK #error "your preprocessor is broken" #endif #if BIG_OK #else #error "your preprocessor is broken" #endif static long long int bignum = -9223372036854775807LL; static unsigned long long int ubignum = BIG64; struct incomplete_array { int datasize; double data[]; }; struct named_init { int number; const wchar_t *name; double average; }; typedef const char *ccp; static inline int test_restrict (ccp restrict text) { // Iterate through items via the restricted pointer. // Also check for declarations in for loops. for (unsigned int i = 0; *(text+i) != '\''\0'\''; ++i) continue; return 0; } // Check varargs and va_copy. static bool test_varargs (const char *format, ...) { va_list args; va_start (args, format); va_list args_copy; va_copy (args_copy, args); const char *str = ""; int number = 0; float fnumber = 0; while (*format) { switch (*format++) { case '\''s'\'': // string str = va_arg (args_copy, const char *); break; case '\''d'\'': // int number = va_arg (args_copy, int); break; case '\''f'\'': // float fnumber = va_arg (args_copy, double); break; default: break; } } va_end (args_copy); va_end (args); return *str && number && fnumber; } ' # Test code for whether the C compiler supports C99 (body of main). ac_c_conftest_c99_main=' // Check bool. _Bool success = false; success |= (argc != 0); // Check restrict. if (test_restrict ("String literal") == 0) success = true; char *restrict newvar = "Another string"; // Check varargs. success &= test_varargs ("s, d'\'' f .", "string", 65, 34.234); test_varargs_macros (); // Check flexible array members. struct incomplete_array *ia = malloc (sizeof (struct incomplete_array) + (sizeof (double) * 10)); ia->datasize = 10; for (int i = 0; i < ia->datasize; ++i) ia->data[i] = i * 1.234; // Work around memory leak warnings. free (ia); // Check named initializers. struct named_init ni = { .number = 34, .name = L"Test wide string", .average = 543.34343, }; ni.number = 58; int dynamic_array[ni.number]; dynamic_array[0] = argv[0][0]; dynamic_array[ni.number - 1] = 543; // work around unused variable warnings ok |= (!success || bignum == 0LL || ubignum == 0uLL || newvar[0] == '\''x'\'' || dynamic_array[ni.number - 1] != 543); ' # Test code for whether the C compiler supports C11 (global declarations) ac_c_conftest_c11_globals=' /* Does the compiler advertise C11 conformance? */ #if !defined __STDC_VERSION__ || __STDC_VERSION__ < 201112L # error "Compiler does not advertise C11 conformance" #endif // Check _Alignas. char _Alignas (double) aligned_as_double; char _Alignas (0) no_special_alignment; extern char aligned_as_int; char _Alignas (0) _Alignas (int) aligned_as_int; // Check _Alignof. enum { int_alignment = _Alignof (int), int_array_alignment = _Alignof (int[100]), char_alignment = _Alignof (char) }; _Static_assert (0 < -_Alignof (int), "_Alignof is signed"); // Check _Noreturn. int _Noreturn does_not_return (void) { for (;;) continue; } // Check _Static_assert. struct test_static_assert { int x; _Static_assert (sizeof (int) <= sizeof (long int), "_Static_assert does not work in struct"); long int y; }; // Check UTF-8 literals. #define u8 syntax error! char const utf8_literal[] = u8"happens to be ASCII" "another string"; // Check duplicate typedefs. typedef long *long_ptr; typedef long int *long_ptr; typedef long_ptr long_ptr; // Anonymous structures and unions -- taken from C11 6.7.2.1 Example 1. struct anonymous { union { struct { int i; int j; }; struct { int k; long int l; } w; }; int m; } v1; ' # Test code for whether the C compiler supports C11 (body of main). ac_c_conftest_c11_main=' _Static_assert ((offsetof (struct anonymous, i) == offsetof (struct anonymous, w.k)), "Anonymous union alignment botch"); v1.i = 2; v1.w.k = 5; ok |= v1.i != 5; ' # Test code for whether the C compiler supports C11 (complete). ac_c_conftest_c11_program="${ac_c_conftest_c89_globals} ${ac_c_conftest_c99_globals} ${ac_c_conftest_c11_globals} int main (int argc, char **argv) { int ok = 0; ${ac_c_conftest_c89_main} ${ac_c_conftest_c99_main} ${ac_c_conftest_c11_main} return ok; } " # Test code for whether the C compiler supports C99 (complete). ac_c_conftest_c99_program="${ac_c_conftest_c89_globals} ${ac_c_conftest_c99_globals} int main (int argc, char **argv) { int ok = 0; ${ac_c_conftest_c89_main} ${ac_c_conftest_c99_main} return ok; } " # Test code for whether the C compiler supports C89 (complete). ac_c_conftest_c89_program="${ac_c_conftest_c89_globals} int main (int argc, char **argv) { int ok = 0; ${ac_c_conftest_c89_main} return ok; } " as_fn_append ac_header_c_list " stdlib.h stdlib_h HAVE_STDLIB_H" as_fn_append ac_header_c_list " string.h string_h HAVE_STRING_H" as_fn_append ac_header_c_list " inttypes.h inttypes_h HAVE_INTTYPES_H" as_fn_append ac_header_c_list " stdint.h stdint_h HAVE_STDINT_H" as_fn_append ac_header_c_list " strings.h strings_h HAVE_STRINGS_H" as_fn_append ac_header_c_list " sys/stat.h sys_stat_h HAVE_SYS_STAT_H" as_fn_append ac_header_c_list " sys/types.h sys_types_h HAVE_SYS_TYPES_H" as_fn_append ac_header_c_list " unistd.h unistd_h HAVE_UNISTD_H" as_fn_append ac_header_c_list " wchar.h wchar_h HAVE_WCHAR_H" as_fn_append ac_header_c_list " minix/config.h minix_config_h HAVE_MINIX_CONFIG_H" # Auxiliary files required by this configure script. ac_aux_files="install-sh" # Locations in which to look for auxiliary files. ac_aux_dir_candidates="${srcdir}${PATH_SEPARATOR}${srcdir}/..${PATH_SEPARATOR}${srcdir}/../.." # Search for a directory containing all of the required auxiliary files, # $ac_aux_files, from the $PATH-style list $ac_aux_dir_candidates. # If we don't find one directory that contains all the files we need, # we report the set of missing files from the *first* directory in # $ac_aux_dir_candidates and give up. ac_missing_aux_files="" ac_first_candidate=: printf "%s\n" "$as_me:${as_lineno-$LINENO}: looking for aux files: $ac_aux_files" >&5 as_save_IFS=$IFS; IFS=$PATH_SEPARATOR as_found=false for as_dir in $ac_aux_dir_candidates do IFS=$as_save_IFS case $as_dir in @%:@((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac as_found=: printf "%s\n" "$as_me:${as_lineno-$LINENO}: trying $as_dir" >&5 ac_aux_dir_found=yes ac_install_sh= for ac_aux in $ac_aux_files do # As a special case, if "install-sh" is required, that requirement # can be satisfied by any of "install-sh", "install.sh", or "shtool", # and $ac_install_sh is set appropriately for whichever one is found. if test x"$ac_aux" = x"install-sh" then if test -f "${as_dir}install-sh"; then printf "%s\n" "$as_me:${as_lineno-$LINENO}: ${as_dir}install-sh found" >&5 ac_install_sh="${as_dir}install-sh -c" elif test -f "${as_dir}install.sh"; then printf "%s\n" "$as_me:${as_lineno-$LINENO}: ${as_dir}install.sh found" >&5 ac_install_sh="${as_dir}install.sh -c" elif test -f "${as_dir}shtool"; then printf "%s\n" "$as_me:${as_lineno-$LINENO}: ${as_dir}shtool found" >&5 ac_install_sh="${as_dir}shtool install -c" else ac_aux_dir_found=no if $ac_first_candidate; then ac_missing_aux_files="${ac_missing_aux_files} install-sh" else break fi fi else if test -f "${as_dir}${ac_aux}"; then printf "%s\n" "$as_me:${as_lineno-$LINENO}: ${as_dir}${ac_aux} found" >&5 else ac_aux_dir_found=no if $ac_first_candidate; then ac_missing_aux_files="${ac_missing_aux_files} ${ac_aux}" else break fi fi fi done if test "$ac_aux_dir_found" = yes; then ac_aux_dir="$as_dir" break fi ac_first_candidate=false as_found=false done IFS=$as_save_IFS if $as_found then : else case e in @%:@( e) as_fn_error $? "cannot find required auxiliary files:$ac_missing_aux_files" "$LINENO" 5 ;; esac fi # These three variables are undocumented and unsupported, # and are intended to be withdrawn in a future Autoconf release. # They can cause serious problems if a builder's source tree is in a directory # whose full name contains unusual characters. if test -f "${ac_aux_dir}config.guess"; then ac_@&t@config_guess="$SHELL ${ac_aux_dir}config.guess" fi if test -f "${ac_aux_dir}config.sub"; then ac_@&t@config_sub="$SHELL ${ac_aux_dir}config.sub" fi if test -f "$ac_aux_dir/configure"; then ac_@&t@configure="$SHELL ${ac_aux_dir}configure" fi # Check that the precious variables saved in the cache have kept the same # value. ac_cache_corrupted=false for ac_var in $ac_precious_vars; do eval ac_old_set=\$ac_cv_env_${ac_var}_set eval ac_new_set=\$ac_env_${ac_var}_set eval ac_old_val=\$ac_cv_env_${ac_var}_value eval ac_new_val=\$ac_env_${ac_var}_value case $ac_old_set,$ac_new_set in set,) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: '$ac_var' was set to '$ac_old_val' in the previous run" >&5 printf "%s\n" "$as_me: error: '$ac_var' was set to '$ac_old_val' in the previous run" >&2;} ac_cache_corrupted=: ;; ,set) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: '$ac_var' was not set in the previous run" >&5 printf "%s\n" "$as_me: error: '$ac_var' was not set in the previous run" >&2;} ac_cache_corrupted=: ;; ,);; *) if test "x$ac_old_val" != "x$ac_new_val"; then # differences in whitespace do not lead to failure. ac_old_val_w=`echo x $ac_old_val` ac_new_val_w=`echo x $ac_new_val` if test "$ac_old_val_w" != "$ac_new_val_w"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: '$ac_var' has changed since the previous run:" >&5 printf "%s\n" "$as_me: error: '$ac_var' has changed since the previous run:" >&2;} ac_cache_corrupted=: else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in '$ac_var' since the previous run:" >&5 printf "%s\n" "$as_me: warning: ignoring whitespace changes in '$ac_var' since the previous run:" >&2;} eval $ac_var=\$ac_old_val fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: former value: '$ac_old_val'" >&5 printf "%s\n" "$as_me: former value: '$ac_old_val'" >&2;} { printf "%s\n" "$as_me:${as_lineno-$LINENO}: current value: '$ac_new_val'" >&5 printf "%s\n" "$as_me: current value: '$ac_new_val'" >&2;} fi;; esac # Pass precious variables to config.status. if test "$ac_new_set" = set; then case $ac_new_val in *\'*) ac_arg=$ac_var=`printf "%s\n" "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;; *) ac_arg=$ac_var=$ac_new_val ;; esac case " $ac_configure_args " in *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy. *) as_fn_append ac_configure_args " '$ac_arg'" ;; esac fi done if $ac_cache_corrupted; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in '$ac_pwd':" >&5 printf "%s\n" "$as_me: error: in '$ac_pwd':" >&2;} { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5 printf "%s\n" "$as_me: error: changes in the environment can compromise the build" >&2;} as_fn_error $? "run '${MAKE-make} distclean' and/or 'rm $cache_file' and start over" "$LINENO" 5 fi ## -------------------- ## ## Main body of script. ## ## -------------------- ## ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu ac_config_headers="$ac_config_headers config.h" cat >>confdefs.h <<_ACEOF @%:@define VERSION_MAJOR `echo $PACKAGE_VERSION | cut -d . -f 1` _ACEOF cat >>confdefs.h <<_ACEOF @%:@define VERSION_MINOR `echo $PACKAGE_VERSION | cut -d . -f 2 | cut -d - -f 1` _ACEOF cat >>confdefs.h <<_ACEOF @%:@define VERSION_REVISION `echo $PACKAGE_VERSION | cut -d . -f 3 | cut -d - -f 1` _ACEOF ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. set dummy ${ac_tool_prefix}gcc; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_CC+y} then : printf %s "(cached) " >&6 else case e in @%:@( e) if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in @%:@((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}gcc" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi ;; esac fi CC=$ac_cv_prog_CC if test -n "$CC"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 printf "%s\n" "$CC" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi fi if test -z "$ac_cv_prog_CC"; then ac_ct_CC=$CC # Extract the first word of "gcc", so it can be a program name with args. set dummy gcc; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_ac_ct_CC+y} then : printf %s "(cached) " >&6 else case e in @%:@( e) if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in @%:@((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="gcc" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi ;; esac fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 printf "%s\n" "$ac_ct_CC" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi else CC="$ac_cv_prog_CC" fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. set dummy ${ac_tool_prefix}cc; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_CC+y} then : printf %s "(cached) " >&6 else case e in @%:@( e) if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in @%:@((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}cc" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi ;; esac fi CC=$ac_cv_prog_CC if test -n "$CC"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 printf "%s\n" "$CC" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi fi fi if test -z "$CC"; then # Extract the first word of "cc", so it can be a program name with args. set dummy cc; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_CC+y} then : printf %s "(cached) " >&6 else case e in @%:@( e) if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else ac_prog_rejected=no as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in @%:@((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then if test "$as_dir$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then ac_prog_rejected=yes continue fi ac_cv_prog_CC="cc" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS if test $ac_prog_rejected = yes; then # We found a bogon in the path, so make sure we never use it. set dummy $ac_cv_prog_CC shift if test $@%:@ != 0; then # We chose a different compiler from the bogus one. # However, it has the same basename, so the bogon will be chosen # first if we set CC to just the basename; use the full file name. shift ac_cv_prog_CC="$as_dir$ac_word${1+' '}$@" fi fi fi ;; esac fi CC=$ac_cv_prog_CC if test -n "$CC"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 printf "%s\n" "$CC" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then for ac_prog in cl.exe do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_CC+y} then : printf %s "(cached) " >&6 else case e in @%:@( e) if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in @%:@((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_CC="$ac_tool_prefix$ac_prog" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi ;; esac fi CC=$ac_cv_prog_CC if test -n "$CC"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 printf "%s\n" "$CC" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi test -n "$CC" && break done fi if test -z "$CC"; then ac_ct_CC=$CC for ac_prog in cl.exe do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_ac_ct_CC+y} then : printf %s "(cached) " >&6 else case e in @%:@( e) if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in @%:@((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="$ac_prog" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi ;; esac fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 printf "%s\n" "$ac_ct_CC" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi test -n "$ac_ct_CC" && break done if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi fi fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}clang", so it can be a program name with args. set dummy ${ac_tool_prefix}clang; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_CC+y} then : printf %s "(cached) " >&6 else case e in @%:@( e) if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in @%:@((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}clang" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi ;; esac fi CC=$ac_cv_prog_CC if test -n "$CC"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 printf "%s\n" "$CC" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi fi if test -z "$ac_cv_prog_CC"; then ac_ct_CC=$CC # Extract the first word of "clang", so it can be a program name with args. set dummy clang; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_ac_ct_CC+y} then : printf %s "(cached) " >&6 else case e in @%:@( e) if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in @%:@((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="clang" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi ;; esac fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 printf "%s\n" "$ac_ct_CC" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi else CC="$ac_cv_prog_CC" fi fi test -z "$CC" && { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in '$ac_pwd':" >&5 printf "%s\n" "$as_me: error: in '$ac_pwd':" >&2;} as_fn_error $? "no acceptable C compiler found in \$PATH See 'config.log' for more details" "$LINENO" 5; } # Provide some information about the compiler. printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5 set X $ac_compile ac_compiler=$2 for ac_option in --version -v -V -qversion -version; do { { ac_try="$ac_compiler $ac_option >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" printf "%s\n" "$ac_try_echo"; } >&5 (eval "$ac_compiler $ac_option >&5") 2>conftest.err ac_status=$? if test -s conftest.err; then sed '10a\ ... rest of stderr output deleted ... 10q' conftest.err >conftest.er1 cat conftest.er1 >&5 fi rm -f conftest.er1 conftest.err printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } done cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main (void) { ; return 0; } _ACEOF ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out" # Try to create an executable without -o first, disregard a.out. # It will help us diagnose broken compilers, and finding out an intuition # of exeext. { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the C compiler works" >&5 printf %s "checking whether the C compiler works... " >&6; } ac_link_default=`printf "%s\n" "$ac_link" | sed 's/ -o *conftest[^ ]*//'` # The possible output files: ac_files="a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*" ac_rmfiles= for ac_file in $ac_files do case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; * ) ac_rmfiles="$ac_rmfiles $ac_file";; esac done rm -f $ac_rmfiles if { { ac_try="$ac_link_default" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" printf "%s\n" "$ac_try_echo"; } >&5 (eval "$ac_link_default") 2>&5 ac_status=$? printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } then : # Autoconf-2.13 could set the ac_cv_exeext variable to 'no'. # So ignore a value of 'no', otherwise this would lead to 'EXEEXT = no' # in a Makefile. We should not override ac_cv_exeext if it was cached, # so that the user can short-circuit this test for compilers unknown to # Autoconf. for ac_file in $ac_files '' do test -f "$ac_file" || continue case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; [ab].out ) # We found the default executable, but exeext='' is most # certainly right. break;; *.* ) if test ${ac_cv_exeext+y} && test "$ac_cv_exeext" != no; then :; else ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` fi # We set ac_cv_exeext here because the later test for it is not # safe: cross compilers may not add the suffix if given an '-o' # argument, so we may need to know it at that point already. # Even if this section looks crufty: it has the advantage of # actually working. break;; * ) break;; esac done test "$ac_cv_exeext" = no && ac_cv_exeext= else case e in @%:@( e) ac_file='' ;; esac fi if test -z "$ac_file" then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } printf "%s\n" "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in '$ac_pwd':" >&5 printf "%s\n" "$as_me: error: in '$ac_pwd':" >&2;} as_fn_error 77 "C compiler cannot create executables See 'config.log' for more details" "$LINENO" 5; } else case e in @%:@( e) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 printf "%s\n" "yes" >&6; } ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for C compiler default output file name" >&5 printf %s "checking for C compiler default output file name... " >&6; } { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5 printf "%s\n" "$ac_file" >&6; } ac_exeext=$ac_cv_exeext rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out ac_clean_files=$ac_clean_files_save { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5 printf %s "checking for suffix of executables... " >&6; } if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" printf "%s\n" "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } then : # If both 'conftest.exe' and 'conftest' are 'present' (well, observable) # catch 'conftest.exe'. For instance with Cygwin, 'ls conftest' will # work properly (i.e., refer to 'conftest.exe'), while it won't with # 'rm'. for ac_file in conftest.exe conftest conftest.*; do test -f "$ac_file" || continue case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` break;; * ) break;; esac done else case e in @%:@( e) { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in '$ac_pwd':" >&5 printf "%s\n" "$as_me: error: in '$ac_pwd':" >&2;} as_fn_error $? "cannot compute suffix of executables: cannot compile and link See 'config.log' for more details" "$LINENO" 5; } ;; esac fi rm -f conftest conftest$ac_cv_exeext { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5 printf "%s\n" "$ac_cv_exeext" >&6; } rm -f conftest.$ac_ext EXEEXT=$ac_cv_exeext ac_exeext=$EXEEXT cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ @%:@include int main (void) { FILE *f = fopen ("conftest.out", "w"); if (!f) return 1; return ferror (f) || fclose (f) != 0; ; return 0; } _ACEOF ac_clean_files="$ac_clean_files conftest.out" # Check that the compiler produces executables we can run. If not, either # the compiler is broken, or we cross compile. { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5 printf %s "checking whether we are cross compiling... " >&6; } if test "$cross_compiling" != yes; then { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" printf "%s\n" "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } if { ac_try='./conftest$ac_cv_exeext' { { case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" printf "%s\n" "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; }; then cross_compiling=no else if test "$cross_compiling" = maybe; then cross_compiling=yes else { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in '$ac_pwd':" >&5 printf "%s\n" "$as_me: error: in '$ac_pwd':" >&2;} as_fn_error 77 "cannot run C compiled programs. If you meant to cross compile, use '--host'. See 'config.log' for more details" "$LINENO" 5; } fi fi fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5 printf "%s\n" "$cross_compiling" >&6; } rm -f conftest.$ac_ext conftest$ac_cv_exeext \ conftest.o conftest.obj conftest.out ac_clean_files=$ac_clean_files_save { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5 printf %s "checking for suffix of object files... " >&6; } if test ${ac_cv_objext+y} then : printf %s "(cached) " >&6 else case e in @%:@( e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main (void) { ; return 0; } _ACEOF rm -f conftest.o conftest.obj if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" printf "%s\n" "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>&5 ac_status=$? printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } then : for ac_file in conftest.o conftest.obj conftest.*; do test -f "$ac_file" || continue; case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM ) ;; *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'` break;; esac done else case e in @%:@( e) printf "%s\n" "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in '$ac_pwd':" >&5 printf "%s\n" "$as_me: error: in '$ac_pwd':" >&2;} as_fn_error $? "cannot compute suffix of object files: cannot compile See 'config.log' for more details" "$LINENO" 5; } ;; esac fi rm -f conftest.$ac_cv_objext conftest.$ac_ext ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5 printf "%s\n" "$ac_cv_objext" >&6; } OBJEXT=$ac_cv_objext ac_objext=$OBJEXT { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the compiler supports GNU C" >&5 printf %s "checking whether the compiler supports GNU C... " >&6; } if test ${ac_cv_c_compiler_gnu+y} then : printf %s "(cached) " >&6 else case e in @%:@( e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main (void) { #ifndef __GNUC__ choke me #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : ac_compiler_gnu=yes else case e in @%:@( e) ac_compiler_gnu=no ;; esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ac_cv_c_compiler_gnu=$ac_compiler_gnu ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5 printf "%s\n" "$ac_cv_c_compiler_gnu" >&6; } ac_compiler_gnu=$ac_cv_c_compiler_gnu if test $ac_compiler_gnu = yes; then GCC=yes else GCC= fi ac_test_CFLAGS=${CFLAGS+y} ac_save_CFLAGS=$CFLAGS { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5 printf %s "checking whether $CC accepts -g... " >&6; } if test ${ac_cv_prog_cc_g+y} then : printf %s "(cached) " >&6 else case e in @%:@( e) ac_save_c_werror_flag=$ac_c_werror_flag ac_c_werror_flag=yes ac_cv_prog_cc_g=no CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main (void) { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : ac_cv_prog_cc_g=yes else case e in @%:@( e) CFLAGS="" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main (void) { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : else case e in @%:@( e) ac_c_werror_flag=$ac_save_c_werror_flag CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main (void) { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : ac_cv_prog_cc_g=yes fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ;; esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ;; esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ac_c_werror_flag=$ac_save_c_werror_flag ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5 printf "%s\n" "$ac_cv_prog_cc_g" >&6; } if test $ac_test_CFLAGS; then CFLAGS=$ac_save_CFLAGS elif test $ac_cv_prog_cc_g = yes; then if test "$GCC" = yes; then CFLAGS="-g -O2" else CFLAGS="-g" fi else if test "$GCC" = yes; then CFLAGS="-O2" else CFLAGS= fi fi ac_prog_cc_stdc=no if test x$ac_prog_cc_stdc = xno then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $CC option to enable C11 features" >&5 printf %s "checking for $CC option to enable C11 features... " >&6; } if test ${ac_cv_prog_cc_c11+y} then : printf %s "(cached) " >&6 else case e in @%:@( e) ac_cv_prog_cc_c11=no ac_save_CC=$CC cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_c_conftest_c11_program _ACEOF for ac_arg in '' -std=gnu11 do CC="$ac_save_CC $ac_arg" if ac_fn_c_try_compile "$LINENO" then : ac_cv_prog_cc_c11=$ac_arg fi rm -f core conftest.err conftest.$ac_objext conftest.beam test "x$ac_cv_prog_cc_c11" != "xno" && break done rm -f conftest.$ac_ext CC=$ac_save_CC ;; esac fi if test "x$ac_cv_prog_cc_c11" = xno then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 printf "%s\n" "unsupported" >&6; } else case e in @%:@( e) if test "x$ac_cv_prog_cc_c11" = x then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 printf "%s\n" "none needed" >&6; } else case e in @%:@( e) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c11" >&5 printf "%s\n" "$ac_cv_prog_cc_c11" >&6; } CC="$CC $ac_cv_prog_cc_c11" ;; esac fi ac_cv_prog_cc_stdc=$ac_cv_prog_cc_c11 ac_prog_cc_stdc=c11 ;; esac fi fi if test x$ac_prog_cc_stdc = xno then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $CC option to enable C99 features" >&5 printf %s "checking for $CC option to enable C99 features... " >&6; } if test ${ac_cv_prog_cc_c99+y} then : printf %s "(cached) " >&6 else case e in @%:@( e) ac_cv_prog_cc_c99=no ac_save_CC=$CC cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_c_conftest_c99_program _ACEOF for ac_arg in '' -std=gnu99 -std=c99 -c99 -qlanglvl=extc1x -qlanglvl=extc99 -AC99 -D_STDC_C99= do CC="$ac_save_CC $ac_arg" if ac_fn_c_try_compile "$LINENO" then : ac_cv_prog_cc_c99=$ac_arg fi rm -f core conftest.err conftest.$ac_objext conftest.beam test "x$ac_cv_prog_cc_c99" != "xno" && break done rm -f conftest.$ac_ext CC=$ac_save_CC ;; esac fi if test "x$ac_cv_prog_cc_c99" = xno then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 printf "%s\n" "unsupported" >&6; } else case e in @%:@( e) if test "x$ac_cv_prog_cc_c99" = x then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 printf "%s\n" "none needed" >&6; } else case e in @%:@( e) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c99" >&5 printf "%s\n" "$ac_cv_prog_cc_c99" >&6; } CC="$CC $ac_cv_prog_cc_c99" ;; esac fi ac_cv_prog_cc_stdc=$ac_cv_prog_cc_c99 ac_prog_cc_stdc=c99 ;; esac fi fi if test x$ac_prog_cc_stdc = xno then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $CC option to enable C89 features" >&5 printf %s "checking for $CC option to enable C89 features... " >&6; } if test ${ac_cv_prog_cc_c89+y} then : printf %s "(cached) " >&6 else case e in @%:@( e) ac_cv_prog_cc_c89=no ac_save_CC=$CC cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_c_conftest_c89_program _ACEOF for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" do CC="$ac_save_CC $ac_arg" if ac_fn_c_try_compile "$LINENO" then : ac_cv_prog_cc_c89=$ac_arg fi rm -f core conftest.err conftest.$ac_objext conftest.beam test "x$ac_cv_prog_cc_c89" != "xno" && break done rm -f conftest.$ac_ext CC=$ac_save_CC ;; esac fi if test "x$ac_cv_prog_cc_c89" = xno then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 printf "%s\n" "unsupported" >&6; } else case e in @%:@( e) if test "x$ac_cv_prog_cc_c89" = x then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 printf "%s\n" "none needed" >&6; } else case e in @%:@( e) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 printf "%s\n" "$ac_cv_prog_cc_c89" >&6; } CC="$CC $ac_cv_prog_cc_c89" ;; esac fi ac_cv_prog_cc_stdc=$ac_cv_prog_cc_c89 ac_prog_cc_stdc=c89 ;; esac fi fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu ac_header= ac_cache= for ac_item in $ac_header_c_list do if test $ac_cache; then ac_fn_c_check_header_compile "$LINENO" $ac_header ac_cv_header_$ac_cache "$ac_includes_default" if eval test \"x\$ac_cv_header_$ac_cache\" = xyes; then printf "%s\n" "#define $ac_item 1" >> confdefs.h fi ac_header= ac_cache= elif test $ac_header; then ac_cache=$ac_item else ac_header=$ac_item fi done if test $ac_cv_header_stdlib_h = yes && test $ac_cv_header_string_h = yes then : printf "%s\n" "@%:@define STDC_HEADERS 1" >>confdefs.h fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether it is safe to define __EXTENSIONS__" >&5 printf %s "checking whether it is safe to define __EXTENSIONS__... " >&6; } if test ${ac_cv_safe_to_define___extensions__+y} then : printf %s "(cached) " >&6 else case e in @%:@( e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ # define __EXTENSIONS__ 1 $ac_includes_default int main (void) { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : ac_cv_safe_to_define___extensions__=yes else case e in @%:@( e) ac_cv_safe_to_define___extensions__=no ;; esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_safe_to_define___extensions__" >&5 printf "%s\n" "$ac_cv_safe_to_define___extensions__" >&6; } { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether _XOPEN_SOURCE should be defined" >&5 printf %s "checking whether _XOPEN_SOURCE should be defined... " >&6; } if test ${ac_cv_should_define__xopen_source+y} then : printf %s "(cached) " >&6 else case e in @%:@( e) ac_cv_should_define__xopen_source=no if test $ac_cv_header_wchar_h = yes then : cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include mbstate_t x; int main (void) { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : else case e in @%:@( e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #define _XOPEN_SOURCE 500 #include mbstate_t x; int main (void) { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : ac_cv_should_define__xopen_source=yes fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ;; esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext fi ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_should_define__xopen_source" >&5 printf "%s\n" "$ac_cv_should_define__xopen_source" >&6; } printf "%s\n" "@%:@define _ALL_SOURCE 1" >>confdefs.h printf "%s\n" "@%:@define _DARWIN_C_SOURCE 1" >>confdefs.h printf "%s\n" "@%:@define _GNU_SOURCE 1" >>confdefs.h printf "%s\n" "@%:@define _HPUX_ALT_XOPEN_SOCKET_API 1" >>confdefs.h printf "%s\n" "@%:@define _NETBSD_SOURCE 1" >>confdefs.h printf "%s\n" "@%:@define _OPENBSD_SOURCE 1" >>confdefs.h printf "%s\n" "@%:@define _POSIX_PTHREAD_SEMANTICS 1" >>confdefs.h printf "%s\n" "@%:@define __STDC_WANT_IEC_60559_ATTRIBS_EXT__ 1" >>confdefs.h printf "%s\n" "@%:@define __STDC_WANT_IEC_60559_BFP_EXT__ 1" >>confdefs.h printf "%s\n" "@%:@define __STDC_WANT_IEC_60559_DFP_EXT__ 1" >>confdefs.h printf "%s\n" "@%:@define __STDC_WANT_IEC_60559_EXT__ 1" >>confdefs.h printf "%s\n" "@%:@define __STDC_WANT_IEC_60559_FUNCS_EXT__ 1" >>confdefs.h printf "%s\n" "@%:@define __STDC_WANT_IEC_60559_TYPES_EXT__ 1" >>confdefs.h printf "%s\n" "@%:@define __STDC_WANT_LIB_EXT2__ 1" >>confdefs.h printf "%s\n" "@%:@define __STDC_WANT_MATH_SPEC_FUNCS__ 1" >>confdefs.h printf "%s\n" "@%:@define _TANDEM_SOURCE 1" >>confdefs.h if test $ac_cv_header_minix_config_h = yes then : MINIX=yes printf "%s\n" "@%:@define _MINIX 1" >>confdefs.h printf "%s\n" "@%:@define _POSIX_SOURCE 1" >>confdefs.h printf "%s\n" "@%:@define _POSIX_1_SOURCE 2" >>confdefs.h else case e in @%:@( e) MINIX= ;; esac fi if test $ac_cv_safe_to_define___extensions__ = yes then : printf "%s\n" "@%:@define __EXTENSIONS__ 1" >>confdefs.h fi if test $ac_cv_should_define__xopen_source = yes then : printf "%s\n" "@%:@define _XOPEN_SOURCE 500" >>confdefs.h fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. set dummy ${ac_tool_prefix}gcc; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_CC+y} then : printf %s "(cached) " >&6 else case e in @%:@( e) if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in @%:@((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}gcc" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi ;; esac fi CC=$ac_cv_prog_CC if test -n "$CC"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 printf "%s\n" "$CC" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi fi if test -z "$ac_cv_prog_CC"; then ac_ct_CC=$CC # Extract the first word of "gcc", so it can be a program name with args. set dummy gcc; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_ac_ct_CC+y} then : printf %s "(cached) " >&6 else case e in @%:@( e) if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in @%:@((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="gcc" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi ;; esac fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 printf "%s\n" "$ac_ct_CC" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi else CC="$ac_cv_prog_CC" fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. set dummy ${ac_tool_prefix}cc; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_CC+y} then : printf %s "(cached) " >&6 else case e in @%:@( e) if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in @%:@((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}cc" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi ;; esac fi CC=$ac_cv_prog_CC if test -n "$CC"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 printf "%s\n" "$CC" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi fi fi if test -z "$CC"; then # Extract the first word of "cc", so it can be a program name with args. set dummy cc; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_CC+y} then : printf %s "(cached) " >&6 else case e in @%:@( e) if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else ac_prog_rejected=no as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in @%:@((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then if test "$as_dir$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then ac_prog_rejected=yes continue fi ac_cv_prog_CC="cc" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS if test $ac_prog_rejected = yes; then # We found a bogon in the path, so make sure we never use it. set dummy $ac_cv_prog_CC shift if test $@%:@ != 0; then # We chose a different compiler from the bogus one. # However, it has the same basename, so the bogon will be chosen # first if we set CC to just the basename; use the full file name. shift ac_cv_prog_CC="$as_dir$ac_word${1+' '}$@" fi fi fi ;; esac fi CC=$ac_cv_prog_CC if test -n "$CC"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 printf "%s\n" "$CC" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then for ac_prog in cl.exe do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_CC+y} then : printf %s "(cached) " >&6 else case e in @%:@( e) if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in @%:@((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_CC="$ac_tool_prefix$ac_prog" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi ;; esac fi CC=$ac_cv_prog_CC if test -n "$CC"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 printf "%s\n" "$CC" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi test -n "$CC" && break done fi if test -z "$CC"; then ac_ct_CC=$CC for ac_prog in cl.exe do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_ac_ct_CC+y} then : printf %s "(cached) " >&6 else case e in @%:@( e) if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in @%:@((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="$ac_prog" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi ;; esac fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 printf "%s\n" "$ac_ct_CC" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi test -n "$ac_ct_CC" && break done if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi fi fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}clang", so it can be a program name with args. set dummy ${ac_tool_prefix}clang; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_CC+y} then : printf %s "(cached) " >&6 else case e in @%:@( e) if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in @%:@((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}clang" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi ;; esac fi CC=$ac_cv_prog_CC if test -n "$CC"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 printf "%s\n" "$CC" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi fi if test -z "$ac_cv_prog_CC"; then ac_ct_CC=$CC # Extract the first word of "clang", so it can be a program name with args. set dummy clang; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_ac_ct_CC+y} then : printf %s "(cached) " >&6 else case e in @%:@( e) if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in @%:@((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="clang" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi ;; esac fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 printf "%s\n" "$ac_ct_CC" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi else CC="$ac_cv_prog_CC" fi fi test -z "$CC" && { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in '$ac_pwd':" >&5 printf "%s\n" "$as_me: error: in '$ac_pwd':" >&2;} as_fn_error $? "no acceptable C compiler found in \$PATH See 'config.log' for more details" "$LINENO" 5; } # Provide some information about the compiler. printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5 set X $ac_compile ac_compiler=$2 for ac_option in --version -v -V -qversion -version; do { { ac_try="$ac_compiler $ac_option >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" printf "%s\n" "$ac_try_echo"; } >&5 (eval "$ac_compiler $ac_option >&5") 2>conftest.err ac_status=$? if test -s conftest.err; then sed '10a\ ... rest of stderr output deleted ... 10q' conftest.err >conftest.er1 cat conftest.er1 >&5 fi rm -f conftest.er1 conftest.err printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } done { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the compiler supports GNU C" >&5 printf %s "checking whether the compiler supports GNU C... " >&6; } if test ${ac_cv_c_compiler_gnu+y} then : printf %s "(cached) " >&6 else case e in @%:@( e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main (void) { #ifndef __GNUC__ choke me #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : ac_compiler_gnu=yes else case e in @%:@( e) ac_compiler_gnu=no ;; esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ac_cv_c_compiler_gnu=$ac_compiler_gnu ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5 printf "%s\n" "$ac_cv_c_compiler_gnu" >&6; } ac_compiler_gnu=$ac_cv_c_compiler_gnu if test $ac_compiler_gnu = yes; then GCC=yes else GCC= fi ac_test_CFLAGS=${CFLAGS+y} ac_save_CFLAGS=$CFLAGS { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5 printf %s "checking whether $CC accepts -g... " >&6; } if test ${ac_cv_prog_cc_g+y} then : printf %s "(cached) " >&6 else case e in @%:@( e) ac_save_c_werror_flag=$ac_c_werror_flag ac_c_werror_flag=yes ac_cv_prog_cc_g=no CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main (void) { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : ac_cv_prog_cc_g=yes else case e in @%:@( e) CFLAGS="" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main (void) { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : else case e in @%:@( e) ac_c_werror_flag=$ac_save_c_werror_flag CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main (void) { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : ac_cv_prog_cc_g=yes fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ;; esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ;; esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ac_c_werror_flag=$ac_save_c_werror_flag ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5 printf "%s\n" "$ac_cv_prog_cc_g" >&6; } if test $ac_test_CFLAGS; then CFLAGS=$ac_save_CFLAGS elif test $ac_cv_prog_cc_g = yes; then if test "$GCC" = yes; then CFLAGS="-g -O2" else CFLAGS="-g" fi else if test "$GCC" = yes; then CFLAGS="-O2" else CFLAGS= fi fi ac_prog_cc_stdc=no if test x$ac_prog_cc_stdc = xno then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $CC option to enable C11 features" >&5 printf %s "checking for $CC option to enable C11 features... " >&6; } if test ${ac_cv_prog_cc_c11+y} then : printf %s "(cached) " >&6 else case e in @%:@( e) ac_cv_prog_cc_c11=no ac_save_CC=$CC cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_c_conftest_c11_program _ACEOF for ac_arg in '' -std=gnu11 do CC="$ac_save_CC $ac_arg" if ac_fn_c_try_compile "$LINENO" then : ac_cv_prog_cc_c11=$ac_arg fi rm -f core conftest.err conftest.$ac_objext conftest.beam test "x$ac_cv_prog_cc_c11" != "xno" && break done rm -f conftest.$ac_ext CC=$ac_save_CC ;; esac fi if test "x$ac_cv_prog_cc_c11" = xno then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 printf "%s\n" "unsupported" >&6; } else case e in @%:@( e) if test "x$ac_cv_prog_cc_c11" = x then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 printf "%s\n" "none needed" >&6; } else case e in @%:@( e) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c11" >&5 printf "%s\n" "$ac_cv_prog_cc_c11" >&6; } CC="$CC $ac_cv_prog_cc_c11" ;; esac fi ac_cv_prog_cc_stdc=$ac_cv_prog_cc_c11 ac_prog_cc_stdc=c11 ;; esac fi fi if test x$ac_prog_cc_stdc = xno then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $CC option to enable C99 features" >&5 printf %s "checking for $CC option to enable C99 features... " >&6; } if test ${ac_cv_prog_cc_c99+y} then : printf %s "(cached) " >&6 else case e in @%:@( e) ac_cv_prog_cc_c99=no ac_save_CC=$CC cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_c_conftest_c99_program _ACEOF for ac_arg in '' -std=gnu99 -std=c99 -c99 -qlanglvl=extc1x -qlanglvl=extc99 -AC99 -D_STDC_C99= do CC="$ac_save_CC $ac_arg" if ac_fn_c_try_compile "$LINENO" then : ac_cv_prog_cc_c99=$ac_arg fi rm -f core conftest.err conftest.$ac_objext conftest.beam test "x$ac_cv_prog_cc_c99" != "xno" && break done rm -f conftest.$ac_ext CC=$ac_save_CC ;; esac fi if test "x$ac_cv_prog_cc_c99" = xno then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 printf "%s\n" "unsupported" >&6; } else case e in @%:@( e) if test "x$ac_cv_prog_cc_c99" = x then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 printf "%s\n" "none needed" >&6; } else case e in @%:@( e) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c99" >&5 printf "%s\n" "$ac_cv_prog_cc_c99" >&6; } CC="$CC $ac_cv_prog_cc_c99" ;; esac fi ac_cv_prog_cc_stdc=$ac_cv_prog_cc_c99 ac_prog_cc_stdc=c99 ;; esac fi fi if test x$ac_prog_cc_stdc = xno then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $CC option to enable C89 features" >&5 printf %s "checking for $CC option to enable C89 features... " >&6; } if test ${ac_cv_prog_cc_c89+y} then : printf %s "(cached) " >&6 else case e in @%:@( e) ac_cv_prog_cc_c89=no ac_save_CC=$CC cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_c_conftest_c89_program _ACEOF for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" do CC="$ac_save_CC $ac_arg" if ac_fn_c_try_compile "$LINENO" then : ac_cv_prog_cc_c89=$ac_arg fi rm -f core conftest.err conftest.$ac_objext conftest.beam test "x$ac_cv_prog_cc_c89" != "xno" && break done rm -f conftest.$ac_ext CC=$ac_save_CC ;; esac fi if test "x$ac_cv_prog_cc_c89" = xno then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 printf "%s\n" "unsupported" >&6; } else case e in @%:@( e) if test "x$ac_cv_prog_cc_c89" = x then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 printf "%s\n" "none needed" >&6; } else case e in @%:@( e) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 printf "%s\n" "$ac_cv_prog_cc_c89" >&6; } CC="$CC $ac_cv_prog_cc_c89" ;; esac fi ac_cv_prog_cc_stdc=$ac_cv_prog_cc_c89 ac_prog_cc_stdc=c89 ;; esac fi fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu for ac_prog in gawk mawk nawk awk do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_AWK+y} then : printf %s "(cached) " >&6 else case e in @%:@( e) if test -n "$AWK"; then ac_cv_prog_AWK="$AWK" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in @%:@((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_AWK="$ac_prog" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi ;; esac fi AWK=$ac_cv_prog_AWK if test -n "$AWK"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $AWK" >&5 printf "%s\n" "$AWK" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi test -n "$AWK" && break done # Find a good install program. We prefer a C program (faster), # so one script is as good as another. But avoid the broken or # incompatible versions: # SysV /etc/install, /usr/sbin/install # SunOS /usr/etc/install # IRIX /sbin/install # AIX /bin/install # AmigaOS /C/install, which installs bootblocks on floppy discs # AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag # AFS /usr/afsws/bin/install, which mishandles nonexistent args # SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" # OS/2's system install, which has a completely different semantic # ./install, which can be erroneously created by make from ./install.sh. # Reject install programs that cannot install multiple files. { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for a BSD-compatible install" >&5 printf %s "checking for a BSD-compatible install... " >&6; } if test -z "$INSTALL"; then if test ${ac_cv_path_install+y} then : printf %s "(cached) " >&6 else case e in @%:@( e) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in @%:@((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac # Account for fact that we put trailing slashes in our PATH walk. case $as_dir in @%:@(( ./ | /[cC]/* | \ /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \ ?:[\\/]os2[\\/]install[\\/]* | ?:[\\/]OS2[\\/]INSTALL[\\/]* | \ /usr/ucb/* ) ;; *) # OSF1 and SCO ODT 3.0 have their own names for install. # Don't use installbsd from OSF since it installs stuff as root # by default. for ac_prog in ginstall scoinst install; do for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_prog$ac_exec_ext"; then if test $ac_prog = install && grep dspmsg "$as_dir$ac_prog$ac_exec_ext" >/dev/null 2>&1; then # AIX install. It has an incompatible calling convention. : elif test $ac_prog = install && grep pwplus "$as_dir$ac_prog$ac_exec_ext" >/dev/null 2>&1; then # program-specific install script used by HP pwplus--don't use. : else rm -rf conftest.one conftest.two conftest.dir echo one > conftest.one echo two > conftest.two mkdir conftest.dir if "$as_dir$ac_prog$ac_exec_ext" -c conftest.one conftest.two "`pwd`/conftest.dir/" && test -s conftest.one && test -s conftest.two && test -s conftest.dir/conftest.one && test -s conftest.dir/conftest.two then ac_cv_path_install="$as_dir$ac_prog$ac_exec_ext -c" break 3 fi fi fi done done ;; esac done IFS=$as_save_IFS rm -rf conftest.one conftest.two conftest.dir ;; esac fi if test ${ac_cv_path_install+y}; then INSTALL=$ac_cv_path_install else # As a last resort, use the slow shell script. Don't cache a # value for INSTALL within a source directory, because that will # break other packages using the cache if that directory is # removed, or if the value is a relative name. INSTALL=$ac_install_sh fi fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $INSTALL" >&5 printf "%s\n" "$INSTALL" >&6; } # Use test -z because SunOS4 sh mishandles braces in ${var-val}. # It thinks the first close brace ends the variable substitution. test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}' test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}' test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' ac_fn_c_check_func "$LINENO" "execvpe" "ac_cv_func_execvpe" if test "x$ac_cv_func_execvpe" = xyes then : printf "%s\n" "@%:@define HAVE_EXECVPE 1" >>confdefs.h fi ac_fn_c_check_func "$LINENO" "seteuid" "ac_cv_func_seteuid" if test "x$ac_cv_func_seteuid" = xyes then : printf "%s\n" "@%:@define HAVE_SETEUID 1" >>confdefs.h fi ac_fn_c_check_func "$LINENO" "setegid" "ac_cv_func_setegid" if test "x$ac_cv_func_setegid" = xyes then : printf "%s\n" "@%:@define HAVE_SETEGID 1" >>confdefs.h fi ac_fn_c_check_func "$LINENO" "setreuid" "ac_cv_func_setreuid" if test "x$ac_cv_func_setreuid" = xyes then : printf "%s\n" "@%:@define HAVE_SETREUID 1" >>confdefs.h fi ac_fn_c_check_func "$LINENO" "setresuid" "ac_cv_func_setresuid" if test "x$ac_cv_func_setresuid" = xyes then : printf "%s\n" "@%:@define HAVE_SETRESUID 1" >>confdefs.h fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for library containing tgetent" >&5 printf %s "checking for library containing tgetent... " >&6; } if test ${ac_cv_search_tgetent+y} then : printf %s "(cached) " >&6 else case e in @%:@( e) ac_func_search_save_LIBS=$LIBS cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. The 'extern "C"' is for builds by C++ compilers; although this is not generally supported in C code supporting it here has little cost and some practical benefit (sr 110532). */ #ifdef __cplusplus extern "C" #endif char tgetent (void); int main (void) { return tgetent (); ; return 0; } _ACEOF for ac_lib in '' curses termcap termlib ncursesw tinfow ncurses tinfo do if test -z "$ac_lib"; then ac_res="none required" else ac_res=-l$ac_lib LIBS="-l$ac_lib $ac_func_search_save_LIBS" fi if ac_fn_c_try_link "$LINENO" then : ac_cv_search_tgetent=$ac_res fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext if test ${ac_cv_search_tgetent+y} then : break fi done if test ${ac_cv_search_tgetent+y} then : else case e in @%:@( e) ac_cv_search_tgetent=no ;; esac fi rm conftest.$ac_ext LIBS=$ac_func_search_save_LIBS ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_tgetent" >&5 printf "%s\n" "$ac_cv_search_tgetent" >&6; } ac_res=$ac_cv_search_tgetent if test "$ac_res" != no then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" else case e in @%:@( e) as_fn_error $? "unable to find tgetent() function" "$LINENO" 5 ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for library containing crypt" >&5 printf %s "checking for library containing crypt... " >&6; } if test ${ac_cv_search_crypt+y} then : printf %s "(cached) " >&6 else case e in @%:@( e) ac_func_search_save_LIBS=$LIBS cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. The 'extern "C"' is for builds by C++ compilers; although this is not generally supported in C code supporting it here has little cost and some practical benefit (sr 110532). */ #ifdef __cplusplus extern "C" #endif char crypt (void); int main (void) { return crypt (); ; return 0; } _ACEOF for ac_lib in '' crypt do if test -z "$ac_lib"; then ac_res="none required" else ac_res=-l$ac_lib LIBS="-l$ac_lib $ac_func_search_save_LIBS" fi if ac_fn_c_try_link "$LINENO" then : ac_cv_search_crypt=$ac_res fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext if test ${ac_cv_search_crypt+y} then : break fi done if test ${ac_cv_search_crypt+y} then : else case e in @%:@( e) ac_cv_search_crypt=no ;; esac fi rm conftest.$ac_ext LIBS=$ac_func_search_save_LIBS ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_crypt" >&5 printf "%s\n" "$ac_cv_search_crypt" >&6; } ac_res=$ac_cv_search_crypt if test "$ac_res" != no then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" else case e in @%:@( e) as_fn_error $? "unable to find crypt() function" "$LINENO" 5 ;; esac fi ac_fn_c_check_header_compile "$LINENO" "pty.h" "ac_cv_header_pty_h" "$ac_includes_default" if test "x$ac_cv_header_pty_h" = xyes then : printf "%s\n" "@%:@define HAVE_PTY_H 1" >>confdefs.h fi ac_fn_c_check_header_compile "$LINENO" "util.h" "ac_cv_header_util_h" "$ac_includes_default" if test "x$ac_cv_header_util_h" = xyes then : printf "%s\n" "@%:@define HAVE_UTIL_H 1" >>confdefs.h fi ac_fn_c_check_header_compile "$LINENO" "libutil.h" "ac_cv_header_libutil_h" "$ac_includes_default" if test "x$ac_cv_header_libutil_h" = xyes then : printf "%s\n" "@%:@define HAVE_LIBUTIL_H 1" >>confdefs.h fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for library containing openpty" >&5 printf %s "checking for library containing openpty... " >&6; } if test ${ac_cv_search_openpty+y} then : printf %s "(cached) " >&6 else case e in @%:@( e) ac_func_search_save_LIBS=$LIBS cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. The 'extern "C"' is for builds by C++ compilers; although this is not generally supported in C code supporting it here has little cost and some practical benefit (sr 110532). */ #ifdef __cplusplus extern "C" #endif char openpty (void); int main (void) { return openpty (); ; return 0; } _ACEOF for ac_lib in '' util openpty bsd do if test -z "$ac_lib"; then ac_res="none required" else ac_res=-l$ac_lib LIBS="-l$ac_lib $ac_func_search_save_LIBS" fi if ac_fn_c_try_link "$LINENO" then : ac_cv_search_openpty=$ac_res fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext if test ${ac_cv_search_openpty+y} then : break fi done if test ${ac_cv_search_openpty+y} then : else case e in @%:@( e) ac_cv_search_openpty=no ;; esac fi rm conftest.$ac_ext LIBS=$ac_func_search_save_LIBS ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_openpty" >&5 printf "%s\n" "$ac_cv_search_openpty" >&6; } ac_res=$ac_cv_search_openpty if test "$ac_res" != no then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" printf "%s\n" "@%:@define HAVE_OPENPTY 1" >>confdefs.h else case e in @%:@( e) as_fn_error $? "unable to find openpty() function" "$LINENO" 5 ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for library containing socket" >&5 printf %s "checking for library containing socket... " >&6; } if test ${ac_cv_search_socket+y} then : printf %s "(cached) " >&6 else case e in @%:@( e) ac_func_search_save_LIBS=$LIBS cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. The 'extern "C"' is for builds by C++ compilers; although this is not generally supported in C code supporting it here has little cost and some practical benefit (sr 110532). */ #ifdef __cplusplus extern "C" #endif char socket (void); int main (void) { return socket (); ; return 0; } _ACEOF for ac_lib in '' network do if test -z "$ac_lib"; then ac_res="none required" else ac_res=-l$ac_lib LIBS="-l$ac_lib $ac_func_search_save_LIBS" fi if ac_fn_c_try_link "$LINENO" then : ac_cv_search_socket=$ac_res fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext if test ${ac_cv_search_socket+y} then : break fi done if test ${ac_cv_search_socket+y} then : else case e in @%:@( e) ac_cv_search_socket=no ;; esac fi rm conftest.$ac_ext LIBS=$ac_func_search_save_LIBS ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_socket" >&5 printf "%s\n" "$ac_cv_search_socket" >&6; } ac_res=$ac_cv_search_socket if test "$ac_res" != no then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" else case e in @%:@( e) as_fn_error $? "unable to find socket() function" "$LINENO" 5 ;; esac fi ac_fn_c_check_header_compile "$LINENO" "langinfo.h" "ac_cv_header_langinfo_h" "$ac_includes_default" if test "x$ac_cv_header_langinfo_h" = xyes then : printf "%s\n" "@%:@define HAVE_LANGINFO_H 1" >>confdefs.h fi ac_fn_c_check_header_compile "$LINENO" "dirent.h" "ac_cv_header_dirent_h" "$ac_includes_default" if test "x$ac_cv_header_dirent_h" = xyes then : printf "%s\n" "@%:@define HAVE_DIRENT_H 1" >>confdefs.h fi @%:@ Check whether --enable-pam was given. if test ${enable_pam+y} then : enableval=$enable_pam; enable_pam=$enableval else case e in @%:@( e) enable_pam=yes ;; esac fi @%:@ Check whether --enable-utmp was given. if test ${enable_utmp+y} then : enableval=$enable_utmp; enable_utmp=$enableval else case e in @%:@( e) enable_utmp=no ;; esac fi @%:@ Check whether --enable-telnet was given. if test ${enable_telnet+y} then : enableval=$enable_telnet; enable_telnet=$enableval else case e in @%:@( e) enable_telnet=no ;; esac fi @%:@ Check whether --enable-socket-dir was given. if test ${enable_socket_dir+y} then : enableval=$enable_socket_dir; enable_socket_dir=$enableval else case e in @%:@( e) enable_socket_dir=no ;; esac fi @%:@ Check whether --with-system_screenrc was given. if test ${with_system_screenrc+y} then : withval=$with_system_screenrc; with_system_screenrc=$withval else case e in @%:@( e) with_system_screenrc=/etc/screenrc ;; esac fi @%:@ Check whether --with-pty-mode was given. if test ${with_pty_mode+y} then : withval=$with_pty_mode; with_pty_mode=$withval else case e in @%:@( e) with_pty_mode=0620 ;; esac fi @%:@ Check whether --with-pty-group was given. if test ${with_pty_group+y} then : withval=$with_pty_group; with_pty_group=$withval else case e in @%:@( e) with_pty_group=5 ;; esac fi @%:@ Check whether --with-pty-rofs was given. if test ${with_pty_rofs+y} then : withval=$with_pty_rofs; with_pty_rofs=$withval else case e in @%:@( e) with_pty_rofs=no ;; esac fi if test "x$enable_pam" = "xyes" then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for PAM support" >&5 printf %s "checking for PAM support... " >&6; } oldlibs="$LIBS" LIBS="$LIBS -lpam" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main (void) { pam_start(0, 0, 0, 0); pam_authenticate(0, 0); pam_end(0,0); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO" then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 printf "%s\n" "yes" >&6; }; printf "%s\n" "@%:@define ENABLE_PAM 1" >>confdefs.h else case e in @%:@( e) as_fn_error $? "no" "$LINENO" 5;LIBS="$oldlibs" ;; esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext fi if test "x$enable_utmp" = "xyes" then : for ac_header in utmpx.h do : ac_fn_c_check_header_compile "$LINENO" "utmpx.h" "ac_cv_header_utmpx_h" "$ac_includes_default" if test "x$ac_cv_header_utmpx_h" = xyes then : printf "%s\n" "@%:@define HAVE_UTMPX_H 1" >>confdefs.h have_utmpx=yes else case e in @%:@( e) have_utmpx=no ;; esac fi done if test "x$have_utmpx" != "xyes" then : as_fn_error $? "Missing utmpx.h" "$LINENO" 5 fi ac_fn_c_check_header_compile "$LINENO" "utempter.h" "ac_cv_header_utempter_h" "$ac_includes_default" if test "x$ac_cv_header_utempter_h" = xyes then : have_utempter=yes else case e in @%:@( e) have_utempter=no ;; esac fi if test "x$have_utempter" = "xyes" then : printf "%s\n" "@%:@define HAVE_UTEMPTER 1" >>confdefs.h LIBS="$LIBS -lutempter" fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if utmpx struct has ut_host field" >&5 printf %s "checking if utmpx struct has ut_host field... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main (void) { struct utmpx u; u.ut_host[0] = 0; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 printf "%s\n" "yes" >&6; } printf "%s\n" "@%:@define HAVE_UT_HOST 1" >>confdefs.h else case e in @%:@( e) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } ;; esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if utmpx struct has ut_exit field" >&5 printf %s "checking if utmpx struct has ut_exit field... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main (void) { struct utmpx u; u.ut_exit.e_exit; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 printf "%s\n" "yes" >&6; } printf "%s\n" "@%:@define HAVE_UT_EXIT 1" >>confdefs.h else case e in @%:@( e) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } ;; esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext printf "%s\n" "@%:@define ENABLE_UTMP 1" >>confdefs.h fi if test "x$enable_telnet" = "xyes" then : printf "%s\n" "@%:@define ENABLE_TELNET 1" >>confdefs.h fi if test "x$enable_socket_dir" != "xno" then : if test "x$enable_socket_dir" = "xyes" then : enable_socket_dir="/run/screen" fi printf "%s\n" "@%:@define SOCKET_DIR \"$enable_socket_dir\"" >>confdefs.h fi printf "%s\n" "@%:@define SYSTEM_SCREENRC \"$with_system_screenrc\"" >>confdefs.h printf "%s\n" "@%:@define PTY_MODE $with_pty_mode" >>confdefs.h printf "%s\n" "@%:@define PTY_GROUP $with_pty_group" >>confdefs.h if test "x$with_pty_rofs" = "xyes" then : printf "%s\n" "@%:@define PTY_ROFS 1" >>confdefs.h fi ac_config_files="$ac_config_files Makefile doc/Makefile" cat >confcache <<\_ACEOF # This file is a shell script that caches the results of configure # tests run on this system so they can be shared between configure # scripts and configure runs, see configure's option --config-cache. # It is not useful on other systems. If it contains results you don't # want to keep, you may remove or edit it. # # config.status only pays attention to the cache file if you give it # the --recheck option to rerun configure. # # 'ac_cv_env_foo' variables (set or unset) will be overridden when # loading this file, other *unset* 'ac_cv_foo' will be assigned the # following values. _ACEOF # The following way of writing the cache mishandles newlines in values, # but we know of no workaround that is simple, portable, and efficient. # So, we kill variables containing newlines. # Ultrix sh set writes to stderr and can't be redirected directly, # and sets the high bit in the cache file unless we assign to the vars. ( for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 printf "%s\n" "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space=' '; set) 2>&1` in #( *${as_nl}ac_space=\ *) # 'set' does not quote correctly, so add quotes: double-quote # substitution turns \\\\ into \\, and sed turns \\ into \. sed -n \ "s/'/'\\\\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" ;; #( *) # 'set' quotes correctly as required by POSIX, so do not add quotes. sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) | sed ' /^ac_cv_env_/b end t clear :clear s/^\([^=]*\)=\(.*[{}].*\)$/test ${\1+y} || &/ t end s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ :end' >>confcache if diff "$cache_file" confcache >/dev/null 2>&1; then :; else if test -w "$cache_file"; then if test "x$cache_file" != "x/dev/null"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5 printf "%s\n" "$as_me: updating cache $cache_file" >&6;} if test ! -f "$cache_file" || test -h "$cache_file"; then cat confcache >"$cache_file" else case $cache_file in #( */* | ?:*) mv -f confcache "$cache_file"$$ && mv -f "$cache_file"$$ "$cache_file" ;; #( *) mv -f confcache "$cache_file" ;; esac fi fi else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5 printf "%s\n" "$as_me: not updating unwritable cache $cache_file" >&6;} fi fi rm -f confcache test "x$prefix" = xNONE && prefix=$ac_default_prefix # Let make expand exec_prefix. test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' DEFS=-DHAVE_CONFIG_H ac_libobjs= ac_ltlibobjs= U= for ac_i in : $LIB@&t@OBJS; do test "x$ac_i" = x: && continue # 1. Remove the extension, and $U if already installed. ac_script='s/\$U\././;s/\.o$//;s/\.obj$//' ac_i=`printf "%s\n" "$ac_i" | sed "$ac_script"` # 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR # will be set to the directory where LIBOBJS objects are built. as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext" as_fn_append ac_ltlibobjs " \${LIBOBJDIR}$ac_i"'$U.lo' done LIB@&t@OBJS=$ac_libobjs LTLIBOBJS=$ac_ltlibobjs : "${CONFIG_STATUS=./config.status}" ac_write_fail=0 ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files $CONFIG_STATUS" { printf "%s\n" "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5 printf "%s\n" "$as_me: creating $CONFIG_STATUS" >&6;} as_write_fail=0 cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1 #! $SHELL # Generated by $as_me. # Run this file to recreate the current configuration. # Compiler output produced by configure, useful for debugging # configure, is in config.log if it exists. debug=false ac_cs_recheck=false ac_cs_silent=false SHELL=\${CONFIG_SHELL-$SHELL} export SHELL _ASEOF cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1 ## -------------------- ## ## M4sh Initialization. ## ## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test ${ZSH_VERSION+y} && (emulate sh) >/dev/null 2>&1 then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case e in @%:@( e) case `(set -o) 2>/dev/null` in @%:@( *posix*) : set -o posix ;; @%:@( *) : ;; esac ;; esac fi # Reset variables that may have inherited troublesome values from # the environment. # IFS needs to be set, to space, tab, and newline, in precisely that order. # (If _AS_PATH_WALK were called with IFS unset, it would have the # side effect of setting IFS to empty, thus disabling word splitting.) # Quoting is to prevent editors from complaining about space-tab. as_nl=' ' export as_nl IFS=" "" $as_nl" PS1='$ ' PS2='> ' PS4='+ ' # Ensure predictable behavior from utilities with locale-dependent output. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # We cannot yet rely on "unset" to work, but we need these variables # to be unset--not just set to an empty or harmless value--now, to # avoid bugs in old shells (e.g. pre-3.0 UWIN ksh). This construct # also avoids known problems related to "unset" and subshell syntax # in other old shells (e.g. bash 2.01 and pdksh 5.2.14). for as_var in BASH_ENV ENV MAIL MAILPATH CDPATH do eval test \${$as_var+y} \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done # Ensure that fds 0, 1, and 2 are open. if (exec 3>&0) 2>/dev/null; then :; else exec 0&1) 2>/dev/null; then :; else exec 1>/dev/null; fi if (exec 3>&2) ; then :; else exec 2>/dev/null; fi # The user is always right. if ${PATH_SEPARATOR+false} :; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # Find who we are. Look in the path if we contain no directory separator. as_myself= case $0 in @%:@(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in @%:@((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac test -r "$as_dir$0" && as_myself=$as_dir$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as 'sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then printf "%s\n" "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi @%:@ as_fn_error STATUS ERROR [LINENO LOG_FD] @%:@ ---------------------------------------- @%:@ Output "`basename @S|@0`: error: ERROR" to stderr. If LINENO and LOG_FD are @%:@ provided, also output the error to LOG_FD, referencing LINENO. Then exit the @%:@ script with STATUS, using 1 if that was 0. as_fn_error () { as_status=$1; test $as_status -eq 0 && as_status=1 if test "$4"; then as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi printf "%s\n" "$as_me: error: $2" >&2 as_fn_exit $as_status } @%:@ as_fn_error @%:@ as_fn_set_status STATUS @%:@ ----------------------- @%:@ Set @S|@? to STATUS, without forking. as_fn_set_status () { return $1 } @%:@ as_fn_set_status @%:@ as_fn_exit STATUS @%:@ ----------------- @%:@ Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } @%:@ as_fn_exit @%:@ as_fn_unset VAR @%:@ --------------- @%:@ Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset @%:@ as_fn_append VAR VALUE @%:@ ---------------------- @%:@ Append the text in VALUE to the end of the definition contained in VAR. Take @%:@ advantage of any shell optimizations that allow amortized linear growth over @%:@ repeated appends, instead of the typical quadratic growth present in naive @%:@ implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null then : eval 'as_fn_append () { eval $1+=\$2 }' else case e in @%:@( e) as_fn_append () { eval $1=\$$1\$2 } ;; esac fi # as_fn_append @%:@ as_fn_arith ARG... @%:@ ------------------ @%:@ Perform arithmetic evaluation on the ARGs, and store the result in the @%:@ global @S|@as_val. Take advantage of shells that can avoid forks. The arguments @%:@ must be portable across @S|@(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null then : eval 'as_fn_arith () { as_val=$(( $* )) }' else case e in @%:@( e) as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } ;; esac fi # as_fn_arith if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || printf "%s\n" X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits # Determine whether it's possible to make 'echo' print without a newline. # These variables are no longer used directly by Autoconf, but are AC_SUBSTed # for compatibility with existing Makefiles. ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in @%:@((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac # For backward compatibility with old third-party macros, we provide # the shell variables $as_echo and $as_echo_n. New code should use # AS_ECHO(["message"]) and AS_ECHO_N(["message"]), respectively. as_@&t@echo='printf %s\n' as_@&t@echo_n='printf %s' rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both 'ln -s file dir' and 'ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; 'ln -s' creates a wrapper executable. # In both cases, we have to default to 'cp -pR'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -pR' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -pR' fi else as_ln_s='cp -pR' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null @%:@ as_fn_mkdir_p @%:@ ------------- @%:@ Create "@S|@as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`printf "%s\n" "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || printf "%s\n" X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" } @%:@ as_fn_mkdir_p if mkdir -p . 2>/dev/null; then as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi @%:@ as_fn_executable_p FILE @%:@ ----------------------- @%:@ Test if FILE is an executable regular file. as_fn_executable_p () { test -f "$1" && test -x "$1" } @%:@ as_fn_executable_p as_test_x='test -x' as_executable_p=as_fn_executable_p # Sed expression to map a string onto a valid CPP name. as_sed_cpp="y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g" as_tr_cpp="eval sed '$as_sed_cpp'" # deprecated # Sed expression to map a string onto a valid variable name. as_sed_sh="y%*+%pp%;s%[^_$as_cr_alnum]%_%g" as_tr_sh="eval sed '$as_sed_sh'" # deprecated exec 6>&1 ## ----------------------------------- ## ## Main body of $CONFIG_STATUS script. ## ## ----------------------------------- ## _ASEOF test $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1 cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # Save the log message, to keep $0 and so on meaningful, and to # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log=" This file was extended by GNU Screen $as_me 5.0.2, which was generated by GNU Autoconf 2.72. Invocation command line was CONFIG_FILES = $CONFIG_FILES CONFIG_HEADERS = $CONFIG_HEADERS CONFIG_LINKS = $CONFIG_LINKS CONFIG_COMMANDS = $CONFIG_COMMANDS $ $0 $@ on `(hostname || uname -n) 2>/dev/null | sed 1q` " _ACEOF case $ac_config_files in *" "*) set x $ac_config_files; shift; ac_config_files=$*;; esac case $ac_config_headers in *" "*) set x $ac_config_headers; shift; ac_config_headers=$*;; esac cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 # Files that config.status was made for. config_files="$ac_config_files" config_headers="$ac_config_headers" _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 ac_cs_usage="\ '$as_me' instantiates files and other configuration actions from templates according to the current configuration. Unless the files and actions are specified as TAGs, all are instantiated by default. Usage: $0 [OPTION]... [TAG]... -h, --help print this help, then exit -V, --version print version number and configuration settings, then exit --config print configuration, then exit -q, --quiet, --silent do not print progress messages -d, --debug don't remove temporary files --recheck update $as_me by reconfiguring in the same conditions --file=FILE[:TEMPLATE] instantiate the configuration file FILE --header=FILE[:TEMPLATE] instantiate the configuration header FILE Configuration files: $config_files Configuration headers: $config_headers Report bugs to . GNU Screen home page: . General help using GNU software: ." _ACEOF ac_cs_config=`printf "%s\n" "$ac_configure_args" | sed "$ac_safe_unquote"` ac_cs_config_escaped=`printf "%s\n" "$ac_cs_config" | sed "s/^ //; s/'/'\\\\\\\\''/g"` cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_cs_config='$ac_cs_config_escaped' ac_cs_version="\\ GNU Screen config.status 5.0.2 configured by $0, generated by GNU Autoconf 2.72, with options \\"\$ac_cs_config\\" Copyright (C) 2023 Free Software Foundation, Inc. This config.status script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it." ac_pwd='$ac_pwd' srcdir='$srcdir' INSTALL='$INSTALL' AWK='$AWK' test -n "\$AWK" || AWK=awk _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # The default lists apply if the user does not specify any file. ac_need_defaults=: while test $# != 0 do case $1 in --*=?*) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'` ac_shift=: ;; --*=) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg= ac_shift=: ;; *) ac_option=$1 ac_optarg=$2 ac_shift=shift ;; esac case $ac_option in # Handling of the options. -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) ac_cs_recheck=: ;; --version | --versio | --versi | --vers | --ver | --ve | --v | -V ) printf "%s\n" "$ac_cs_version"; exit ;; --config | --confi | --conf | --con | --co | --c ) printf "%s\n" "$ac_cs_config"; exit ;; --debug | --debu | --deb | --de | --d | -d ) debug=: ;; --file | --fil | --fi | --f ) $ac_shift case $ac_optarg in *\'*) ac_optarg=`printf "%s\n" "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; '') as_fn_error $? "missing file argument" ;; esac as_fn_append CONFIG_FILES " '$ac_optarg'" ac_need_defaults=false;; --header | --heade | --head | --hea ) $ac_shift case $ac_optarg in *\'*) ac_optarg=`printf "%s\n" "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; esac as_fn_append CONFIG_HEADERS " '$ac_optarg'" ac_need_defaults=false;; --he | --h) # Conflict between --help and --header as_fn_error $? "ambiguous option: '$1' Try '$0 --help' for more information.";; --help | --hel | -h ) printf "%s\n" "$ac_cs_usage"; exit ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil | --si | --s) ac_cs_silent=: ;; # This is an error. -*) as_fn_error $? "unrecognized option: '$1' Try '$0 --help' for more information." ;; *) as_fn_append ac_config_targets " $1" ac_need_defaults=false ;; esac shift done ac_configure_extra_args= if $ac_cs_silent; then exec 6>/dev/null ac_configure_extra_args="$ac_configure_extra_args --silent" fi _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 if \$ac_cs_recheck; then set X $SHELL '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion shift \printf "%s\n" "running CONFIG_SHELL=$SHELL \$*" >&6 CONFIG_SHELL='$SHELL' export CONFIG_SHELL exec "\$@" fi _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 exec 5>>config.log { echo sed 'h;s/./-/g;s/^.../@%:@@%:@ /;s/...$/ @%:@@%:@/;p;x;p;x' <<_ASBOX @%:@@%:@ Running $as_me. @%:@@%:@ _ASBOX printf "%s\n" "$ac_log" } >&5 _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # Handling of arguments. for ac_config_target in $ac_config_targets do case $ac_config_target in "config.h") CONFIG_HEADERS="$CONFIG_HEADERS config.h" ;; "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;; "doc/Makefile") CONFIG_FILES="$CONFIG_FILES doc/Makefile" ;; *) as_fn_error $? "invalid argument: '$ac_config_target'" "$LINENO" 5;; esac done # If the user did not use the arguments to specify the items to instantiate, # then the envvar interface is used. Set only those that are not. # We use the long form for the default assignment because of an extremely # bizarre bug on SunOS 4.1.3. if $ac_need_defaults; then test ${CONFIG_FILES+y} || CONFIG_FILES=$config_files test ${CONFIG_HEADERS+y} || CONFIG_HEADERS=$config_headers fi # Have a temporary directory for convenience. Make it in the build tree # simply because there is no reason against having it here, and in addition, # creating and moving files from /tmp can sometimes cause problems. # Hook for its removal unless debugging. # Note that there is a small window in which the directory will not be cleaned: # after its creation but before its name has been assigned to '$tmp'. $debug || { tmp= ac_tmp= trap 'exit_status=$? : "${ac_tmp:=$tmp}" { test ! -d "$ac_tmp" || rm -fr "$ac_tmp"; } && exit $exit_status ' 0 trap 'as_fn_exit 1' 1 2 13 15 } # Create a (secure) tmp directory for tmp files. { tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` && test -d "$tmp" } || { tmp=./conf$$-$RANDOM (umask 077 && mkdir "$tmp") } || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5 ac_tmp=$tmp # Set up the scripts for CONFIG_FILES section. # No need to generate them if there are no CONFIG_FILES. # This happens for instance with './config.status config.h'. if test -n "$CONFIG_FILES"; then ac_cr=`echo X | tr X '\015'` # On cygwin, bash can eat \r inside `` if the user requested igncr. # But we know of no other shell where ac_cr would be empty at this # point, so we can use a bashism as a fallback. if test "x$ac_cr" = x; then eval ac_cr=\$\'\\r\' fi ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' /dev/null` if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then ac_cs_awk_cr='\\r' else ac_cs_awk_cr=$ac_cr fi echo 'BEGIN {' >"$ac_tmp/subs1.awk" && _ACEOF { echo "cat >conf$$subs.awk <<_ACEOF" && echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' && echo "_ACEOF" } >conf$$subs.sh || as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_num=`echo "$ac_subst_vars" | grep -c '^'` ac_delim='%!_!# ' for ac_last_try in false false false false false :; do . ./conf$$subs.sh || as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X` if test $ac_delim_n = $ac_delim_num; then break elif $ac_last_try; then as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 else ac_delim="$ac_delim!$ac_delim _$ac_delim!! " fi done rm -f conf$$subs.sh cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 cat >>"\$ac_tmp/subs1.awk" <<\\_ACAWK && _ACEOF sed -n ' h s/^/S["/; s/!.*/"]=/ p g s/^[^!]*!// :repl t repl s/'"$ac_delim"'$// t delim :nl h s/\(.\{148\}\)..*/\1/ t more1 s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/ p n b repl :more1 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t nl :delim h s/\(.\{148\}\)..*/\1/ t more2 s/["\\]/\\&/g; s/^/"/; s/$/"/ p b :more2 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t delim ' >$CONFIG_STATUS || ac_write_fail=1 rm -f conf$$subs.awk cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 _ACAWK cat >>"\$ac_tmp/subs1.awk" <<_ACAWK && for (key in S) S_is_set[key] = 1 FS = "" } { line = $ 0 nfields = split(line, field, "@") substed = 0 len = length(field[1]) for (i = 2; i < nfields; i++) { key = field[i] keylen = length(key) if (S_is_set[key]) { value = S[key] line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3) len += length(value) + length(field[++i]) substed = 1 } else len += 1 + keylen } print line } _ACAWK _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g" else cat fi < "$ac_tmp/subs1.awk" > "$ac_tmp/subs.awk" \ || as_fn_error $? "could not setup config files machinery" "$LINENO" 5 _ACEOF # VPATH may cause trouble with some makes, so we remove sole $(srcdir), # ${srcdir} and @srcdir@ entries from VPATH if srcdir is ".", strip leading and # trailing colons and then remove the whole line if VPATH becomes empty # (actually we leave an empty line to preserve line numbers). if test "x$srcdir" = x.; then ac_vpsub='/^[ ]*VPATH[ ]*=[ ]*/{ h s/// s/^/:/ s/[ ]*$/:/ s/:\$(srcdir):/:/g s/:\${srcdir}:/:/g s/:@srcdir@:/:/g s/^:*// s/:*$// x s/\(=[ ]*\).*/\1/ G s/\n// s/^[^=]*=[ ]*$// }' fi cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 fi # test -n "$CONFIG_FILES" # Set up the scripts for CONFIG_HEADERS section. # No need to generate them if there are no CONFIG_HEADERS. # This happens for instance with './config.status Makefile'. if test -n "$CONFIG_HEADERS"; then cat >"$ac_tmp/defines.awk" <<\_ACAWK || BEGIN { _ACEOF # Transform confdefs.h into an awk script 'defines.awk', embedded as # here-document in config.status, that substitutes the proper values into # config.h.in to produce config.h. # Create a delimiter string that does not exist in confdefs.h, to ease # handling of long lines. ac_delim='%!_!# ' for ac_last_try in false false :; do ac_tt=`sed -n "/$ac_delim/p" confdefs.h` if test -z "$ac_tt"; then break elif $ac_last_try; then as_fn_error $? "could not make $CONFIG_HEADERS" "$LINENO" 5 else ac_delim="$ac_delim!$ac_delim _$ac_delim!! " fi done # For the awk script, D is an array of macro values keyed by name, # likewise P contains macro parameters if any. Preserve backslash # newline sequences. ac_word_re=[_$as_cr_Letters][_$as_cr_alnum]* sed -n ' s/.\{148\}/&'"$ac_delim"'/g t rset :rset s/^[ ]*#[ ]*define[ ][ ]*/ / t def d :def s/\\$// t bsnl s/["\\]/\\&/g s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ D["\1"]=" \3"/p s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2"/p d :bsnl s/["\\]/\\&/g s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ D["\1"]=" \3\\\\\\n"\\/p t cont s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2\\\\\\n"\\/p t cont d :cont n s/.\{148\}/&'"$ac_delim"'/g t clear :clear s/\\$// t bsnlc s/["\\]/\\&/g; s/^/"/; s/$/"/p d :bsnlc s/["\\]/\\&/g; s/^/"/; s/$/\\\\\\n"\\/p b cont ' >$CONFIG_STATUS || ac_write_fail=1 cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 for (key in D) D_is_set[key] = 1 FS = "" } /^[\t ]*#[\t ]*(define|undef)[\t ]+$ac_word_re([\t (]|\$)/ { line = \$ 0 split(line, arg, " ") if (arg[1] == "#") { defundef = arg[2] mac1 = arg[3] } else { defundef = substr(arg[1], 2) mac1 = arg[2] } split(mac1, mac2, "(") #) macro = mac2[1] prefix = substr(line, 1, index(line, defundef) - 1) if (D_is_set[macro]) { # Preserve the white space surrounding the "#". print prefix "define", macro P[macro] D[macro] next } else { # Replace #undef with comments. This is necessary, for example, # in the case of _POSIX_SOURCE, which is predefined and required # on some systems where configure will not decide to define it. if (defundef == "undef") { print "/*", prefix defundef, macro, "*/" next } } } { print } _ACAWK _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 as_fn_error $? "could not setup config headers machinery" "$LINENO" 5 fi # test -n "$CONFIG_HEADERS" eval set X " :F $CONFIG_FILES :H $CONFIG_HEADERS " shift for ac_tag do case $ac_tag in :[FHLC]) ac_mode=$ac_tag; continue;; esac case $ac_mode$ac_tag in :[FHL]*:*);; :L* | :C*:*) as_fn_error $? "invalid tag '$ac_tag'" "$LINENO" 5;; :[FH]-) ac_tag=-:-;; :[FH]*) ac_tag=$ac_tag:$ac_tag.in;; esac ac_save_IFS=$IFS IFS=: set x $ac_tag IFS=$ac_save_IFS shift ac_file=$1 shift case $ac_mode in :L) ac_source=$1;; :[FH]) ac_file_inputs= for ac_f do case $ac_f in -) ac_f="$ac_tmp/stdin";; *) # Look for the file first in the build tree, then in the source tree # (if the path is not absolute). The absolute path cannot be DOS-style, # because $ac_f cannot contain ':'. test -f "$ac_f" || case $ac_f in [\\/$]*) false;; *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";; esac || as_fn_error 1 "cannot find input file: '$ac_f'" "$LINENO" 5;; esac case $ac_f in *\'*) ac_f=`printf "%s\n" "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac as_fn_append ac_file_inputs " '$ac_f'" done # Let's still pretend it is 'configure' which instantiates (i.e., don't # use $as_me), people would be surprised to read: # /* config.h. Generated by config.status. */ configure_input='Generated from '` printf "%s\n" "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g' `' by configure.' if test x"$ac_file" != x-; then configure_input="$ac_file. $configure_input" { printf "%s\n" "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5 printf "%s\n" "$as_me: creating $ac_file" >&6;} fi # Neutralize special characters interpreted by sed in replacement strings. case $configure_input in #( *\&* | *\|* | *\\* ) ac_sed_conf_input=`printf "%s\n" "$configure_input" | sed 's/[\\\\&|]/\\\\&/g'`;; #( *) ac_sed_conf_input=$configure_input;; esac case $ac_tag in *:-:* | *:-) cat >"$ac_tmp/stdin" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; esac ;; esac ac_dir=`$as_dirname -- "$ac_file" || $as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$ac_file" : 'X\(//\)[^/]' \| \ X"$ac_file" : 'X\(//\)$' \| \ X"$ac_file" : 'X\(/\)' \| . 2>/dev/null || printf "%s\n" X"$ac_file" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` as_dir="$ac_dir"; as_fn_mkdir_p ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`printf "%s\n" "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`printf "%s\n" "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix case $ac_mode in :F) # # CONFIG_FILE # case $INSTALL in [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;; *) ac_INSTALL=$ac_top_build_prefix$INSTALL ;; esac _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # If the template does not know about datarootdir, expand it. # FIXME: This hack should be removed a few years after 2.60. ac_datarootdir_hack=; ac_datarootdir_seen= ac_sed_dataroot=' /datarootdir/ { p q } /@datadir@/p /@docdir@/p /@infodir@/p /@localedir@/p /@mandir@/p' case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in *datarootdir*) ac_datarootdir_seen=yes;; *@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 printf "%s\n" "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;} _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_datarootdir_hack=' s&@datadir@&$datadir&g s&@docdir@&$docdir&g s&@infodir@&$infodir&g s&@localedir@&$localedir&g s&@mandir@&$mandir&g s&\\\${datarootdir}&$datarootdir&g' ;; esac _ACEOF # Neutralize VPATH when '$srcdir' = '.'. # Shell code in configure.ac might set extrasub. # FIXME: do we really want to maintain this feature? cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_sed_extra="$ac_vpsub $extrasub _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 :t /@[a-zA-Z_][a-zA-Z_0-9]*@/!b s|@configure_input@|$ac_sed_conf_input|;t t s&@top_builddir@&$ac_top_builddir_sub&;t t s&@top_build_prefix@&$ac_top_build_prefix&;t t s&@srcdir@&$ac_srcdir&;t t s&@abs_srcdir@&$ac_abs_srcdir&;t t s&@top_srcdir@&$ac_top_srcdir&;t t s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t s&@builddir@&$ac_builddir&;t t s&@abs_builddir@&$ac_abs_builddir&;t t s&@abs_top_builddir@&$ac_abs_top_builddir&;t t s&@INSTALL@&$ac_INSTALL&;t t $ac_datarootdir_hack " eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$ac_tmp/subs.awk" \ >$ac_tmp/out || as_fn_error $? "could not create $ac_file" "$LINENO" 5 test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && { ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_out"; } && { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' \ "$ac_tmp/out"`; test -z "$ac_out"; } && { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable 'datarootdir' which seems to be undefined. Please make sure it is defined" >&5 printf "%s\n" "$as_me: WARNING: $ac_file contains a reference to the variable 'datarootdir' which seems to be undefined. Please make sure it is defined" >&2;} rm -f "$ac_tmp/stdin" case $ac_file in -) cat "$ac_tmp/out" && rm -f "$ac_tmp/out";; *) rm -f "$ac_file" && mv "$ac_tmp/out" "$ac_file";; esac \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; :H) # # CONFIG_HEADER # if test x"$ac_file" != x-; then { printf "%s\n" "/* $configure_input */" >&1 \ && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" } >"$ac_tmp/config.h" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 if diff "$ac_file" "$ac_tmp/config.h" >/dev/null 2>&1; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: $ac_file is unchanged" >&5 printf "%s\n" "$as_me: $ac_file is unchanged" >&6;} else rm -f "$ac_file" mv "$ac_tmp/config.h" "$ac_file" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 fi else printf "%s\n" "/* $configure_input */" >&1 \ && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" \ || as_fn_error $? "could not create -" "$LINENO" 5 fi ;; esac done # for ac_tag as_fn_exit 0 _ACEOF ac_clean_files=$ac_clean_files_save test $ac_write_fail = 0 || as_fn_error $? "write failure creating $CONFIG_STATUS" "$LINENO" 5 # configure is writing to config.log, and then calls config.status. # config.status does its own redirection, appending to config.log. # Unfortunately, on DOS this fails, as config.log is still kept open # by configure, so config.status won't be able to write to it; its # output is simply discarded. So we exec the FD to /dev/null, # effectively closing config.log, so it can be properly (re)opened and # appended to by config.status. When coming back to configure, we # need to make the FD available again. if test "$no_create" != yes; then ac_cs_success=: ac_config_status_args= test "$silent" = yes && ac_config_status_args="$ac_config_status_args --quiet" exec 5>/dev/null $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false exec 5>>config.log # Use ||, not &&, to avoid exiting from the if with $? = 1, which # would make configure fail if this is the last instruction. $ac_cs_success || as_fn_exit 1 fi if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5 printf "%s\n" "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;} fi echo "" echo "Configuration:" echo "" echo " PAM support: .............................. $enable_pam" echo " telnet support: ........................... $enable_telnet" echo " utmp support: ............................. $enable_utmp" echo " global socket directory: .................. $enable_socket_dir" echo "" echo " system screenrc location: ................. $with_system_screenrc" echo " pty mode: ................................. $with_pty_mode" echo " pty group: ................................ $with_pty_group" echo " pty on read only file system: ............. $with_pty_rofs" echo "" if test "x$enable_pam" != "xyes" then : echo "!!! WARNING !!!" echo "YOU ARE DISABLING PAM SUPPORT!" echo "FOR screen TO WORK IT WILL NEED TO RUN AS SUID root BINARY" echo "THIS CONFIGURATION IS _HIGHLY_ NOT RECOMMENDED!" echo "!!! WARNING !!!" fi screen-5.0.2/autom4te.cache/requests0000664000175000017500000001776215224432734016070 0ustar alexalex# This file was generated by Autom4te 2.72. # It contains the lists of macros which have been traced. # It can be safely removed. @request = ( bless( [ '0', 1, [ '/usr/share/autoconf' ], [ '/usr/share/autoconf/autoconf/autoconf.m4f', '/usr/share/aclocal-1.17/internal/ac-config-macro-dirs.m4', 'configure.ac' ], { 'AC_CONFIG_MACRO_DIR' => 1, 'AC_CONFIG_MACRO_DIR_TRACE' => 1, 'AC_DEFUN' => 1, 'AC_DEFUN_ONCE' => 1, 'AU_DEFUN' => 1, '_AM_AUTOCONF_VERSION' => 1, '_AM_CONFIG_MACRO_DIRS' => 1, '_m4_warn' => 1, 'include' => 1, 'm4_include' => 1, 'm4_pattern_allow' => 1, 'm4_pattern_forbid' => 1 } ], 'Autom4te::Request' ), bless( [ '1', 1, [ '/usr/share/autoconf' ], [ '/usr/share/autoconf/autoconf/autoconf.m4f', 'configure.ac' ], { 'AC_CANONICAL_BUILD' => 1, 'AC_CANONICAL_HOST' => 1, 'AC_CANONICAL_SYSTEM' => 1, 'AC_CANONICAL_TARGET' => 1, 'AC_CONFIG_AUX_DIR' => 1, 'AC_CONFIG_FILES' => 1, 'AC_CONFIG_HEADERS' => 1, 'AC_CONFIG_LIBOBJ_DIR' => 1, 'AC_CONFIG_LINKS' => 1, 'AC_CONFIG_MACRO_DIR_TRACE' => 1, 'AC_CONFIG_SUBDIRS' => 1, 'AC_DEFINE_TRACE_LITERAL' => 1, 'AC_FC_FREEFORM' => 1, 'AC_FC_PP_DEFINE' => 1, 'AC_FC_PP_SRCEXT' => 1, 'AC_FC_SRCEXT' => 1, 'AC_INIT' => 1, 'AC_LIBSOURCE' => 1, 'AC_PROG_LIBTOOL' => 1, 'AC_REQUIRE_AUX_FILE' => 1, 'AC_SUBST' => 1, 'AC_SUBST_TRACE' => 1, 'AH_OUTPUT' => 1, 'AM_AUTOMAKE_VERSION' => 1, 'AM_CONDITIONAL' => 1, 'AM_ENABLE_MULTILIB' => 1, 'AM_EXTRA_RECURSIVE_TARGETS' => 1, 'AM_GNU_GETTEXT' => 1, 'AM_GNU_GETTEXT_INTL_SUBDIR' => 1, 'AM_INIT_AUTOMAKE' => 1, 'AM_MAINTAINER_MODE' => 1, 'AM_MAKEFILE_INCLUDE' => 1, 'AM_NLS' => 1, 'AM_PATH_GUILE' => 1, 'AM_POT_TOOLS' => 1, 'AM_PROG_AR' => 1, 'AM_PROG_CC_C_O' => 1, 'AM_PROG_CXX_C_O' => 1, 'AM_PROG_F77_C_O' => 1, 'AM_PROG_FC_C_O' => 1, 'AM_PROG_LIBTOOL' => 1, 'AM_PROG_MKDIR_P' => 1, 'AM_PROG_MOC' => 1, 'AM_SILENT_RULES' => 1, 'AM_XGETTEXT_OPTION' => 1, 'GTK_DOC_CHECK' => 1, 'IT_PROG_INTLTOOL' => 1, 'LT_CONFIG_LTDL_DIR' => 1, 'LT_INIT' => 1, 'LT_SUPPORTED_TAG' => 1, '_AM_COND_ELSE' => 1, '_AM_COND_ENDIF' => 1, '_AM_COND_IF' => 1, '_AM_MAKEFILE_INCLUDE' => 1, '_AM_SUBST_NOTMAKE' => 1, '_LT_AC_TAGCONFIG' => 1, '_m4_warn' => 1, 'include' => 1, 'm4_include' => 1, 'm4_pattern_allow' => 1, 'm4_pattern_forbid' => 1, 'm4_sinclude' => 1, 'sinclude' => 1 } ], 'Autom4te::Request' ), bless( [ '2', 1, [ '/usr/share/autoconf' ], [ '/usr/share/autoconf/autoconf/autoconf.m4f', '/usr/share/autoconf/autoconf/trailer.m4', 'configure.ac' ], { 'AC_CANONICAL_BUILD' => 1, 'AC_CANONICAL_HOST' => 1, 'AC_CANONICAL_SYSTEM' => 1, 'AC_CANONICAL_TARGET' => 1, 'AC_CONFIG_AUX_DIR' => 1, 'AC_CONFIG_FILES' => 1, 'AC_CONFIG_HEADERS' => 1, 'AC_CONFIG_LIBOBJ_DIR' => 1, 'AC_CONFIG_LINKS' => 1, 'AC_CONFIG_MACRO_DIR_TRACE' => 1, 'AC_CONFIG_SUBDIRS' => 1, 'AC_DEFINE_TRACE_LITERAL' => 1, 'AC_FC_FREEFORM' => 1, 'AC_FC_PP_DEFINE' => 1, 'AC_FC_PP_SRCEXT' => 1, 'AC_FC_SRCEXT' => 1, 'AC_INIT' => 1, 'AC_LIBSOURCE' => 1, 'AC_PROG_LIBTOOL' => 1, 'AC_REQUIRE_AUX_FILE' => 1, 'AC_SUBST' => 1, 'AC_SUBST_TRACE' => 1, 'AH_OUTPUT' => 1, 'AM_AUTOMAKE_VERSION' => 1, 'AM_CONDITIONAL' => 1, 'AM_ENABLE_MULTILIB' => 1, 'AM_EXTRA_RECURSIVE_TARGETS' => 1, 'AM_GNU_GETTEXT' => 1, 'AM_GNU_GETTEXT_INTL_SUBDIR' => 1, 'AM_INIT_AUTOMAKE' => 1, 'AM_MAINTAINER_MODE' => 1, 'AM_MAKEFILE_INCLUDE' => 1, 'AM_NLS' => 1, 'AM_PATH_GUILE' => 1, 'AM_POT_TOOLS' => 1, 'AM_PROG_AR' => 1, 'AM_PROG_CC_C_O' => 1, 'AM_PROG_CXX_C_O' => 1, 'AM_PROG_F77_C_O' => 1, 'AM_PROG_FC_C_O' => 1, 'AM_PROG_LIBTOOL' => 1, 'AM_PROG_MKDIR_P' => 1, 'AM_PROG_MOC' => 1, 'AM_SILENT_RULES' => 1, 'AM_XGETTEXT_OPTION' => 1, 'GTK_DOC_CHECK' => 1, 'IT_PROG_INTLTOOL' => 1, 'LT_CONFIG_LTDL_DIR' => 1, 'LT_INIT' => 1, 'LT_SUPPORTED_TAG' => 1, '_AM_COND_ELSE' => 1, '_AM_COND_ENDIF' => 1, '_AM_COND_IF' => 1, '_AM_MAKEFILE_INCLUDE' => 1, '_AM_SUBST_NOTMAKE' => 1, '_LT_AC_TAGCONFIG' => 1, '_m4_warn' => 1, 'include' => 1, 'm4_include' => 1, 'm4_pattern_allow' => 1, 'm4_pattern_forbid' => 1, 'm4_sinclude' => 1, 'sinclude' => 1 } ], 'Autom4te::Request' ) ); screen-5.0.2/winmsgcond.h0000664000175000017500000000275215224432722013775 0ustar alexalex/* Copyright (c) 2013 * Mike Gerwitz (mtg@gnu.org) * * This file is part of GNU screen. * * GNU screen is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3, or (at your option) * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program (see the file COPYING); if not, see * . * **************************************************************** */ #ifndef SCREEN_WINMSGCOND_H #define SCREEN_WINMSGCOND_H #include /* represents a window message condition (e.g. %?)*/ typedef struct { int offset; /* offset in dest string */ bool initialized; bool state; /* conditional truth value */ bool locked; /* when set, prevents state from changing */ } WinMsgCond; /* WinMsgCond is intended to be used as an opaque type */ void wmc_init(WinMsgCond *, int); void wmc_set(WinMsgCond *); void wmc_clear(WinMsgCond *); bool wmc_is_active(const WinMsgCond *); bool wmc_is_set(const WinMsgCond *); int wmc_else(WinMsgCond *, int, bool *); int wmc_end(const WinMsgCond *, int, bool *); void wmc_deinit(WinMsgCond *); #endif screen-5.0.2/winmsgcond.c0000664000175000017500000000662015224432722013766 0ustar alexalex/* Copyright (c) 2013 * Mike Gerwitz (mtg@gnu.org) * * This file is part of GNU screen. * * GNU screen is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3, or (at your option) * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program (see the file COPYING); if not, see * . * **************************************************************** */ #include "config.h" #include "winmsgcond.h" #include #include /* Initialize new condition and set to false; can be used to re-initialize a * condition for re-use */ void wmc_init(WinMsgCond *cond, int offset) { cond->locked = false; cond->offset = offset; cond->initialized = true; wmc_clear(cond); } /* Mark condition as true */ void wmc_set(WinMsgCond *cond) { if (cond->locked) return; cond->state = true; } /* Clear condition (equivalent to non-match) */ void wmc_clear(WinMsgCond *cond) { if (cond->locked) return; cond->state = false; } /* Determine if condition is active (has been initialized and can be used) */ bool wmc_is_active(const WinMsgCond *cond) { return cond->initialized; } /* Determine if a condition is true; the result is undefined if * !wmc_active(cond) */ bool wmc_is_set(const WinMsgCond *cond) { return cond->state; } /* "else" encountered */ int wmc_else(WinMsgCond *cond, int offset, bool *changed) { assert(wmc_is_active(cond)); /* if we're already set, then there is no point in processing the "else"; * we will therefore consider the previous condition to have succeeded, so * now keep track of the start of the else so that it may be clobbered * instead of the beginning of the true condition---that is, we're accepting * the destination string up until this point */ if (wmc_is_set(cond)) { wmc_init(cond, offset); /* track this as a new condition */ cond->locked = true; /* "else" shall never succeed at this point */ /* we want to keep the string we have so far (the truth string) */ if (changed) *changed = false; return offset; } /* now that we have reached "else" and are not true, we can never be true; * discard the truth part of the string */ int prevoffset = cond->offset; cond->offset = offset; /* the "else" part must always be true at this point, because the previous * condition failed */ wmc_set(cond); cond->locked = true; if (changed) *changed = true; return prevoffset; } /* End condition and determine if string should be reset or kept---if our value * is truthful, then accept the string, otherwise reject and reset to the * position that we were initialized with */ int wmc_end(const WinMsgCond *cond, int offset, bool *changed) { bool set = wmc_is_set(cond); if (changed) *changed = !set; return (set) ? offset : cond->offset; } /* Deactivate a condition, preventing its use; this allows a single allocation * to be re-used and ignored until activated */ void wmc_deinit(WinMsgCond *cond) { cond->state = false; cond->offset = 0; cond->locked = true; cond->initialized = false; } screen-5.0.2/winmsgbuf.h0000664000175000017500000000516715224432722013631 0ustar alexalex/* Copyright (c) 2013 * Mike Gerwitz (mtg@gnu.org) * * This file is part of GNU screen. * * GNU screen is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3, or (at your option) * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program (see the file COPYING); if not, see * . * **************************************************************** */ #ifndef SCREEN_WINMSGBUF_H #define SCREEN_WINMSGBUF_H #include #include #include "screen.h" /* Default window message buffer size */ #define WINMSGBUF_SIZE MAXSTR #define MAX_WINMSG_REND 256 /* rendition changes */ /* TODO: complete truncation and rendition API */ /* Represents a working buffer for window messages */ typedef struct { char *buf; size_t size; uint64_t rend[MAX_WINMSG_REND]; int rendpos[MAX_WINMSG_REND]; int numrend; } WinMsgBuf; typedef struct { WinMsgBuf *buf; char *p; /* pointer within buffer */ /* truncation mark */ struct { /* starting position of truncation; TODO: make this size_t and remove * -1 as inactive indicator */ int pos; /* target offset percentage relative to pos and trunc operator */ uint8_t perc; /* whether to show ellipses */ bool ellip; } trunc; } WinMsgBufContext; WinMsgBuf *wmb_create(void); void wmb_reset(WinMsgBuf *); size_t wmb_expand(WinMsgBuf *, size_t); void wmb_rendadd(WinMsgBuf *, uint64_t, int); size_t wmb_size(const WinMsgBuf *); const char *wmb_contents(const WinMsgBuf *); void wmb_reset(WinMsgBuf *); void wmb_free(WinMsgBuf *); WinMsgBufContext *wmbc_create(WinMsgBuf *); void wmbc_rewind(WinMsgBufContext *); void wmbc_fastfw0(WinMsgBufContext *); void wmbc_fastfw_end(WinMsgBufContext *); void wmbc_putchar(WinMsgBufContext *, char); const char *wmbc_strncpy(WinMsgBufContext *, const char *, size_t); const char *wmbc_strcpy(WinMsgBufContext *, const char *); int wmbc_printf(WinMsgBufContext *, const char *, ...) __attribute__((format(printf,2,3))); size_t wmbc_offset(WinMsgBufContext *); size_t wmbc_bytesleft(WinMsgBufContext *); const char *wmbc_mergewmb(WinMsgBufContext *, WinMsgBuf *); const char *wmbc_finish(WinMsgBufContext *); void wmbc_free(WinMsgBufContext *); #endif screen-5.0.2/winmsgbuf.c0000664000175000017500000002172015224432722013615 0ustar alexalex/* Copyright (c) 2013 * Mike Gerwitz (mtg@gnu.org) * * This file is part of GNU screen. * * GNU screen is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3, or (at your option) * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program (see the file COPYING); if not, see * . * **************************************************************** */ #include "config.h" #include "winmsgbuf.h" #include #include #include /* Allocate and initialize to the empty string a new window message buffer. The * return value must be freed using wmbc_free. */ WinMsgBuf *wmb_create(void) { WinMsgBuf *w = malloc(sizeof(WinMsgBuf)); if (w == NULL) return NULL; w->buf = malloc(WINMSGBUF_SIZE); if (w->buf == NULL) { free(w); return NULL; } w->size = WINMSGBUF_SIZE; wmb_reset(w); return w; } /* Attempts to expand the buffer to hold at least MIN bytes. The new size of the * buffer is returned, which may be unchanged from the original size if * additional memory could not be allocated. */ size_t wmb_expand(WinMsgBuf *wmb, size_t min) { size_t size = wmb->size; if (size >= min) return size; /* keep doubling the buffer until we reach at least the requested size; this * ensures that we'll always be a power of two (so long as the original * buffer size was) and doubling will help cut down on excessive allocation * requests on large buffers */ while (size < min) { size *= 2; } void *p = realloc(wmb->buf, size); if (p == NULL) { /* reallocation failed; maybe the caller can do without? */ return wmb->size; } /* realloc already handled the free for us */ wmb->buf = p; wmb->size = size; return size; } /* Add a rendition to the buffer */ void wmb_rendadd(WinMsgBuf *wmb, uint64_t r, int offset) { /* TODO: lift arbitrary limit; dynamically allocate */ if (wmb->numrend >= MAX_WINMSG_REND) return; wmb->rend[wmb->numrend] = r; wmb->rendpos[wmb->numrend] = offset; wmb->numrend++; } /* Retrieve buffer size. This returns the total size of the buffer, not how much * has been used. */ size_t wmb_size(const WinMsgBuf *wmb) { return wmb->size; } /* Retrieve a pointer to the raw buffer contents. This should not be used to * modify the buffer. */ const char *wmb_contents(const WinMsgBuf *wmb) { return wmb->buf; } /* Initializes window buffer to the empty string; useful for re-using an * existing buffer without allocating a new one. */ void wmb_reset(WinMsgBuf *w) { *w->buf = '\0'; w->numrend = 0; } /* Deinitialize and free memory allocated to the given window buffer */ void wmb_free(WinMsgBuf *w) { free(w->buf); free(w); } /* Allocate and initialize a buffer context for the given buffer. The return * value must be freed using wmbc_free. */ WinMsgBufContext *wmbc_create(WinMsgBuf *w) { if (w == NULL) return NULL; WinMsgBufContext *c = malloc(sizeof(WinMsgBufContext)); if (c == NULL) return NULL; c->buf = w; c->p = w->buf; return c; } /* Rewind pointer to the first byte of the buffer. */ void wmbc_rewind(WinMsgBufContext *wmbc) { wmbc->p = wmbc->buf->buf; } /* Place pointer at terminating null character. */ void wmbc_fastfw0(WinMsgBufContext *wmbc) { wmbc->p += strlen(wmbc->p); } /* Place pointer just past the last byte in the buffer, ignoring terminating null * characters. The next write will trigger an expansion. */ void wmbc_fastfw_end(WinMsgBufContext *wmbc) { wmbc->p = wmbc->buf->buf + wmbc->buf->size; } /* Attempts buffer expansion and updates context pointers appropriately. The * result is true if expansion succeeded, otherwise false. */ static bool _wmbc_expand(WinMsgBufContext *wmbc, size_t size) { size_t offset = wmbc_offset(wmbc); if (wmb_expand(wmbc->buf, size) < size) { return false; } /* the buffer address may have changed; re-calculate pointer address */ wmbc->p = wmbc->buf->buf + offset; return true; } /* Sets a character at the current buffer position and increments the pointer. * The terminating null character is not retained. The buffer will be * dynamically resized as needed. */ void wmbc_putchar(WinMsgBufContext *wmbc, char c) { /* attempt to accommodate this character, but bail out silently if it cannot * fit */ if (!wmbc_bytesleft(wmbc)) { if (!_wmbc_expand(wmbc, wmbc->buf->size + 1)) { return; } } *wmbc->p++ = c; } /* Copies a string into the buffer, dynamically resizing the buffer as needed to * accommodate length N. If S is shorter than N characters in length, the * remaining bytes are filled will nulls. The context pointer is adjusted to the * terminating null byte. A pointer to the first copied character in the buffer * is returned; it shall not be used to modify the buffer. */ const char *wmbc_strncpy(WinMsgBufContext *wmbc, const char *s, size_t n) { size_t l = wmbc_bytesleft(wmbc); /* silently fail in the event that we cannot accommodate */ if (l < n) { size_t size = wmbc->buf->size + (n - l); if (!_wmbc_expand(wmbc, size)) { /* TODO: we should copy what can fit. */ return NULL; } } char *p = wmbc->p; strncpy(wmbc->p, s, n); wmbc->p += n; return p; } /* Copies a string into the buffer, dynamically resizing the buffer as needed to * accommodate the length of the string sans its terminating null byte. The * context pointer is adjusted to the the terminating null byte. A pointer to * the first copied character in the destination buffer is returned; it shall * not be used to modify the buffer. */ const char *wmbc_strcpy(WinMsgBufContext *wmbc, const char *s) { return wmbc_strncpy(wmbc, s, strlen(s)); } /* Write data to the buffer using a printf-style format string. If needed, the * buffer will be automatically expanded to accommodate the resulting string and * is therefore protected against overflows. */ int wmbc_printf(WinMsgBufContext *wmbc, const char *fmt, ...) { va_list ap; size_t n, max; /* to prevent buffer overflows, cap the number of bytes to the remaining * buffer size */ va_start(ap, fmt); max = wmbc_bytesleft(wmbc); n = vsnprintf(wmbc->p, max, fmt, ap); va_end(ap); /* more space is needed if vsnprintf returns a larger number than our max, * in which case we should accommodate by dynamically resizing the buffer and * trying again */ if (n > max) { if (!_wmbc_expand(wmbc, wmb_size(wmbc->buf) + n - max)) { /* failed to allocate additional memory; this will simply have to do */ wmbc_fastfw_end(wmbc); return max; } va_start(ap, fmt); size_t m = vsnprintf(wmbc->p, n + 1, fmt, ap); assert(m == n); /* this should never fail */ va_end(ap); } wmbc_fastfw0(wmbc); return n; } /* Retrieve the 0-indexed offset of the context pointer into the buffer */ size_t wmbc_offset(WinMsgBufContext *wmbc) { ptrdiff_t offset = wmbc->p - wmbc->buf->buf; /* when using wmbc_* functions (as one always should), the offset should * always be within the bounds of the buffer or one byte outside of it * (the latter case would require an expansion before writing) */ assert(offset > -1); assert((size_t)offset <= wmbc->buf->size); return (size_t)offset; } /* Calculate the number of bytes remaining in the buffer relative to the current * position within the buffer */ size_t wmbc_bytesleft(WinMsgBufContext *wmbc) { return wmbc->buf->size - wmbc_offset(wmbc); } /* Merges the contents of another null-terminated buffer and its renditions. The * return value is a pointer to the first character of WMB's buffer. */ const char *wmbc_mergewmb(WinMsgBufContext *wmbc, WinMsgBuf *wmb) { const char *p; size_t offset = wmbc_offset(wmbc); /* import buffer contents into our own at our current position */ assert(wmb); p = wmbc_strcpy(wmbc, wmb->buf); /* merge renditions, adjusting them to reflect their new offset */ for (int i = 0; i < wmb->numrend; i++) { wmb_rendadd(wmbc->buf, wmb->rend[i], offset + wmb->rendpos[i]); } return p; } /* Write a terminating null byte to the buffer and return a pointer to the * buffer contents. This should not be used to modify the buffer. If buffer is * full and expansion fails, then the last byte in the buffer will be replaced * with the null byte. */ const char *wmbc_finish(WinMsgBufContext *wmbc) { if (!wmbc_bytesleft(wmbc)) { size_t size = wmbc->buf->size + 1; if (wmb_expand(wmbc->buf, size) < size) { /* we must terminate the string or we may cause big problems for the * caller; overwrite the last char :x */ wmbc->p--; } } *wmbc->p = '\0'; return wmb_contents(wmbc->buf); } /* Deinitializes and frees previously allocated context. The contained buffer * must be freed separately; this function will not do so for you. */ void wmbc_free(WinMsgBufContext *c) { free(c); } screen-5.0.2/winmsg.h0000664000175000017500000000704415224432722013130 0ustar alexalex/* Copyrigth (c) 2024 * Alexander Naumov (alexander_naumov@opensuse.org) * Copyright (c) 2013 * Mike Gerwitz (mtg@gnu.org) * Copyright (c) 2010 * Juergen Weigert (jnweiger@immd4.informatik.uni-erlangen.de) * Sadrul Habib Chowdhury (sadrul@users.sourceforge.net) * Copyright (c) 2008, 2009 * Juergen Weigert (jnweiger@immd4.informatik.uni-erlangen.de) * Michael Schroeder (mlschroe@immd4.informatik.uni-erlangen.de) * Micah Cowan (micah@cowan.name) * Sadrul Habib Chowdhury (sadrul@users.sourceforge.net) * Copyright (c) 1993-2002, 2003, 2005, 2006, 2007 * Juergen Weigert (jnweiger@immd4.informatik.uni-erlangen.de) * Michael Schroeder (mlschroe@immd4.informatik.uni-erlangen.de) * Copyright (c) 1987 Oliver Laumann * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3, or (at your option) * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program (see the file COPYING); if not, see * https://www.gnu.org/licenses/, or contact Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02111-1301 USA * **************************************************************** */ #ifndef SCREEN_WINMSG_H #define SCREEN_WINMSG_H #include #include #include "window.h" #include "winmsgbuf.h" #include "winmsgcond.h" #include "backtick.h" #define RENDBUF_SIZE 128 /* max rendition byte count */ /* escape characters (alphabetical order) */ typedef enum { WINESC_HOUR = 'A', WINESC_hour = 'a', WINESC_TIME = 'C', WINESC_time = 'c', WINESC_DAY = 'D', WINESC_day = 'd', WINESC_ESC_SEEN = 'E', WINESC_FOCUS = 'F', WINESC_WFLAGS = 'f', WINESC_WIN_GROUP = 'g', WINESC_HOST = 'H', WINESC_HSTATUS = 'h', WINESC_MONTH = 'M', WINESC_month = 'm', WINESC_WIN_LOGNAME = 'N', WINESC_WIN_NUM = 'n', WINESC_WIN_COUNT = 'O', WINESC_PID = 'p', WINESC_COPY_MODE = 'P', /* copy/_P_aste mode */ WINESC_SESS_NAME = 'S', WINESC_WIN_SIZE = 's', WINESC_WIN_TTY = 'T', WINESC_WIN_TITLE = 't', WINESC_WIN_NAMES_NOCUR = 'W', WINESC_WIN_NAMES = 'w', WINESC_CMD = 'X', WINESC_CMD_ARGS = 'x', WINESC_YEAR = 'Y', WINESC_year = 'y', WINESC_REND_START = '{', WINESC_REND_END = '}', WINESC_REND_POP = '-', WINESC_COND = '?', /* start and end delimiter */ WINESC_COND_ELSE = ':', WINESC_BACKTICK = '`', WINESC_PAD = '=', WINESC_TRUNC = '<', WINESC_TRUNC_POS = '>', WINESC_WIN_CARET = '*', } WinMsgEscapeChar; /* escape sequence */ typedef struct { int num; struct { bool zero : 1; bool lng : 1; bool minus : 1; bool plus : 1; } flags; } WinMsgEsc; char *MakeWinMsg(char *, Window *, int); char *MakeWinMsgEv(WinMsgBuf *, char *, Window *, int, int, Event *, int); int AddWinMsgRend(WinMsgBuf *, const char *, uint64_t); void WindowChanged (Window *, WinMsgEscapeChar); extern WinMsgBuf *g_winmsg; #endif screen-5.0.2/winmsg.c0000664000175000017500000005456715224432722013137 0ustar alexalex/* Copyrigth (c) 2024 * Alexander Naumov (alexander_naumov@opensuse.org) * Copyright (c) 2013 * Mike Gerwitz (mtg@gnu.org) * Copyright (c) 2010 * Juergen Weigert (jnweiger@immd4.informatik.uni-erlangen.de) * Sadrul Habib Chowdhury (sadrul@users.sourceforge.net) * Copyright (c) 2008, 2009 * Juergen Weigert (jnweiger@immd4.informatik.uni-erlangen.de) * Michael Schroeder (mlschroe@immd4.informatik.uni-erlangen.de) * Micah Cowan (micah@cowan.name) * Sadrul Habib Chowdhury (sadrul@users.sourceforge.net) * Copyright (c) 1993-2002, 2003, 2005, 2006, 2007 * Juergen Weigert (jnweiger@immd4.informatik.uni-erlangen.de) * Michael Schroeder (mlschroe@immd4.informatik.uni-erlangen.de) * Copyright (c) 1987 Oliver Laumann * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3, or (at your option) * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program (see the file COPYING); if not, see * https://www.gnu.org/licenses/, or contact Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02111-1301 USA * **************************************************************** */ #include "config.h" #include "winmsg.h" #include "screen.h" #include "fileio.h" #include "help.h" #include "logfile.h" #include "mark.h" #include "process.h" #include "sched.h" /* TODO: rid global variable (has been renamed to point this out; see commit * history) */ WinMsgBuf *g_winmsg; #define CHRPAD 127 /* maximum limit on MakeWinMsgEv recursion */ #define WINMSG_RECLIMIT 10 #ifndef USE_LOCALE static const char days[] = "SunMonTueWedThuFriSat"; static const char months[] = "JanFebMarAprMayJunJulAugSepOctNovDec"; #endif /* escape char for backtick output */ #define WINMSG_BT_ESC '\005' /* redundant definition abstraction for escape character handlers; note that * a variable varadic macro name is a gcc extension and is not portable, so * we instead use two separate macros */ #define WINMSG_ESC_PARAMS \ __attribute__((unused)) WinMsgEsc *esc, \ __attribute__((unused)) char **src, \ __attribute__((unused)) WinMsgBufContext *wmbc, \ __attribute__((unused)) WinMsgCond *cond #define winmsg_esc__name(name) __WinMsgEsc##name #define winmsg_esc__def(name) static void winmsg_esc__name(name) #define winmsg_esc(name) winmsg_esc__def(name)(WINMSG_ESC_PARAMS) #define winmsg_esc_ex(name, ...) winmsg_esc__def(name)(WINMSG_ESC_PARAMS, __VA_ARGS__) #define WINMSG_ESC_ARGS &esc, &s, wmbc, cond #define WinMsgDoEsc(name) winmsg_esc__name(name)(WINMSG_ESC_ARGS) #define WinMsgDoEscEx(name, ...) winmsg_esc__name(name)(WINMSG_ESC_ARGS, __VA_ARGS__) static void _MakeWinMsgEvRec(WinMsgBufContext *, WinMsgCond *, char *, Window *, int *, int); /* TODO: remove the redundant arguments */ static char *pad_expand(WinMsgBuf *winmsg, char *buf, char *p, int numpad, int padlen) { char *pn, *pn2; int i, r; padlen = padlen - (p - buf); /* space for rent */ if (padlen < 0) padlen = 0; pn2 = pn = p + padlen; r = winmsg->numrend; while (p >= buf) { if (r && *p != CHRPAD && p - buf == winmsg->rendpos[r - 1]) { winmsg->rendpos[--r] = pn - buf; continue; } *pn-- = *p; if (*p-- == CHRPAD) { pn[1] = ' '; i = numpad > 0 ? (padlen + numpad - 1) / numpad : 0; padlen -= i; while (i-- > 0) *pn-- = ' '; numpad--; if (r && p - buf == winmsg->rendpos[r - 1]) winmsg->rendpos[--r] = pn - buf; } } return pn2; } int AddWinMsgRend(WinMsgBuf *winmsg, const char *str, uint64_t r) { if (winmsg->numrend >= MAX_WINMSG_REND || str < winmsg->buf || str >= winmsg->buf + MAXSTR) return -1; wmb_rendadd(winmsg, r, str - winmsg->buf); return 0; } winmsg_esc_ex(Wflags, Window *win) { *wmbc->p = '\0'; if (win) AddWindowFlags(wmbc->p, wmbc_bytesleft(wmbc), win); if (*wmbc->p) wmc_set(cond); wmbc_fastfw0(wmbc); } winmsg_esc(Pid) { wmbc_printf(wmbc, "%d", (esc->flags.plus && display) ? D_userpid : getpid()); } winmsg_esc_ex(Backtick, int id, Window *win, int *tick, struct timeval *now, int rec) { Backtick *bt; char *btresult; if (!(bt = bt_find_id(id))) return; /* TODO: not re-entrant; static buffer returned */ btresult = runbacktick(bt, tick, now->tv_sec); _MakeWinMsgEvRec(wmbc, cond, btresult, win, tick, rec); } winmsg_esc_ex(CopyMode, Event *ev) { if (display && ev && ev != &D_hstatusev) { /* Hack */ /* Is the layer in the current canvas in copy mode? */ Canvas *cv = (Canvas *)ev->data; if (ev == &cv->c_captev && cv->c_layer->l_layfn == &MarkLf) wmc_set(cond); } } winmsg_esc(EscSeen) { if (display && D_ESCseen) { wmc_set(cond); } } winmsg_esc_ex(Focus, Window *win, Event *ev) { /* small hack (TODO: explain.) */ if (display && ((ev && ev == &D_forecv->c_captev) || (!ev && win && win == D_fore))) esc->flags.minus ^= 1; if (esc->flags.minus) wmc_set(cond); } winmsg_esc(HostName) { if (*wmbc_strcpy(wmbc, HostName)) wmc_set(cond); } winmsg_esc_ex(Hstatus, Window *win, int *tick, int rec) { if (!win || win->w_hstatus == NULL || *win->w_hstatus == '\0') return; _MakeWinMsgEvRec(wmbc, cond, win->w_hstatus, win, tick, rec); } winmsg_esc_ex(PadOrTrunc, int *numpad, int *lastpad, int padlen) { /* TODO: encapsulate */ WinMsgBuf *winmsg = wmbc->buf; uint64_t r; wmbc_putchar(wmbc, ' '); wmbc->p--; /* TODO: temporary to work with old code */ if (esc->num || esc->flags.zero || esc->flags.plus || esc->flags.lng || (**src != WINESC_PAD)) { /* expand all pads */ if (esc->flags.minus) { esc->num = (esc->flags.plus ? *lastpad : padlen) - esc->num; if (!esc->flags.plus && padlen == 0) esc->num = wmbc->p - winmsg->buf; esc->flags.plus = 0; } else if (!esc->flags.zero) { if (**src != WINESC_PAD && esc->num == 0 && !esc->flags.plus) esc->num = 100; if (esc->num > 100) esc->num = 100; if (padlen == 0) esc->num = wmbc->p - winmsg->buf; else esc->num = (padlen - (esc->flags.plus ? *lastpad : 0)) * esc->num / 100; } if (esc->num < 0) esc->num = 0; if (esc->flags.plus) esc->num += *lastpad; if (esc->num > MAXSTR - 1) esc->num = MAXSTR - 1; if (*numpad) wmbc->p = pad_expand(winmsg, winmsg->buf, wmbc->p, *numpad, esc->num); *numpad = 0; if (wmbc->p - winmsg->buf > esc->num && !esc->flags.lng) { int left, trunc; if (wmbc->trunc.pos == -1) { wmbc->trunc.pos = *lastpad; wmbc->trunc.perc = 0; } trunc = *lastpad + wmbc->trunc.perc * (esc->num - *lastpad) / 100; if (trunc > esc->num) trunc = esc->num; if (trunc < *lastpad) trunc = *lastpad; left = wmbc->trunc.pos - trunc; if (left > wmbc->p - winmsg->buf - esc->num) left = wmbc->p - winmsg->buf - esc->num; if (left > 0) { if (left + *lastpad > wmbc->p - winmsg->buf) left = wmbc->p - winmsg->buf - *lastpad; if (wmbc->p - winmsg->buf - *lastpad - left > 0) memmove(winmsg->buf + *lastpad, winmsg->buf + *lastpad + left, wmbc->p - winmsg->buf - *lastpad - left); wmbc->p -= left; r = winmsg->numrend; while (r && winmsg->rendpos[r - 1] > *lastpad) { r--; winmsg->rendpos[r] -= left; if (winmsg->rendpos[r] < *lastpad) winmsg->rendpos[r] = *lastpad; } if (wmbc->trunc.ellip) { if (wmbc->p - winmsg->buf > *lastpad) winmsg->buf[*lastpad] = '.'; if (wmbc->p - winmsg->buf > *lastpad + 1) winmsg->buf[*lastpad + 1] = '.'; if (wmbc->p - winmsg->buf > *lastpad + 2) winmsg->buf[*lastpad + 2] = '.'; } } if (wmbc->p - winmsg->buf > esc->num) { wmbc->p = winmsg->buf + esc->num; if (wmbc->trunc.ellip) { if (esc->num - 1 >= *lastpad) wmbc->p[-1] = '.'; if (esc->num - 2 >= *lastpad) wmbc->p[-2] = '.'; if (esc->num - 3 >= *lastpad) wmbc->p[-3] = '.'; } r = winmsg->numrend; while (r && winmsg->rendpos[r - 1] > esc->num) winmsg->rendpos[--r] = esc->num; } wmbc->trunc.pos = -1; wmbc->trunc.ellip = false; if (*lastpad > wmbc->p - winmsg->buf) *lastpad = wmbc->p - winmsg->buf; } if (**src == WINESC_PAD) { while (wmbc->p - winmsg->buf < esc->num) wmbc_putchar(wmbc, ' '); *lastpad = wmbc->p - winmsg->buf; wmbc->trunc.pos = -1; wmbc->trunc.ellip = false; } } else if (padlen) { *wmbc->p = CHRPAD; /* internal pad representation */ (*numpad)++; } wmbc->p++; /* TODO: temporary; see above */ } /** * Processes rendition * * The first character of SRC is assumed to be (unverified) the opening brace * of the sequence. */ winmsg_esc(Rend) { char rbuf[RENDBUF_SIZE]; uint8_t i; uint64_t r; (*src)++; for (i = 0; i < (RENDBUF_SIZE-1); i++) { char c = (*src)[i]; if (c && c != WINESC_REND_END) rbuf[i] = c; else break; } if (((*src)[i] == WINESC_REND_END) && (wmbc->buf->numrend < MAX_WINMSG_REND)) { r = 0; rbuf[i] = '\0'; if (i != 1 || rbuf[0] != WINESC_REND_POP) r = ParseAttrColor(rbuf, 0); AddWinMsgRend(wmbc->buf, wmbc->p, r); } *src += i; } winmsg_esc(SessName) { char *session_name = strchr(SocketName, '.') + 1; if (*wmbc_strcpy(wmbc, session_name)) wmc_set(cond); } winmsg_esc_ex(TruncPos, uint8_t perc, bool ellip) { /* TODO: encapsulate */ wmbc->trunc.pos = wmbc_offset(wmbc); wmbc->trunc.perc = perc; wmbc->trunc.ellip = ellip; } winmsg_esc_ex(WinNames, const bool hide_cur, Window *win) { Window *oldfore = NULL; size_t max = wmbc_bytesleft(wmbc); if (display) { oldfore = D_fore; D_fore = win; } /* TODO: no need to enforce a limit here */ AddWindows(wmbc, max - 1, hide_cur | (esc->flags.lng ? 0 : 2) | (esc->flags.plus ? 4 : 0) | (esc->flags.minus ? 8 : 0), win ? win->w_number : -1); if (display) D_fore = oldfore; if (*wmbc->p) wmc_set(cond); wmbc_fastfw0(wmbc); } winmsg_esc_ex(WinArgv, Window *win) { if (!win || !win->w_cmdargs[0]) return; wmbc_printf(wmbc, "%s", win->w_cmdargs[0]); wmbc_fastfw0(wmbc); if (**src == WINESC_CMD_ARGS) { for (int i = 1; win->w_cmdargs[i]; i++) { wmbc_printf(wmbc, " %s", win->w_cmdargs[i]); wmbc_fastfw0(wmbc); } } } static void __WinMsgEscEsc_YEAR(WinMsgBufContext *wmbc, struct tm *tm) { wmbc_printf(wmbc, "%04d", tm->tm_year + 1900); } static void __WinMsgEscEsc_year(WinMsgBufContext *wmbc, struct tm *tm) { wmbc_printf(wmbc, "%02d", tm->tm_year % 100); } static void __WinMsgEscEsc_MONTH(WinMsgBufContext *wmbc, struct tm *tm) { #ifdef USE_LOCALE strftime(wmbc, l, (longflg ? "%B" : "%b"), tm); #else wmbc_printf(wmbc, "%3.3s", months + 3 * tm->tm_mon); #endif } static void __WinMsgEscEsc_month(WinMsgBufContext *wmbc, struct tm *tm) { wmbc_printf(wmbc, "%02d", tm->tm_mon + 1); } static void __WinMsgEscEsc_DAY(WinMsgBufContext *wmbc, struct tm *tm) { #ifdef USE_LOCALE strftime(wmbc, l, (longflg ? "%A" : "%a"), tm); #else wmbc_printf(wmbc, "%3.3s", days + 3 * tm->tm_wday); #endif } static void __WinMsgEscEsc_day(WinMsgBufContext *wmbc, struct tm *tm) { wmbc_printf(wmbc, "%02d", tm->tm_mday % 100); } static void __WinMsgEscEsc_HOUR(WinMsgBufContext *wmbc, struct tm *tm) { wmbc_printf(wmbc, tm->tm_hour >= 12 ? "PM" : "AM"); } static void __WinMsgEscEsc_hour(WinMsgBufContext *wmbc, struct tm *tm) { wmbc_printf(wmbc, tm->tm_hour >= 12 ? "pm" : "am"); } static void __WinMsgEscEsc_TIME(WinMsgBufContext *wmbc, struct tm *tm, WinMsgEsc esc) { wmbc_printf(wmbc, esc.flags.zero ? "%02d:%02d" : "%2d:%02d", (tm->tm_hour + 11) % 12 + 1, tm->tm_min); } static void __WinMsgEscEsc_time(WinMsgBufContext *wmbc, struct tm *tm, WinMsgEsc esc) { wmbc_printf(wmbc, esc.flags.zero ? "%02d:%02d" : "%2d:%02d", tm->tm_hour, tm->tm_min); } winmsg_esc_ex(WinNum, Window *win) { if (esc->num == 0) esc->num = 1; if (!win) { wmbc_printf(wmbc, "%*s", esc->num, esc->num > 1 ? "--" : "-"); } else { wmbc_printf(wmbc, "%*d", esc->num, win->w_number); } wmc_set(cond); } winmsg_esc_ex(WinCount, Window *win) { if (esc->num == 0) esc->num = 1; if (!win) { wmbc_printf(wmbc, "%*s", esc->num, esc->num > 1 ? "--" : "-"); } else { int count = 0; for (Window *w = win; w; w = w->w_prev_mru) { if (esc->flags.minus) { if (w->w_group == win->w_group && w->w_type != W_TYPE_GROUP) { count++; } } else { count++; } } wmbc_printf(wmbc, "%*d", esc->num, count); } wmc_set(cond); } winmsg_esc_ex(WinLogName, Window *win) { if (win && win->w_log && win->w_log->fp) wmbc_printf(wmbc, "%s", win->w_log->name); } winmsg_esc_ex(WinTty, Window *win) { if (win && win->w_tty[0]) wmbc_printf(wmbc, "%s", win->w_tty); } winmsg_esc_ex(WinCaret, Window *win) { if (win && win->w_tty[0]) wmbc_printf(wmbc, "^"); } winmsg_esc_ex(WinSize, Window *win) { if (!win) wmbc_printf(wmbc, "--x--"); else wmbc_printf(wmbc, "%dx%d", win->w_width, win->w_height); } winmsg_esc_ex(WinTitle, Window *win) { if (!win) return; if (*wmbc_strcpy(wmbc, win->w_title)) wmc_set(cond); } winmsg_esc_ex(WinGroup, Window *win) { if (!win || !win->w_group) return; if (*wmbc_strcpy(wmbc, win->w_group->w_title)) wmc_set(cond); } winmsg_esc_ex(Cond, int *condrend) { if (wmc_is_active(cond)) { bool chg; wmbc->p = wmbc->buf->buf + wmc_end(cond, wmbc_offset(wmbc), &chg); if (chg) wmbc->buf->numrend = *condrend; wmc_deinit(cond); return; } wmc_init(cond, wmbc_offset(wmbc)); *condrend = wmbc->buf->numrend; } winmsg_esc_ex(CondElse, int *condrend) { if (wmc_is_active(cond)) { bool chg; wmbc->p = wmbc->buf->buf + wmc_else(cond, wmbc_offset(wmbc), &chg); /* if the true branch was discarded, restore to previous rendition * state; otherwise, we're keeping it, so update the rendition state */ if (chg) wmbc->buf->numrend = *condrend; else *condrend = wmbc->buf->numrend; } } /* TODO: this is temporary until refactoring is complete and this code need not * be abstracted */ static void _MakeWinMsgEvRec(WinMsgBufContext *wmbc, WinMsgCond *cond, char *str, Window *win, int *tick, int rec) { int oldtick = *tick; WinMsgBuf *tmp = wmb_create(); if (tmp == NULL) Panic(0, "%s", strnomem); /* create message in a new buffer and merge into our own */ MakeWinMsgEv(tmp, str, win, WINMSG_BT_ESC, 0, NULL, rec + 1); if (*wmbc_mergewmb(wmbc, tmp)) wmc_set(cond); /* TODO: handle some other way; not re-entrant */ if (!*tick || oldtick < *tick) *tick = oldtick; wmb_free(tmp); } /* TODO: const char *str for safety and reassurance */ char *MakeWinMsgEv(WinMsgBuf *winmsg, char *str, Window *win, int chesc, int padlen, Event *ev, int rec) { static int tick; int qmnumrend = 0; int numpad = 0; int lastpad = 0; WinMsgBufContext *wmbc; WinMsgEsc esc; WinMsgCond *cond; struct tm *tm; struct timeval now; tm = 0; gettimeofday(&now, NULL); time_t nowsec = now.tv_sec; tm = localtime(&nowsec); /* TODO: temporary to work into existing code */ if (winmsg == NULL) { if (g_winmsg == NULL) { if ((g_winmsg = wmb_create()) == NULL) Panic(0, "%s", strnomem); } winmsg = g_winmsg; } if (rec > WINMSG_RECLIMIT) return winmsg->buf; cond = calloc(1, sizeof(WinMsgCond)); if (cond == NULL) Panic(0, "%s", strnomem); /* set to sane state (clear garbage) */ wmc_deinit(cond); /* TODO: we can get rid of this once winmsg is properly handled by caller */ if (winmsg->numrend > 0) winmsg->numrend = 0; wmb_reset(winmsg); wmbc = wmbc_create(winmsg); if (wmbc == NULL) Panic(0, "%s", strnomem); tick = 0; gettimeofday(&now, NULL); for (char *s = str; *s; s++) { if (*s != chesc) { if ((chesc == '%') && (*s == '^')) { s++; if (*s != '^' && *s >= 64) wmbc_putchar(wmbc, *s & 0x1f); continue; } wmbc_putchar(wmbc, *s); continue; } if (*++s == chesc) /* double escape ? */ continue; /* initialize escape */ if ((esc.flags.plus = (*s == '+')) != 0) s++; if ((esc.flags.minus = (*s == '-')) != 0) s++; if ((esc.flags.zero = (*s == '0')) != 0) s++; esc.num = 0; while (*s >= '0' && *s <= '9') esc.num = esc.num * 10 + (*s++ - '0'); if ((esc.flags.lng = (*s == 'L')) != 0) s++; if (!tick || tick > 3600) tick = 3600; switch (*s) { case WINESC_TIME: __WinMsgEscEsc_TIME(wmbc, tm, esc); if (!tick || tick > 60) tick = 60; break; case WINESC_time: __WinMsgEscEsc_time(wmbc, tm, esc); if (!tick || tick > 60) tick = 60; break; case WINESC_HOUR: __WinMsgEscEsc_HOUR(wmbc, tm); break; case WINESC_hour: __WinMsgEscEsc_hour(wmbc, tm); break; case WINESC_DAY: __WinMsgEscEsc_DAY(wmbc, tm); break; case WINESC_day: __WinMsgEscEsc_day(wmbc, tm); break; case WINESC_MONTH: __WinMsgEscEsc_MONTH(wmbc, tm); break; case WINESC_month: __WinMsgEscEsc_month(wmbc, tm); break; case WINESC_YEAR: __WinMsgEscEsc_YEAR(wmbc, tm); break; case WINESC_year: __WinMsgEscEsc_year(wmbc, tm); break; case WINESC_COND: WinMsgDoEscEx(Cond, &qmnumrend); break; case WINESC_COND_ELSE: WinMsgDoEscEx(CondElse, &qmnumrend); break; case WINESC_HSTATUS: WinMsgDoEscEx(Hstatus, win, &tick, rec); break; case WINESC_BACKTICK: WinMsgDoEscEx(Backtick, esc.num, win, &tick, &now, rec); break; case WINESC_CMD: case WINESC_CMD_ARGS: WinMsgDoEscEx(WinArgv, win); break; case WINESC_WIN_NAMES: case WINESC_WIN_NAMES_NOCUR: WinMsgDoEscEx(WinNames, (*s == WINESC_WIN_NAMES_NOCUR), win); break; case WINESC_WFLAGS: WinMsgDoEscEx(Wflags, win); break; case WINESC_WIN_TITLE: WinMsgDoEscEx(WinTitle, win); break; case WINESC_WIN_GROUP: WinMsgDoEscEx(WinGroup, win); break; case WINESC_REND_START: WinMsgDoEsc(Rend); break; case WINESC_HOST: WinMsgDoEsc(HostName); break; case WINESC_SESS_NAME: WinMsgDoEsc(SessName); break; case WINESC_PID: WinMsgDoEsc(Pid); break; case WINESC_FOCUS: WinMsgDoEscEx(Focus, win, ev); break; case WINESC_COPY_MODE: WinMsgDoEscEx(CopyMode, ev); break; case WINESC_ESC_SEEN: WinMsgDoEsc(EscSeen); break; case WINESC_TRUNC_POS: WinMsgDoEscEx(TruncPos, ((esc.num > 100) ? 100 : esc.num), esc.flags.lng); break; case WINESC_PAD: case WINESC_TRUNC: WinMsgDoEscEx(PadOrTrunc, &numpad, &lastpad, padlen); break; case WINESC_WIN_SIZE: WinMsgDoEscEx(WinSize, win); break; case WINESC_WIN_NUM: WinMsgDoEscEx(WinNum, win); break; case WINESC_WIN_COUNT: WinMsgDoEscEx(WinCount, win); break; case WINESC_WIN_LOGNAME: WinMsgDoEscEx(WinLogName, win); break; case WINESC_WIN_TTY: WinMsgDoEscEx(WinTty, win); break; case WINESC_WIN_CARET: WinMsgDoEscEx(WinCaret, win); break; } } if (wmc_is_active(cond) && !wmc_is_set(cond)) wmbc->p = wmbc->buf->buf + wmc_end(cond, wmbc_offset(wmbc), NULL) + 1; wmbc_putchar(wmbc, '\0' ); wmbc->p--; /* TODO: temporary to work with old code */ if (numpad) { if (padlen > MAXSTR - 1) padlen = MAXSTR - 1; pad_expand(winmsg, winmsg->buf, wmbc->p, numpad, padlen); } if (ev) { evdeq(ev); /* just in case */ ev->timeout = 0; } if (ev && tick) { now.tv_usec = 100000; if (tick == 1) now.tv_sec++; else now.tv_sec += tick - (now.tv_sec % tick); ev->timeout = (now.tv_sec * 1000 + now.tv_usec / 1000); } free(cond); wmbc_free(wmbc); return winmsg->buf; } char *MakeWinMsg(char *s, Window *win, int esc) { return MakeWinMsgEv(NULL, s, win, esc, 0, NULL, 0); } static int WindowChangedCheck(char *s, WinMsgEscapeChar what, int *hp) { int h = 0; int l; while (*s) { if (*s++ != (hp ? '%' : '\005')) continue; l = 0; s += (*s == '+'); s += (*s == '-'); while (*s >= '0' && *s <= '9') s++; if (*s == 'L') { s++; l = 0x100; } if (*s == WINESC_HSTATUS) h = 1; if (*s == (char)what || ((*s | l) == (int)what)) break; if (*s) s++; } if (hp) *hp = h; return *s ? 1 : 0; } void WindowChanged(Window *win, WinMsgEscapeChar what) { int inwstr, inhstr, inlstr; int inwstrh = 0, inhstrh = 0, inlstrh = 0; int got, ox, oy; Display *olddisplay = display; Canvas *cv; if (what == WINESC_WFLAGS) { WindowChanged(NULL, WINESC_WIN_NAMES | 0x100); WindowChanged(NULL, WINESC_WIN_NAMES_NOCUR | 0x100); } if (what) { inwstr = WindowChangedCheck(captionstring, what, &inwstrh); inhstr = WindowChangedCheck(hstatusstring, what, &inhstrh); inlstr = WindowChangedCheck(wliststr, what, &inlstrh); } else { inwstr = inhstr = 0; inlstr = 1; } if (win == NULL) { for (display = displays; display; display = display->d_next) { ox = D_x; oy = D_y; for (cv = D_cvlist; cv; cv = cv->c_next) { if (inlstr || (inlstrh && win && win->w_hstatus && *win->w_hstatus && WindowChangedCheck(win->w_hstatus, what, NULL))) WListUpdatecv(cv, NULL); win = Layer2Window(cv->c_layer); if (inwstr || (inwstrh && win && win->w_hstatus && *win->w_hstatus && WindowChangedCheck(win->w_hstatus, what, NULL))) { if (captiontop) { if (cv->c_ys - 1 >= 0) RefreshLine(cv->c_ys - 1, 0, D_width -1 , 0); } else { if (cv->c_ye + 1 < D_height) RefreshLine(cv->c_ye + 1, 0, D_width - 1, 0); } } } win = D_fore; if (inhstr || (inhstrh && win && win->w_hstatus && *win->w_hstatus && WindowChangedCheck(win->w_hstatus, what, NULL))) RefreshHStatus(); if (ox != -1 && oy != -1) GotoPos(ox, oy); } display = olddisplay; return; } if (win->w_hstatus && *win->w_hstatus && (inwstrh || inhstrh || inlstrh) && WindowChangedCheck(win->w_hstatus, what, NULL)) { inwstr |= inwstrh; inhstr |= inhstrh; inlstr |= inlstrh; } if (!inwstr && !inhstr && !inlstr) return; for (display = displays; display; display = display->d_next) { got = 0; ox = D_x; oy = D_y; for (cv = D_cvlist; cv; cv = cv->c_next) { if (inlstr) WListUpdatecv(cv, win); if (Layer2Window(cv->c_layer) != win) continue; got = 1; if (inwstr) { if (captiontop) { if (cv->c_ys -1 >= 0) RefreshLine(cv->c_ys - 1, 0, D_width - 1, 0); } else { if (cv->c_ye + 1 < D_height) RefreshLine(cv->c_ye + 1, 0, D_width - 1, 0); } } } if (got && inhstr && win == D_fore) RefreshHStatus(); if (ox != -1 && oy != -1) GotoPos(ox, oy); } display = olddisplay; } screen-5.0.2/window.h0000664000175000017500000002644415224432722013140 0ustar alexalex/* Copyright (c) 2010 * Juergen Weigert (jnweiger@immd4.informatik.uni-erlangen.de) * Sadrul Habib Chowdhury (sadrul@users.sourceforge.net) * Copyright (c) 2008, 2009 * Juergen Weigert (jnweiger@immd4.informatik.uni-erlangen.de) * Michael Schroeder (mlschroe@immd4.informatik.uni-erlangen.de) * Micah Cowan (micah@cowan.name) * Sadrul Habib Chowdhury (sadrul@users.sourceforge.net) * Copyright (c) 1993-2002, 2003, 2005, 2006, 2007 * Juergen Weigert (jnweiger@immd4.informatik.uni-erlangen.de) * Michael Schroeder (mlschroe@immd4.informatik.uni-erlangen.de) * Copyright (c) 1987 Oliver Laumann * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3, or (at your option) * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program (see the file COPYING); if not, see * https://www.gnu.org/licenses/, or contact Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02111-1301 USA * **************************************************************** * $Id$ GNU */ #ifndef SCREEN_WINDOW_H #define SCREEN_WINDOW_H #include "config.h" #include "sched.h" #include "logfile.h" #include "screen.h" #include "layer.h" #include "display.h" struct NewWindow { int StartAt; /* where to start the search for the slot */ char *aka; /* aka string */ char **args; /* argv vector */ char *dir; /* directory for chdir */ char *term; /* TERM to be set instead of "screen" */ bool aflag; bool dynamicaka; int flowflag; bool list_order; /* list order for window groups */ bool list_nested; /* show nested children in window groups */ int lflag; int histheight; int monitor; int wlock; /* default writelock setting */ int silence; bool wrap; bool Lflag; /* logging */ int slow; /* inter character milliseconds */ int gr; bool c1; int bce; int encoding; char *hstatus; char *charset; int poll_zombie_timeout; }; struct pseudowin { int p_fdpat; pid_t p_pid; int p_ptyfd; Event p_readev; Event p_writeev; char p_cmd[MAXSTR]; char p_tty[MAXSTR]; char p_inbuf[IOSIZE]; /* buffered writing to p_ptyfd */ int p_inlen; }; /* bits for fdpat: */ #define F_PMASK 0x0003 #define F_PSHIFT 2 #define F_PFRONT 0x0001 /* . */ #define F_PBACK 0x0002 /* ! */ #define F_PBOTH (F_PFRONT | F_PBACK) /* : */ #define F_UWP 0x1000 /* | */ /* The screen process ...) * ... wants to write to pseudo */ #define W_WP(w) ((w)->w_pwin && ((w)->w_pwin->p_fdpat & F_PFRONT)) /* ... wants to write to window: user writes to window * or stdout/stderr of pseudo are duplicated to window */ #define W_WW(w) (!((w)->w_pwin) || \ (((w)->w_pwin->p_fdpat & F_PMASK) == F_PBACK) || \ ((((w)->w_pwin->p_fdpat >> F_PSHIFT) & F_PMASK) == F_PBOTH) || \ ((((w)->w_pwin->p_fdpat >> (F_PSHIFT * 2)) & F_PMASK) == F_PBOTH)) /* ... wants to read from pseudowin */ #define W_RP(w) ((w)->w_pwin && ((w)->w_pwin->p_fdpat & \ ((F_PFRONT << (F_PSHIFT * 2)) | (F_PFRONT << F_PSHIFT)) )) /* ... wants to read from window */ #define W_RW(w) (!((w)->w_pwin) || ((w)->w_pwin->p_fdpat & F_PFRONT)) /* user input is written to pseudo */ #define W_UWP(w) ((w)->w_pwin && ((w)->w_pwin->p_fdpat & F_UWP)) /* pseudo output has to be stuffed in window */ #define W_PTOW(w) (\ ((w)->w_pwin->p_fdpat & F_PMASK << F_PSHIFT) == F_PBOTH << F_PSHIFT || \ ((w)->w_pwin->p_fdpat & F_PMASK << F_PSHIFT * 2) == F_PBOTH << F_PSHIFT * 2 ) /* window output has to be stuffed in pseudo */ #define W_WTOP(w) (((w)->w_pwin->p_fdpat & F_PMASK) == F_PBOTH) /* definitions for wlocktype */ #define WLOCK_OFF 0 /* all in w_userbits can write */ #define WLOCK_AUTO 1 /* who selects first, can write */ #define WLOCK_ON 2 /* user writes even if deselected */ struct paster { char *pa_pastebuf; /* this gets pasted in the window */ char *pa_pasteptr; /* pointer in pastebuf */ size_t pa_pastelen; /* bytes left to paste */ Layer *pa_pastelayer; /* layer to paste into */ Event pa_slowev; /* slowpaste event */ }; typedef struct Window Window; struct Window { Window *w_prev; /* previous window */ Window *w_next; /* next window */ Window *w_prev_mru; /* previous most recently used window */ int w_type; /* type of window */ bool w_list_order; /* MRU list order for window groups */ bool w_list_nested; /* show nested children in window groups */ Layer w_layer; /* our layer */ Layer *w_savelayer; /* the layer to keep */ int w_blocked; /* block input */ struct pseudowin *w_pwin; /* ptr to pseudo */ Display *w_pdisplay; /* display for printer relay */ Display *w_lastdisp; /* where the last input was made */ uint16_t w_number; /* window number */ Event w_readev; Event w_writeev; Event w_silenceev; /* silence event */ Event w_zombieev; /* event to try to resurrect window */ int w_poll_zombie_timeout; int w_ptyfd; /* fd of the master pty */ char w_inbuf[IOSIZE]; int w_inlen; char w_outbuf[IOSIZE]; int w_outlen; bool w_aflag; /* (-a option) */ bool w_dynamicaka; /* should we change name */ char *w_title; /* name of the window */ char *w_akachange; /* autoaka hack */ char w_akabuf[MAXSTR]; /* aka buffer */ int w_autoaka; /* autoaka hack */ Window *w_group; /* window group we belong to */ int w_intermediate; /* char used while parsing ESC-seq */ int w_args[MAXARGS]; /* emulator args */ int w_NumArgs; int w_wlock; /* WLOCK_AUTO, WLOCK_OFF, WLOCK_ON */ struct acluser *w_wlockuser; /* NULL when unlocked or user who writes */ AclBits w_userbits[ACL_BITS_PER_WIN]; AclBits w_lio_notify; /* whom to tell when lastio+seconds < time() */ AclBits w_mon_notify; /* whom to tell monitor status */ enum state_t w_state; /* parser state */ enum string_t w_StringType; struct mline *w_mlines; struct mchar w_rend; /* current rendition */ char w_FontL; /* character font GL */ char w_FontR; /* character font GR */ char w_FontE; /* character font GR locked */ int w_Charset; /* charset number GL */ int w_CharsetR; /* charset number GR */ int w_charsets[4]; /* Font = charsets[Charset] */ int w_ss; struct cursor { int on; int x, y; struct mchar Rend; int Charset; int CharsetR; int Charsets[4]; } w_saved; int w_top, w_bot; /* scrollregion */ bool w_wrap; /* autowrap */ int w_origin; /* origin mode */ bool w_insert; /* window is in insert mode */ int w_keypad; /* keypad mode */ int w_cursorkeys; /* appl. cursorkeys mode */ bool w_revvid; /* reverse video */ int w_curinv; /* cursor invisible */ int w_curvvis; /* cursor very visible */ int w_autolf; /* automatic linefeed */ char *w_hstatus; /* hardstatus line */ int w_gr; /* enable GR flag */ bool w_c1; /* enable C1 flag */ int w_decodestate; /* state of our input decoder */ int w_mbcs; /* saved char for multibytes charset */ char w_string[MAXSTR]; char *w_stringp; char *w_tabs; /* line with tabs */ int w_bell; /* bell status of this window */ int w_flow; /* flow flags */ Log *w_log; /* log to file */ int w_logsilence; /* silence in secs */ int w_monitor; /* monitor status */ int w_silencewait; /* wait for silencewait secs */ int w_silence; /* silence status (Lloyd Zusman) */ char w_norefresh; /* dont redisplay when switching to that win */ char w_xtermosc[5][2560]; /* special xterm/rxvt escapes */ int w_mouse; /* mouse mode 0,9,1000 */ int w_extmouse; /* extended mouse mode 0,1006 */ bool w_bracketed; /* bracketed paste mode */ int w_cursorstyle; /* cursor style */ int w_slowpaste; /* do careful writes to the window */ int w_histheight; /* all histbases are malloced with width * histheight */ int w_histidx; /* 0 <= histidx < histheight; where we insert lines */ int w_scrollback_height; /* number of lines of output stored, to be updated with w_histidx, w_histheight */ struct mline *w_hlines; /* history buffer */ struct paster w_paster; /* paste info */ pid_t w_pid; /* process at the other end of ptyfd */ pid_t w_deadpid; /* saved w_pid of a process that closed the ptyfd to us */ char *w_cmdargs[MAXARGS]; /* command line argument vector */ char *w_dir; /* directory for chdir */ char *w_term; /* TERM to be set instead of "screen" */ #if defined (ENABLE_UTMP) int w_lflag; /* login flag */ slot_t w_slot; /* utmp slot */ struct utmpx w_savut; /* utmp entry of this window */ #endif char w_tty[MAXSTR]; int w_zauto; Display *w_zdisplay; #ifdef ENABLE_TELNET struct sockaddr_in w_telsa; char w_telbuf[IOSIZE]; int w_telbufl; char w_telmopts[256]; char w_telropts[256]; int w_telstate; char w_telsubbuf[128]; int w_telsubidx; Event w_telconnev; #endif struct { int on; /* Is the alternate buffer currently being used? */ struct mline *mlines; int width; int height; int histheight; struct mline *hlines; int histidx; struct cursor cursor; } w_alt; Event w_destroyev; /* window destroy event */ int w_exitstatus; bool w_miflag; }; #define w_encoding w_layer.l_encoding #define w_width w_layer.l_width #define w_height w_layer.l_height #define w_x w_layer.l_x #define w_y w_layer.l_y /* definitions for w_type */ #define W_TYPE_PTY 0 #define W_TYPE_PLAIN 1 #define W_TYPE_TELNET 2 #define W_TYPE_GROUP 3 /* * Definitions for flow * 000 -(-) flow off, auto would be off * 001 +(-) flow on , auto would be off * 010 -(+) flow off, auto would be on * 011 +(+) flow on , auto would be on * 100 - flow auto, currently off * 111 + flow auto, currently on * Application controls auto_flow via TIOCPKT, if available, * else via application keypad mode. */ #define FLOW_OFF 0 #define FLOW_ON (1<<0) #define FLOW_AUTO (1<<1) #define FLOW_AUTOFLAG (1<<2) /* * WIN gives us a reference to line y of the *whole* image * where line 0 is the oldest line in our history. * y must be in whole image coordinate system, not in display. */ #define WIN(y) ((y < fore->w_histheight) ? \ &fore->w_hlines[(fore->w_histidx + y) % fore->w_histheight] \ : &fore->w_mlines[y - fore->w_histheight]) #define Layer2Window(l) ((Window *)(l)->l_bottom->l_data) int SwapWindows (int, int); int MakeWindow (struct NewWindow *); int RemakeWindow (Window *); void FreeWindow (Window *); int winexec (char **); void FreePseudowin (Window *); void nwin_compose (struct NewWindow *, struct NewWindow *, struct NewWindow *); int DoStartLog (Window *, char *, int); int ReleaseAutoWritelock (Display *, Window *); int ObtainAutoWritelock (Display *, Window *); int OpenDevice(char **, int, int *, char **); void CloseDevice (Window *); void zmodem_abort(Window *, Display *); void WindowDied (Window *, int, int); void ResetWindow (Window *); Window *GetWindowByNumber(uint16_t); #ifndef HAVE_EXECVPE #include void execvpe(char *, char **, char **); #endif /* global variables */ extern char DefaultShell[]; extern bool VerboseCreate; extern const struct LayFuncs WinLf; extern struct NewWindow nwin_undef, nwin_default, nwin_options; #endif /* SCREEN_WINDOW_H */ screen-5.0.2/window.c0000664000175000017500000013642615224432722013135 0ustar alexalex/* Copyright (c) 2010 * Juergen Weigert (jnweiger@immd4.informatik.uni-erlangen.de) * Sadrul Habib Chowdhury (sadrul@users.sourceforge.net) * Copyright (c) 2008, 2009 * Juergen Weigert (jnweiger@immd4.informatik.uni-erlangen.de) * Michael Schroeder (mlschroe@immd4.informatik.uni-erlangen.de) * Micah Cowan (micah@cowan.name) * Sadrul Habib Chowdhury (sadrul@users.sourceforge.net) * Copyright (c) 1993-2002, 2003, 2005, 2006, 2007 * Juergen Weigert (jnweiger@immd4.informatik.uni-erlangen.de) * Michael Schroeder (mlschroe@immd4.informatik.uni-erlangen.de) * Copyright (c) 1987 Oliver Laumann * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3, or (at your option) * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program (see the file COPYING); if not, see * https://www.gnu.org/licenses/, or contact Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02111-1301 USA * **************************************************************** */ #include "config.h" #include "window.h" #include #include #include #include #include #include #include #include #include "fileio.h" #include "help.h" #include "input.h" #include "mark.h" #include "misc.h" #include "process.h" #include "pty.h" #include "resize.h" #include "telnet.h" #include "termcap.h" #include "tty.h" #include "utmp.h" #include "winmsg.h" static void WinProcess(char **, size_t *); static void WinRedisplayLine(int, int, int, int); static void WinClearLine(int, int, int, int); static int WinResize(int, int); static void WinRestore(void); static int DoAutolf(char *, int *, int); static void ZombieProcess(char **, size_t *); static void win_readev_fn(Event *, void *); static void win_writeev_fn(Event *, void *); static void win_resurrect_zombie_fn(Event *, void *); static int muchpending(Window *, Event *); static void paste_slowev_fn(Event *, void *); static void pseu_readev_fn(Event *, void *); static void pseu_writeev_fn(Event *, void *); static void win_silenceev_fn(Event *, void *); static void win_destroyev_fn(Event *, void *); static int ForkWindow(Window *, char **, char *); static void zmodem_found(Window *, int, char *, int); static void zmodemFin(char *, size_t, void *); static int zmodem_parse(Window *, char *, int); bool VerboseCreate = false; /* XXX move this to user.h */ char DefaultShell[] = "/bin/sh"; #ifndef HAVE_EXECVPE static char DefaultPath[] = ":/usr/ucb:/bin:/usr/bin"; #endif struct NewWindow nwin_undef = { .StartAt = -1, .aka = NULL, .args = NULL, .dir = NULL, .term = NULL, .aflag = false, .dynamicaka = false, .flowflag = -1, .list_order = false, .list_nested = false, .lflag = -1, .histheight = -1, .monitor = -1, .wlock = -1, .silence = -1, .wrap = false, .Lflag = false, .slow = -1, .gr = -1, .c1 = false, .bce = -1, .encoding = -1, .hstatus = NULL, .charset = NULL, .poll_zombie_timeout = 0 }; struct NewWindow nwin_default = { .StartAt = 0, .aka = NULL, .args = ShellArgs, .dir = NULL, .term = screenterm, .aflag = false, .dynamicaka = true, .flowflag = FLOW_ON, .list_order = false, .list_nested = false, .lflag = 1, .histheight = DEFAULTHISTHEIGHT, .monitor = MON_OFF, .wlock = WLOCK_OFF, .silence = 0, .wrap = true, .Lflag = false, .slow = 0, .gr = 0, .c1 = true, .bce = 0, .encoding = 0, .hstatus = NULL, .charset = NULL }; struct NewWindow nwin_options; static int const_IOSIZE = IOSIZE; static int const_one = 1; void nwin_compose(struct NewWindow *def, struct NewWindow *new, struct NewWindow *res) { #define COMPOSE(x) res->x = new->x != nwin_undef.x ? new->x : def->x COMPOSE(StartAt); COMPOSE(aka); COMPOSE(args); COMPOSE(dir); COMPOSE(term); COMPOSE(aflag); COMPOSE(dynamicaka); COMPOSE(flowflag); COMPOSE(list_order); COMPOSE(list_nested); COMPOSE(lflag); COMPOSE(histheight); COMPOSE(monitor); COMPOSE(wlock); COMPOSE(silence); COMPOSE(wrap); COMPOSE(Lflag); COMPOSE(slow); COMPOSE(gr); COMPOSE(c1); COMPOSE(bce); COMPOSE(encoding); COMPOSE(hstatus); COMPOSE(charset); COMPOSE(poll_zombie_timeout); #undef COMPOSE } /***************************************************************** * * The window layer functions */ const struct LayFuncs WinLf = { WinProcess, NULL, WinRedisplayLine, WinClearLine, WinResize, WinRestore, NULL }; static int DoAutolf(char *buf, int *lenp, int fr) { char *p; int len = *lenp; int trunc = 0; for (p = buf; len > 0; p++, len--) { if (*p != '\r') continue; if (fr-- <= 0) { trunc++; len--; } if (len == 0) break; memmove(p + 1, p, len++); p[1] = '\n'; } *lenp = p - buf; return trunc; } static void WinProcess(char **bufpp, size_t *lenp) { int l2 = 0, f, *ilen, l = *lenp, trunc; char *ibuf; fore = (Window *)flayer->l_data; if (fore->w_type == W_TYPE_GROUP) { *bufpp += *lenp; *lenp = 0; return; } if (fore->w_ptyfd < 0) { /* zombie? */ ZombieProcess(bufpp, lenp); return; } /* a pending writelock is this: * fore->w_wlock == WLOCK_AUTO, fore->w_wlockuse = NULL * The user who wants to use this window next, will get the lock, if he can. */ if (display && fore->w_wlock == WLOCK_AUTO && !fore->w_wlockuser && !AclCheckPermWin(D_user, ACL_WRITE, fore)) { fore->w_wlockuser = D_user; } /* if w_wlock is set, only one user may write, else we check acls */ if (display && ((fore->w_wlock == WLOCK_OFF) ? AclCheckPermWin(D_user, ACL_WRITE, fore) : (D_user != fore->w_wlockuser))) { Msg(0, "write: permission denied (user %s)", D_user->u_name); *bufpp += *lenp; *lenp = 0; return; } #ifdef ENABLE_TELNET if (fore->w_type == W_TYPE_TELNET && TelIsline(fore) && *bufpp != fore->w_telbuf) { TelProcessLine(bufpp, lenp); return; } #endif if (W_UWP(fore)) { /* we send the user input to our pseudowin */ ibuf = fore->w_pwin->p_inbuf; ilen = &fore->w_pwin->p_inlen; f = ARRAY_SIZE(fore->w_pwin->p_inbuf) - *ilen; } else { /* we send the user input to the window */ ibuf = fore->w_inbuf; ilen = &fore->w_inlen; f = ARRAY_SIZE(fore->w_inbuf) - *ilen; } if (l > f) l = f; #ifdef ENABLE_TELNET while (l > 0) #else if (l > 0) #endif { l2 = l; memmove(ibuf + *ilen, *bufpp, l2); if (fore->w_autolf && (trunc = DoAutolf(ibuf + *ilen, &l2, f - l2))) l -= trunc; #ifdef ENABLE_TELNET if (fore->w_type == W_TYPE_TELNET && (trunc = DoTelnet(ibuf + *ilen, &l2, f - l2))) { l -= trunc; if (fore->w_autolf) continue; /* need exact value */ } #endif *ilen += l2; *bufpp += l; *lenp -= l; return; } } static void ZombieProcess(char **bufpp, size_t *lenp) { int l = *lenp; char *buf = *bufpp, b1[10], b2[10]; fore = (Window *)flayer->l_data; *bufpp += *lenp; *lenp = 0; for (; l-- > 0; buf++) { if (*(unsigned char *)buf == ZombieKey_destroy) { KillWindow(fore); return; } if (*(unsigned char *)buf == ZombieKey_resurrect) { WriteString(fore, "\r\n", 2); RemakeWindow(fore); return; } } b1[AddXChar(b1, ZombieKey_destroy)] = '\0'; b2[AddXChar(b2, ZombieKey_resurrect)] = '\0'; Msg(0, "Press %s to destroy or %s to resurrect window", b1, b2); } static void WinRedisplayLine(int y, int from, int to, int isblank) { if (y < 0) return; fore = (Window *)flayer->l_data; if (from == 0 && y > 0 && fore->w_mlines[y - 1].image[fore->w_width] == 0) LCDisplayLineWrap(&fore->w_layer, &fore->w_mlines[y], y, from, to, isblank); else LCDisplayLine(&fore->w_layer, &fore->w_mlines[y], y, from, to, isblank); } static void WinClearLine(int y, int xs, int xe, int bce) { fore = (Window *)flayer->l_data; LClearLine(flayer, y, xs, xe, bce, &fore->w_mlines[y]); } static int WinResize(int wi, int he) { fore = (Window *)flayer->l_data; ChangeWindowSize(fore, wi, he, fore->w_histheight); return 0; } static void WinRestore(void) { fore = (Window *)flayer->l_data; for (Canvas *cv = flayer->l_cvlist; cv; cv = cv->c_next) { display = cv->c_display; if (cv != D_forecv) continue; /* ChangeScrollRegion(fore->w_top, fore->w_bot); */ KeypadMode(fore->w_keypad); CursorkeysMode(fore->w_cursorkeys); SetFlow(fore->w_flow & FLOW_ON); InsertMode(fore->w_insert); ReverseVideo(fore->w_revvid); CursorVisibility(fore->w_curinv ? -1 : fore->w_curvvis); MouseMode(fore->w_mouse); ExtMouseMode(fore->w_extmouse); BracketedPasteMode(fore->w_bracketed); CursorStyle(fore->w_cursorstyle); } } /*****************************************************************/ /* * DoStartLog constructs a path for the "want to be logfile" in buf and * attempts logfopen. * * returns 0 on success. */ int DoStartLog(Window *window, char *buf, int bufsize) { int n; if (!window || !buf) return -1; strncpy(buf, MakeWinMsg(screenlogfile, window, '%'), bufsize - 1); buf[bufsize - 1] = 0; if (window->w_log != NULL) logfclose(window->w_log); if ((window->w_log = logfopen(buf, islogfile(buf) ? NULL : secfopen(buf, "a"))) == NULL) return -2; if (!logflushev.queued) { n = log_flush ? log_flush : (logtstamp_after + 4) / 5; if (n) { SetTimeout(&logflushev, n * 1000); evenq(&logflushev); } } return 0; } static void remove_window_from_list(Window *win) { if (win) { Window *tmp = win->w_next; if (win->w_prev) { win->w_prev->w_next = tmp; } else { first_window = tmp; } if (tmp) { tmp->w_prev = win->w_prev; } else { last_window = win->w_prev; } win->w_next = NULL; win->w_prev = NULL; if (win == mru_window) { mru_window = win->w_prev_mru; } else { for (Window *w = mru_window; w; w = w->w_prev_mru) { if (w->w_prev_mru == win) { w->w_prev_mru = w->w_prev_mru->w_prev_mru; break; } } } win->w_prev_mru = NULL; } } /* * helper function to insert window into window list * we insert p before win, if win == NULL we are either at the end of list or list is empty */ static void add_window_to_list(Window *p, Window *win) { if (!p) return; /* maybe we should just Panic? but we should always get window to place */ /* most recently used list */ p->w_prev_mru = mru_window; mru_window = p; /* * place the new window in proper place on window list */ if (win) { /* if we are not at the end of list, we point after insertion point */ if (win == first_window) { /* we insert at the beginning! */ first_window->w_prev = p; p->w_next = first_window; p->w_prev = NULL; first_window = p; } else { /* we insert in the middle */ p->w_next = win->w_prev->w_next; p->w_prev = win->w_prev; win->w_prev->w_next = p; win->w_prev = p; } } else { /* if win is NULL, then we are either at the end of the list or there are no windows */ win = last_window; if (win) { /* we have last window, so add new window at the end of list */ last_window->w_next = p; p->w_prev = last_window; p->w_next = NULL; last_window = p; } else { /* there are no windows */ first_window = p; last_window = p; p->w_next = NULL; p->w_prev = NULL; } } } /* * Umask & wlock are set for the user of the display, * The display d (if specified) switches to that window. */ int MakeWindow(struct NewWindow *newwin) { Window *p; int i; int f = -1; struct NewWindow nwin; int type, startat; char *TtyName; Window *win = first_window; nwin_compose(&nwin_default, newwin, &nwin); startat = nwin.StartAt; /* skip windows with lower number */ while (win && win->w_number < startat) win = win->w_next; /* if there is no free spot, look for one (we can reach end of list) */ while (win && win->w_number == startat) { win = win->w_next; startat++; } #ifdef ENABLE_TELNET if (!strcmp(nwin.args[0], "//telnet")) { type = W_TYPE_TELNET; TtyName = "telnet"; } else #endif if ((f = OpenDevice(nwin.args, nwin.lflag, &type, &TtyName)) < 0) return -1; if (type == W_TYPE_GROUP) f = -1; if ((p = calloc(1, sizeof(Window))) == NULL) { if (type == W_TYPE_PTY) ClosePTY(f); else close(f); Msg(0, "%s", strnomem); return -1; } #ifdef ENABLE_UTMP if (type != W_TYPE_PTY) nwin.lflag = 0; #endif p->w_type = type; /* save the command line so that zombies can be resurrected */ for (i = 0; nwin.args[i] && i < MAXARGS - 1; i++) p->w_cmdargs[i] = SaveStr(nwin.args[i]); p->w_cmdargs[i] = NULL; if (nwin.dir) p->w_dir = SaveStr(nwin.dir); if (nwin.term) p->w_term = SaveStr(nwin.term); p->w_number = startat; p->w_group = NULL; if (fore && fore->w_type == W_TYPE_GROUP) p->w_group = fore; else if (fore && fore->w_group) p->w_group = fore->w_group; /* * This is dangerous: without a display we use creators umask * This is intended to be useful for detached startup. * But is still better than default bits with a NULL user. */ if (NewWindowAcl(p, display ? D_user : users)) { free((char *)p); if (type == W_TYPE_PTY) ClosePTY(f); else close(f); Msg(0, "%s", strnomem); return -1; } p->w_layer.l_next = NULL; p->w_layer.l_bottom = &p->w_layer; p->w_layer.l_layfn = &WinLf; p->w_layer.l_data = (char *)p; p->w_savelayer = &p->w_layer; p->w_pdisplay = NULL; p->w_lastdisp = NULL; p->w_list_order = nwin.list_order; p->w_list_nested = nwin.list_nested; if (display && !AclCheckPermWin(D_user, ACL_WRITE, p)) p->w_wlockuser = D_user; p->w_wlock = nwin.wlock; p->w_ptyfd = f; p->w_aflag = nwin.aflag; p->w_dynamicaka = nwin.dynamicaka; p->w_flow = nwin.flowflag | ((nwin.flowflag & FLOW_AUTOFLAG) ? (FLOW_AUTO | FLOW_ON) : FLOW_AUTO); if (!nwin.aka) nwin.aka = Filename(nwin.args[0]); strncpy(p->w_akabuf, nwin.aka, ARRAY_SIZE(p->w_akabuf) - 1); if ((nwin.aka = strrchr(p->w_akabuf, '|')) != NULL) { p->w_autoaka = 0; *nwin.aka++ = 0; p->w_title = nwin.aka; p->w_akachange = nwin.aka + strlen(nwin.aka); } else p->w_title = p->w_akachange = p->w_akabuf; if (nwin.hstatus) p->w_hstatus = SaveStr(nwin.hstatus); p->w_monitor = nwin.monitor; if (p->w_monitor == MON_ON) { /* always tell all users */ for (i = 0; i < maxusercount; i++) ACLBYTE(p->w_mon_notify, i) |= ACLBIT(i); } /* * defsilence by Lloyd Zusman (zusman_lloyd@jpmorgan.com) */ p->w_silence = nwin.silence; p->w_silencewait = SilenceWait; if (p->w_silence == SILENCE_ON) { /* always tell all users */ for (i = 0; i < maxusercount; i++) ACLBYTE(p->w_lio_notify, i) |= ACLBIT(i); } p->w_slowpaste = nwin.slow; p->w_norefresh = 0; strncpy(p->w_tty, TtyName, MAXSTR - 1); if (ChangeWindowSize(p, display ? D_forecv->c_xe - D_forecv->c_xs + 1 : 80, display ? D_forecv->c_ye - D_forecv->c_ys + 1 : 24, nwin.histheight)) { FreeWindow(p); return -1; } p->w_encoding = nwin.encoding; ResetWindow(p); /* sets w_wrap, w_c1, w_gr */ if (nwin.charset) SetCharsets(p, nwin.charset); if (VerboseCreate && type != W_TYPE_GROUP) { Display *d = display; /* WriteString zaps display */ WriteString(p, ":screen (", 9); WriteString(p, p->w_title, strlen(p->w_title)); WriteString(p, "):", 2); for (f = 0; p->w_cmdargs[f]; f++) { WriteString(p, " ", 1); WriteString(p, p->w_cmdargs[f], strlen(p->w_cmdargs[f])); } WriteString(p, "\r\n", 2); display = d; } p->w_deadpid = 0; p->w_pid = 0; p->w_pwin = NULL; #ifdef ENABLE_TELNET if (type == W_TYPE_TELNET) { if (TelOpenAndConnect(p)) { FreeWindow(p); return -1; } } else #endif if (type == W_TYPE_PTY) { p->w_pid = ForkWindow(p, nwin.args, TtyName); if (p->w_pid < 0) { FreeWindow(p); return -1; } } /* * Place the new window at the head of the most-recently-used list. */ if (display && D_fore) D_other = D_fore; add_window_to_list(p, win); if (type == W_TYPE_GROUP) { SetForeWindow(p); Activate(p->w_norefresh); WindowChanged(NULL, WINESC_WIN_NAMES); WindowChanged(NULL, WINESC_WIN_NAMES_NOCUR); WindowChanged(NULL, 0); return startat; } #ifdef ENABLE_UTMP p->w_lflag = nwin.lflag; p->w_slot = (slot_t) - 1; if (nwin.lflag & 1) { p->w_slot = (slot_t) 0; if (display || (p->w_lflag & 2)) SetUtmp(p); } #ifdef CAREFULUTMP CarefulUtmp(); /* If all 've been zombies, we've had no slot */ #endif #endif /* ENABLE_UTMP */ if (nwin.Lflag) { char buf[1024]; DoStartLog(p, buf, ARRAY_SIZE(buf)); } /* Is this all where I have to init window poll timeout? */ if (nwin.poll_zombie_timeout) p->w_poll_zombie_timeout = nwin.poll_zombie_timeout; p->w_zombieev.type = EV_TIMEOUT; p->w_zombieev.data = (char *)p; p->w_zombieev.handler = win_resurrect_zombie_fn; p->w_readev.fd = p->w_writeev.fd = p->w_ptyfd; p->w_readev.type = EV_READ; p->w_writeev.type = EV_WRITE; p->w_readev.data = p->w_writeev.data = (char *)p; p->w_readev.handler = win_readev_fn; p->w_writeev.handler = win_writeev_fn; p->w_writeev.condpos = &p->w_inlen; evenq(&p->w_readev); evenq(&p->w_writeev); p->w_paster.pa_slowev.type = EV_TIMEOUT; p->w_paster.pa_slowev.data = (char *)&p->w_paster; p->w_paster.pa_slowev.handler = paste_slowev_fn; p->w_silenceev.type = EV_TIMEOUT; p->w_silenceev.data = (char *)p; p->w_silenceev.handler = win_silenceev_fn; if (p->w_silence > 0) { SetTimeout(&p->w_silenceev, p->w_silencewait * 1000); evenq(&p->w_silenceev); } p->w_destroyev.type = EV_TIMEOUT; p->w_destroyev.data = NULL; p->w_destroyev.handler = win_destroyev_fn; SetForeWindow(p); Activate(p->w_norefresh); WindowChanged(NULL, WINESC_WIN_NAMES); WindowChanged(NULL, WINESC_WIN_NAMES_NOCUR); WindowChanged(NULL, 0); return startat; } /* * Resurrect a window from Zombie state. * The command vector is therefore stored in the window structure. * Note: The terminaltype defaults to screenterm again, the current * working directory is lost. */ int RemakeWindow(Window *window) { char *TtyName; int lflag; int fd = -1; lflag = nwin_default.lflag; #ifdef ENABLE_TELNET if (!strcmp(window->w_cmdargs[0], "//telnet")) { window->w_type = W_TYPE_TELNET; TtyName = "telnet"; } else #endif { /* see above #ifdef */ if ((fd = OpenDevice(window->w_cmdargs, lflag, &window->w_type, &TtyName)) < 0) return -1; } evdeq(&window->w_destroyev); /* no re-destroy of resurrected zombie */ strncpy(window->w_tty, *TtyName ? TtyName : window->w_title, MAXSTR - 1); window->w_ptyfd = fd; window->w_readev.fd = fd; window->w_writeev.fd = fd; evenq(&window->w_readev); evenq(&window->w_writeev); if (VerboseCreate) { Display *d = display; /* WriteString zaps display */ WriteString(window, ":screen (", 9); WriteString(window, window->w_title, strlen(window->w_title)); WriteString(window, "):", 2); for (int i = 0; window->w_cmdargs[i]; i++) { WriteString(window, " ", 1); WriteString(window, window->w_cmdargs[i], strlen(window->w_cmdargs[i])); } WriteString(window, "\r\n", 2); display = d; } window->w_deadpid = 0; window->w_pid = 0; #ifdef ENABLE_TELNET if (window->w_type == W_TYPE_TELNET) { if (TelOpenAndConnect(window)) return -1; } else #endif if (window->w_type == W_TYPE_PTY) { window->w_pid = ForkWindow(window, window->w_cmdargs, TtyName); if (window->w_pid < 0) return -1; } #ifdef ENABLE_UTMP if (window->w_slot == (slot_t) 0 && (display || (window->w_lflag & 2))) SetUtmp(window); #ifdef CAREFULUTMP CarefulUtmp(); /* If all 've been zombies, we've had no slot */ #endif #endif WindowChanged(window, WINESC_WFLAGS); return window->w_number; } void CloseDevice(Window *window) { if (window->w_ptyfd < 0) { return; } switch (window->w_type) { case W_TYPE_PTY: /* pty 4 SALE */ (void)chmod(window->w_tty, 0666); (void)chown(window->w_tty, 0, 0); ClosePTY(window->w_ptyfd); break; case W_TYPE_PLAIN: CloseTTY(window->w_ptyfd); break; default: close(window->w_ptyfd); break; } window->w_ptyfd = -1; window->w_tty[0] = 0; evdeq(&window->w_readev); evdeq(&window->w_writeev); #ifdef ENABLE_TELNET evdeq(&window->w_telconnev); #endif window->w_readev.fd = window->w_writeev.fd = -1; } void FreeWindow(Window *window) { if (window->w_pwin) FreePseudowin(window); #ifdef ENABLE_UTMP RemoveUtmp(window); #endif CloseDevice(window); if (window == console_window) { TtyGrabConsole(-1, false, "free"); console_window = NULL; } if (window->w_log != NULL) logfclose(window->w_log); ChangeWindowSize(window, 0, 0, 0); if (window->w_type == W_TYPE_GROUP) { for (Window *win = mru_window; win; win = win->w_prev_mru) if (win->w_group == window) win->w_group = window->w_group; } if (window->w_hstatus) free(window->w_hstatus); for (int i = 0; window->w_cmdargs[i]; i++) free(window->w_cmdargs[i]); if (window->w_dir) free(window->w_dir); if (window->w_term) free(window->w_term); for (Display *display = displays; display; display = display->d_next) { if (display->d_other == window) display->d_other = display->d_fore && display->d_fore->w_prev_mru != window ? display->d_fore->w_prev_mru : window->w_prev_mru; if (display->d_fore == window) display->d_fore = NULL; for (Canvas *canvas = display->d_cvlist; canvas; canvas = canvas->c_next) { Layer *layer; for (layer = canvas->c_layer; layer; layer = layer->l_next) if (layer->l_layfn == &WinLf) break; if (!layer) continue; if ((Window *)layer->l_data != window) continue; if (canvas->c_layer == window->w_savelayer) window->w_savelayer = NULL; KillLayerChain(canvas->c_layer); } } if (window->w_savelayer) KillLayerChain(window->w_savelayer); for (Canvas *canvas = window->w_layer.l_cvlist; canvas; canvas = canvas->c_lnext) { canvas->c_layer = &canvas->c_blank; canvas->c_blank.l_cvlist = canvas; canvas->c_lnext = NULL; canvas->c_xoff = canvas->c_xs; canvas->c_yoff = canvas->c_ys; RethinkViewportOffsets(canvas); } window->w_layer.l_cvlist = NULL; if (flayer == &window->w_layer) flayer = NULL; LayerCleanupMemory(&window->w_layer); FreeWindowAcl(window); evdeq(&window->w_readev); /* just in case */ evdeq(&window->w_writeev); /* just in case */ evdeq(&window->w_silenceev); evdeq(&window->w_zombieev); evdeq(&window->w_destroyev); FreePaster(&window->w_paster); free((char *)window); } int OpenDevice(char **args, int lflag, int *typep, char **namep) { char *arg = args[0]; struct stat st; int fd; #ifndef ENABLE_UTMP (void)lflag; /* unused */ #endif if (!arg) return -1; if (strcmp(arg, "//group") == 0) { *typep = W_TYPE_GROUP; *namep = "telnet"; return 0; } if (strncmp(arg, "//", 2) == 0) { Msg(0, "Invalid argument '%s'", arg); return -1; } else if ((stat(arg, &st)) == 0 && S_ISCHR(st.st_mode)) { if (access(arg, R_OK | W_OK) == -1) { Msg(errno, "Cannot access line '%s' for R/W", arg); return -1; } if ((fd = OpenTTY(arg, args[1])) < 0) return -1; #ifdef ENABLE_UTMP lflag = 0; #endif *typep = W_TYPE_PLAIN; *namep = arg; } else { *typep = W_TYPE_PTY; fd = OpenPTY(namep); if (fd == -1) { Msg(0, "No more PTYs."); return -1; } #ifdef TIOCPKT { int flag = 1; if (ioctl(fd, TIOCPKT, (char *)&flag)) { Msg(errno, "TIOCPKT ioctl"); ClosePTY(fd); return -1; } } #endif /* TIOCPKT */ } (void)fcntl(fd, F_SETFL, FNBLOCK); /* * Tenebreux (zeus@ns.acadiacom.net) has Linux 1.3.70 where select * gets confused in the following condition: * Open a pty-master side, request a flush on it, then set packet * mode and call select(). Select will return a possible read, where * the one byte response to the flush can be found. Select will * thereafter return a possible read, which yields I/O error. * * If we request another flush *after* switching into packet mode, * this I/O error does not occur. We receive a single response byte * although we send two flush requests now. * * Maybe we should not flush at all. * * 10.5.96 jw. */ if (*typep == W_TYPE_PTY || *typep == W_TYPE_PLAIN) tcflush(fd, TCIOFLUSH); if (*typep != W_TYPE_PTY) return fd; #ifndef PTY_ROFS #ifdef PTY_GROUP if (chown(*namep, real_uid, PTY_GROUP) && !eff_uid) #else if (chown(*namep, real_uid, real_gid) && !eff_uid) #endif { Msg(errno, "chown tty"); if (*typep == W_TYPE_PTY) ClosePTY(fd); else close(fd); return -1; } #ifdef ENABLE_UTMP if (chmod(*namep, lflag ? TtyMode : (TtyMode & ~022)) && !eff_uid) #else if (chmod(*namep, TtyMode) && !eff_uid) #endif { Msg(errno, "chmod tty"); if (*typep == W_TYPE_PTY) ClosePTY(fd); else close(fd); return -1; } #endif return fd; } /* * Fields w_width, w_height, aflag, number (and w_tty) * are read from Window *win. No fields written. * If pwin is nonzero, filedescriptors are distributed * between win->w_tty and open(ttyn) * */ static int ForkWindow(Window *win, char **args, char *ttyn) { pid_t pid; char tebuf[MAXTERMLEN + 5 + 1]; /* MAXTERMLEN + strlen("TERM=") + '\0' */ char ebuf[20]; char shellbuf[7 + MAXPATHLEN]; char *proc; int newfd; int w = win->w_width; int h = win->w_height; int pat, wfdused; struct pseudowin *pwin = win->w_pwin; int slave = -1; #ifdef O_NOCTTY if (pty_preopen) { if ((slave = open(ttyn, O_RDWR | O_NOCTTY)) == -1) { Msg(errno, "ttyn"); return -1; } } #endif proc = *args; if (proc == NULL) { args = ShellArgs; proc = *args; } fflush(stdout); fflush(stderr); switch (pid = fork()) { case -1: Msg(errno, "fork"); break; case 0: xsignal(SIGHUP, SIG_DFL); xsignal(SIGINT, SIG_DFL); xsignal(SIGQUIT, SIG_DFL); xsignal(SIGTERM, SIG_DFL); xsignal(SIGTTIN, SIG_DFL); xsignal(SIGTTOU, SIG_DFL); #ifdef SIGXFSZ xsignal(SIGXFSZ, SIG_DFL); #endif displays = NULL; /* beware of Panic() */ ServerSocket = -1; if (setgid(real_gid) || setuid(real_uid)) Panic(errno, "Setuid/gid"); eff_uid = real_uid; eff_gid = real_gid; if (!pwin) /* ignore directory if pseudo */ if (win->w_dir && *win->w_dir && chdir(win->w_dir)) Panic(errno, "Cannot chdir to %s", win->w_dir); if (display) { brktty(D_userfd); freetty(); } else brktty(-1); if (slave != -1) { close(0); if(dup(slave) < 0) Panic(errno, "Cannot duplicate file descriptor"); close(slave); closeallfiles(win->w_ptyfd); slave = dup(0); } else closeallfiles(win->w_ptyfd); /* Close the three /dev/null descriptors */ close(0); close(1); close(2); newfd = -1; /* * distribute filedescriptors between the ttys */ pat = pwin ? pwin->p_fdpat : ((F_PFRONT << (F_PSHIFT * 2)) | (F_PFRONT << F_PSHIFT) | F_PFRONT); wfdused = 0; for (int i = 0; i < 3; i++) { if (pat & F_PFRONT << F_PSHIFT * i) { if (newfd < 0) { #ifdef O_NOCTTY if (separate_sids) newfd = open(ttyn, O_RDWR); else newfd = open(ttyn, O_RDWR | O_NOCTTY); #else newfd = open(ttyn, O_RDWR); #endif if (newfd < 0) Panic(errno, "Cannot open %s", ttyn); } else { if (dup(newfd) < 0) Panic(errno, "Cannot duplicate file descriptor"); } if (fgtty(newfd)) Msg(errno, "fgtty"); } else { if(dup(win->w_ptyfd) < 0) Panic(errno, "Cannot duplicate file descriptor"); wfdused = 1; } } if (wfdused) { /* * the pseudo window process should not be surprised with a * nonblocking filedescriptor. Poor Backend! */ if (fcntl(win->w_ptyfd, F_SETFL, 0)) Msg(errno, "Warning: clear NBLOCK fcntl failed"); } close(win->w_ptyfd); if (slave != -1) close(slave); if (newfd >= 0) { struct mode fakemode, *modep; if (display) { modep = &D_OldMode; } else { modep = &fakemode; InitTTY(modep, 0); } /* We only want echo if the users input goes to the pseudo * and the pseudo's stdout is not send to the window. */ if (pwin && (!(pat & F_UWP) || (pat & F_PBACK << F_PSHIFT))) { modep->tio.c_lflag &= ~ECHO; modep->tio.c_iflag &= ~ICRNL; } SetTTY(newfd, modep); glwz.ws_col = w; glwz.ws_row = h; (void)ioctl(newfd, TIOCSWINSZ, (char *)&glwz); /* Always turn off nonblocking mode */ (void)fcntl(newfd, F_SETFL, 0); } NewEnv[2] = MakeTermcap(display == NULL || win->w_aflag); strcpy(shellbuf, "SHELL="); strncpy(shellbuf + 6, ShellProg + (*ShellProg == '-'), ARRAY_SIZE(shellbuf) - 7); shellbuf[ARRAY_SIZE(shellbuf) - 1] = 0; NewEnv[4] = shellbuf; if (win->w_term && *win->w_term && strcmp(screenterm, win->w_term) && (strlen(win->w_term) < MAXTERMLEN)) { char *s1, *s2, tl; snprintf(tebuf, ARRAY_SIZE(tebuf), "TERM=%s", win->w_term); tl = strlen(win->w_term); NewEnv[1] = tebuf; if ((s1 = strchr(NewEnv[2], '|'))) { if ((s2 = strchr(++s1, '|'))) { if (strlen(NewEnv[2]) - (s2 - s1) + tl < 1024) { memmove(s1 + tl, s2, strlen(s2) + 1); memmove(s1, win->w_term, tl); } } } } snprintf(ebuf, ARRAY_SIZE(ebuf), "WINDOW=%d", win->w_number); NewEnv[3] = ebuf; if (*proc == '-') proc++; if (!*proc) proc = DefaultShell; execvpe(proc, args, NewEnv); Panic(errno, "Cannot exec '%s'", proc); default: break; } if (slave != -1) close(slave); return pid; } #ifndef HAVE_EXECVPE void execvpe(char *prog, char **args, char **env) { char *path = NULL; char buf[1024]; char *shargs[MAXARGS + 1]; int eaccess = 0; if (strrchr(prog, '/')) path = ""; if (!path && !(path = getenv("PATH"))) path = DefaultPath; do { char *p; for (p = buf; *path && *path != ':'; path++) if (p - buf < (int)ARRAY_SIZE(buf) - 2) *p++ = *path; if (p > buf) *p++ = '/'; if (p - buf + strlen(prog) >= ARRAY_SIZE(buf) - 1) continue; strcpy(p, prog); execve(buf, args, env); switch (errno) { case ENOEXEC: shargs[0] = DefaultShell; shargs[1] = buf; for (int i = 1; (shargs[i + 1] = args[i]) != NULL; ++i) ; execve(DefaultShell, shargs, env); return; case EACCES: eaccess = 1; break; case ENOMEM: case E2BIG: case ETXTBSY: return; } } while (*path++); if (eaccess) errno = EACCES; } #endif int winexec(char **av) { char *p, *s, *t; int r = 0, l = 0; Window *w; struct pseudowin *pwin; int type; if ((w = display ? fore : mru_window) == NULL) return -1; if (!*av || w->w_pwin) { Msg(0, "Filter running: %s", w->w_pwin ? w->w_pwin->p_cmd : "(none)"); return -1; } if (w->w_ptyfd < 0) { Msg(0, "You feel dead inside."); return -1; } if (!(pwin = calloc(1, sizeof(struct pseudowin)))) { Msg(0, "%s", strnomem); return -1; } /* allow ^a:!!./ttytest as a short form for ^a:exec !.. ./ttytest */ for (s = *av; *s == ' '; s++) ; for (p = s; *p == ':' || *p == '.' || *p == '!'; p++) ; if (*p != '|') while (*p && p > s && p[-1] == '.') p--; if (*p == '|') { l = F_UWP; p++; } if (*p) av[0] = p; else av++; t = pwin->p_cmd; for (int i = 0; i < 3; i++) { *t = (s < p) ? *s++ : '.'; switch (*t++) { case '.': case '|': l |= F_PFRONT << (i * F_PSHIFT); break; case '!': l |= F_PBACK << (i * F_PSHIFT); break; case ':': l |= F_PBOTH << (i * F_PSHIFT); break; } } if (l & F_UWP) { *t++ = '|'; if ((l & F_PMASK) == F_PFRONT) { *pwin->p_cmd = '!'; l ^= F_PFRONT | F_PBACK; } } if (!(l & F_PBACK)) l |= F_UWP; *t++ = ' '; pwin->p_fdpat = l; l = MAXSTR - 4; for (char **pp = av; *pp; pp++) { p = *pp; while (*p && l-- > 0) *t++ = *p++; if (l <= 0) break; *t++ = ' '; } *--t = '\0'; if ((pwin->p_ptyfd = OpenDevice(av, 0, &type, &t)) < 0) { free((char *)pwin); return -1; } strncpy(pwin->p_tty, t, MAXSTR - 1); w->w_pwin = pwin; if (type != W_TYPE_PTY) { FreePseudowin(w); Msg(0, "Cannot only use commands as pseudo win."); return -1; } if (!(pwin->p_fdpat & F_PFRONT)) evdeq(&w->w_readev); #ifdef TIOCPKT { int flag = 0; if (ioctl(pwin->p_ptyfd, TIOCPKT, (char *)&flag)) { Msg(errno, "TIOCPKT pwin ioctl"); FreePseudowin(w); return -1; } if (w->w_type == W_TYPE_PTY && !(pwin->p_fdpat & F_PFRONT)) { if (ioctl(w->w_ptyfd, TIOCPKT, (char *)&flag)) { Msg(errno, "TIOCPKT win ioctl"); FreePseudowin(w); return -1; } } } #endif /* TIOCPKT */ pwin->p_readev.fd = pwin->p_writeev.fd = pwin->p_ptyfd; pwin->p_readev.type = EV_READ; pwin->p_writeev.type = EV_WRITE; pwin->p_readev.data = pwin->p_writeev.data = (char *)w; pwin->p_readev.handler = pseu_readev_fn; pwin->p_writeev.handler = pseu_writeev_fn; pwin->p_writeev.condpos = &pwin->p_inlen; if (pwin->p_fdpat & (F_PFRONT << F_PSHIFT * 2 | F_PFRONT << F_PSHIFT)) evenq(&pwin->p_readev); evenq(&pwin->p_writeev); r = pwin->p_pid = ForkWindow(w, av, t); if (r < 0) FreePseudowin(w); return r; } void FreePseudowin(Window *w) { struct pseudowin *pwin = w->w_pwin; if (fcntl(w->w_ptyfd, F_SETFL, FNBLOCK)) Msg(errno, "Warning: FreePseudowin: NBLOCK fcntl failed"); #ifdef TIOCPKT if (w->w_type == W_TYPE_PTY && !(pwin->p_fdpat & F_PFRONT)) { int flag = 1; if (ioctl(w->w_ptyfd, TIOCPKT, (char *)&flag)) Msg(errno, "Warning: FreePseudowin: TIOCPKT win ioctl"); } #endif /* should be able to use CloseDevice() here */ (void)chmod(pwin->p_tty, 0666); (void)chown(pwin->p_tty, 0, 0); if (pwin->p_ptyfd >= 0) { if (w->w_type == W_TYPE_PTY) ClosePTY(pwin->p_ptyfd); else close(pwin->p_ptyfd); } evdeq(&pwin->p_readev); evdeq(&pwin->p_writeev); if (w->w_readev.condneg == &pwin->p_inlen) w->w_readev.condpos = w->w_readev.condneg = NULL; evenq(&w->w_readev); free((char *)pwin); w->w_pwin = NULL; } /* * returns 0, if the lock really has been released */ int ReleaseAutoWritelock(Display *dis, Window *w) { /* release auto writelock when user has no other display here */ if (w->w_wlock == WLOCK_AUTO && w->w_wlockuser == dis->d_user) { Display *d; for (d = displays; d; d = d->d_next) if ((d != dis) && (d->d_fore == w) && (d->d_user == dis->d_user)) break; if (!d) { w->w_wlockuser = NULL; return 0; } } return 1; } /* * returns 0, if the lock really could be obtained */ int ObtainAutoWritelock(Display *d, Window *w) { if ((w->w_wlock == WLOCK_AUTO) && !AclCheckPermWin(d->d_user, ACL_WRITE, w) && !w->w_wlockuser) { w->w_wlockuser = d->d_user; return 0; } return 1; } /********************************************************************/ static void paste_slowev_fn(Event *event, void *data) { struct paster *pa = (struct paster *)data; Window *p; (void)event; /* unused */ size_t len = 1; flayer = pa->pa_pastelayer; if (!flayer) pa->pa_pastelen = 0; if (!pa->pa_pastelen) return; p = Layer2Window(flayer); DoProcess(p, &pa->pa_pasteptr, &len, pa); pa->pa_pastelen -= 1 - len; if (pa->pa_pastelen > 0) { SetTimeout(&pa->pa_slowev, p->w_slowpaste); evenq(&pa->pa_slowev); } } static int muchpending(Window *p, Event *event) { for (Canvas *cv = p->w_layer.l_cvlist; cv; cv = cv->c_lnext) { display = cv->c_display; if (D_status == STATUS_ON_WIN && !D_status_bell) { /* wait 'til status is gone */ event->condpos = &const_one; event->condneg = (int *)&D_status; return 1; } if (D_blocked) continue; if (D_obufp - D_obuf > D_obufmax + D_blocked_fuzz) { if (D_nonblock == 0) { D_blocked = 1; continue; } event->condpos = &D_obuffree; event->condneg = &D_obuflenmax; if (D_nonblock > 0 && !D_blockedev.queued) { SetTimeout(&D_blockedev, D_nonblock); evenq(&D_blockedev); } return 1; } } return 0; } static void win_readev_fn(Event *event, void *data) { Window *p = (Window *)data; char buf[IOSIZE], *bp; int size, len; int wtop; bp = buf; size = IOSIZE; wtop = p->w_pwin && W_WTOP(p); if (wtop) { size = IOSIZE - p->w_pwin->p_inlen; if (size <= 0) { event->condpos = &const_IOSIZE; event->condneg = &p->w_pwin->p_inlen; return; } } if (p->w_layer.l_cvlist && muchpending(p, event)) return; if (!p->w_zdisplay) if (p->w_blocked) { event->condpos = &const_one; event->condneg = &p->w_blocked; return; } if (event->condpos) event->condpos = event->condneg = NULL; if ((len = p->w_outlen)) { p->w_outlen = 0; WriteString(p, p->w_outbuf, len); return; } if ((len = read(event->fd, buf, size)) <= 0) { if (errno == EINTR || errno == EAGAIN) return; #if defined(EWOULDBLOCK) && (EWOULDBLOCK != EAGAIN) if (errno == EWOULDBLOCK) return; #endif WindowDied(p, 0, 0); return; } #ifdef TIOCPKT if (p->w_type == W_TYPE_PTY) { if (buf[0]) { if (buf[0] & TIOCPKT_NOSTOP) WNewAutoFlow(p, 0); if (buf[0] & TIOCPKT_DOSTOP) WNewAutoFlow(p, 1); } bp++; len--; } #endif #ifdef ENABLE_TELNET if (p->w_type == W_TYPE_TELNET) len = TelIn(p, bp, len, buf + ARRAY_SIZE(buf) - (bp + len)); #endif if (len == 0) return; if (zmodem_mode && zmodem_parse(p, bp, len)) return; if (wtop) { memmove(p->w_pwin->p_inbuf + p->w_pwin->p_inlen, bp, len); p->w_pwin->p_inlen += len; } LayPause(&p->w_layer, 1); WriteString(p, bp, len); LayPause(&p->w_layer, 0); return; } static void win_resurrect_zombie_fn(Event *event, void *data) { Window *p = (Window *)data; (void)event; /* unused */ /* Already reconnected? */ if (p->w_deadpid != p->w_pid) return; WriteString(p, "\r\n", 2); RemakeWindow(p); } static void win_writeev_fn(Event *event, void *data) { Window *p = (Window *)data; int len; if (p->w_inlen) { if ((len = write(event->fd, p->w_inbuf, p->w_inlen)) <= 0) len = p->w_inlen; /* dead window */ if (p->w_miflag) { /* don't loop if not needed */ for (Window *win = mru_window; win; win = win->w_prev_mru) { if (win != p && win->w_miflag) write(win->w_ptyfd, p->w_inbuf, p->w_inlen); } } if ((p->w_inlen -= len)) memmove(p->w_inbuf, p->w_inbuf + len, p->w_inlen); } if (p->w_paster.pa_pastelen && !p->w_slowpaste) { struct paster *pa = &p->w_paster; flayer = pa->pa_pastelayer; if (flayer) DoProcess(p, &pa->pa_pasteptr, &pa->pa_pastelen, pa); } return; } static void pseu_readev_fn(Event *event, void *data) { Window *p = (Window *)data; char buf[IOSIZE]; int size, ptow, len; size = IOSIZE; ptow = W_PTOW(p); if (ptow) { size = IOSIZE - p->w_inlen; if (size <= 0) { event->condpos = &const_IOSIZE; event->condneg = &p->w_inlen; return; } } if (p->w_layer.l_cvlist && muchpending(p, event)) return; if (p->w_blocked) { event->condpos = &const_one; event->condneg = &p->w_blocked; return; } if (event->condpos) event->condpos = event->condneg = NULL; if ((len = p->w_outlen)) { p->w_outlen = 0; WriteString(p, p->w_outbuf, len); return; } if ((len = read(event->fd, buf, size)) <= 0) { if (errno == EINTR || errno == EAGAIN) return; #if defined(EWOULDBLOCK) && (EWOULDBLOCK != EAGAIN) if (errno == EWOULDBLOCK) return; #endif FreePseudowin(p); return; } /* no packet mode on pseudos! */ if (ptow) { memmove(p->w_inbuf + p->w_inlen, buf, len); p->w_inlen += len; } WriteString(p, buf, len); return; } static void pseu_writeev_fn(Event *event, void *data) { Window *p = (Window *)data; struct pseudowin *pw = p->w_pwin; int len; if (pw->p_inlen == 0) return; if ((len = write(event->fd, pw->p_inbuf, pw->p_inlen)) <= 0) len = pw->p_inlen; /* dead pseudo */ if ((p->w_pwin->p_inlen -= len)) memmove(p->w_pwin->p_inbuf, p->w_pwin->p_inbuf + len, p->w_pwin->p_inlen); } static void win_silenceev_fn(Event *event, void *data) { Window *p = (Window *)data; Canvas *cv; (void)event; /* unused */ for (display = displays; display; display = display->d_next) { for (cv = D_cvlist; cv; cv = cv->c_next) if (cv->c_layer->l_bottom == &p->w_layer) break; if (cv) continue; /* user already sees window */ if (!(ACLBYTE(p->w_lio_notify, D_user->u_id) & ACLBIT(D_user->u_id))) continue; Msg(0, "Window %d: silence for %d seconds", p->w_number, p->w_silencewait); p->w_silence = SILENCE_FOUND; WindowChanged(p, WINESC_WFLAGS); } } static void win_destroyev_fn(Event *event, void *data) { Window *p = (Window *)event->data; (void)data; /* unused */ WindowDied(p, p->w_exitstatus, 1); } static int zmodem_parse(Window *p, char *bp, int len) { char *b2 = bp; for (int i = 0; i < len; i++, b2++) { if (p->w_zauto == 0) { for (; i < len; i++, b2++) if (*b2 == 030) break; if (i == len) break; if (i > 1 && b2[-1] == '*' && b2[-2] == '*') p->w_zauto = 3; continue; } if (p->w_zauto > 5 || *b2 == "**\030B00"[p->w_zauto] || (p->w_zauto == 5 && *b2 == '1') || (p->w_zauto == 5 && p->w_zdisplay && *b2 == '8')) { if (++p->w_zauto < 6) continue; if (p->w_zauto == 6) p->w_zauto = 0; if (!p->w_zdisplay) { if (i > 6) WriteString(p, bp, i + 1 - 6); WriteString(p, "\r\n", 2); zmodem_found(p, *b2 == '1', b2 + 1, len - i - 1); return 1; } else if (p->w_zauto == 7 || *b2 == '8') { int se = p->w_zdisplay->d_blocked == 2 ? 'O' : '\212'; for (; i < len; i++, b2++) if (*b2 == se) break; if (i < len) { zmodem_abort(p, NULL); D_blocked = 0; D_readev.condpos = D_readev.condneg = NULL; while (len-- > 0) AddChar(*bp++); Flush(0); Activate(D_fore ? D_fore->w_norefresh : 0); return 1; } p->w_zauto = 6; } } else p->w_zauto = *b2 == '*' ? (p->w_zauto == 2 ? 2 : 1) : 0; } if (p->w_zauto == 0 && bp[len - 1] == '*') p->w_zauto = len > 1 && bp[len - 2] == '*' ? 2 : 1; if (p->w_zdisplay) { display = p->w_zdisplay; while (len-- > 0) AddChar(*bp++); return 1; } return 0; } static void zmodemFin(char *buf, size_t len, void *data) { char *s; size_t l; (void)data; /* unused */ if (len) RcLine(buf, strlen(buf) + 1); else { s = "\030\030\030\030\030\030\030\030\030\030"; l = strlen(s); LayProcess(&s, &l); } } static void zmodem_found(Window *p, int send, char *bp, int len) { char *s; size_t n; /* check for abort sequence */ n = 0; for (int i = 0; i < len; i++) if (bp[i] != 030) n = 0; else if (++n > 4) return; if (zmodem_mode == 3 || (zmodem_mode == 1 && p->w_type != W_TYPE_PLAIN)) { Display *d, *olddisplay; olddisplay = display; d = p->w_lastdisp; if (!d || d->d_fore != p) for (d = displays; d; d = d->d_next) if (d->d_fore == p) break; if (!d && p->w_layer.l_cvlist) d = p->w_layer.l_cvlist->c_display; if (!d) d = displays; if (!d) return; display = d; RemoveStatus(); p->w_zdisplay = display; D_blocked = 2 + send; flayer = &p->w_layer; ZmodemPage(); display = d; evdeq(&D_blockedev); D_readev.condpos = &const_IOSIZE; D_readev.condneg = &p->w_inlen; ClearAll(); GotoPos(0, 0); SetRendition(&mchar_blank); AddStr("Zmodem active\r\n\r\n"); AddStr(send ? "**\030B01" : "**\030B00"); while (len-- > 0) AddChar(*bp++); display = olddisplay; return; } flayer = &p->w_layer; Input(":", MAXSTR, INP_COOKED, zmodemFin, NULL, 0); s = send ? zmodem_sendcmd : zmodem_recvcmd; n = strlen(s); LayProcess(&s, &n); } void zmodem_abort(Window *p, Display *d) { Layer *oldflayer = flayer; if (p) { if (p->w_savelayer && p->w_savelayer->l_next) { if (oldflayer == p->w_savelayer) oldflayer = flayer->l_next; flayer = p->w_savelayer; ExitOverlayPage(); } p->w_zdisplay = NULL; p->w_zauto = 0; LRefreshAll(&p->w_layer, 0); } if (d) { display = d; D_blocked = 0; D_readev.condpos = D_readev.condneg = NULL; Activate(D_fore ? D_fore->w_norefresh : 0); } flayer = oldflayer; } int SwapWindows(int old, int dest) { Window *win_a, *win_b; Window *tmp; if (dest < 0) { Msg(0, "Given window position is invalid."); return 0; } if (old == dest) return 1; win_a = GetWindowByNumber(old); win_b = GetWindowByNumber(dest); remove_window_from_list(win_a); win_a->w_number = dest; if (win_b) { remove_window_from_list(win_b); win_b->w_number = old; } tmp = first_window; while (tmp && tmp->w_number < win_a->w_number) tmp = tmp->w_next; add_window_to_list(win_a, tmp); if (win_b) { tmp = first_window; while (tmp && tmp->w_number < win_b->w_number) tmp = tmp->w_next; add_window_to_list(win_b, tmp); } /* exchange the acls for these windows. */ #ifdef ENABLE_UTMP /* exchange the utmp-slots for these windows */ if ((win_a->w_slot != (slot_t) - 1) && (win_a->w_slot != (slot_t) 0)) { RemoveUtmp(win_a); SetUtmp(win_a); } if (win_b && (win_b->w_slot != (slot_t) - 1) && (win_b->w_slot != (slot_t) 0)) { display = win_a->w_layer.l_cvlist ? win_a->w_layer.l_cvlist->c_display : NULL; RemoveUtmp(win_b); SetUtmp(win_b); } #endif WindowChanged(win_a, WINESC_WIN_NUM); WindowChanged(NULL, WINESC_WIN_NAMES); WindowChanged(NULL, WINESC_WIN_NAMES_NOCUR); WindowChanged(NULL, 0); return 1; } void WindowDied(Window *p, int wstat, int wstat_valid) { int killit = 0; if (p->w_destroyev.data == (char *)p) { wstat = p->w_exitstatus; wstat_valid = 1; evdeq(&p->w_destroyev); p->w_destroyev.data = NULL; } if (!wstat_valid && p->w_pid > 0) { /* EOF on file descriptor. The process is probably also dead. * try a waitpid */ if (waitpid(p->w_pid, &wstat, WNOHANG | WUNTRACED) == p->w_pid) { p->w_pid = 0; wstat_valid = 1; } } if (ZombieKey_destroy && ZombieKey_onerror && wstat_valid && WIFEXITED(wstat) && WEXITSTATUS(wstat) == 0) killit = 1; if (ZombieKey_destroy && !killit) { char buf[100], *s, reason[60]; time_t now; if (wstat_valid) { if (WIFEXITED(wstat)) if (WEXITSTATUS(wstat)) sprintf(reason, "terminated with exit status %d", WEXITSTATUS(wstat)); else sprintf(reason, "terminated normally"); else if (WIFSIGNALED(wstat)) sprintf(reason, "terminated with signal %d%s", WTERMSIG(wstat), #ifdef WCOREDUMP WCOREDUMP(wstat) ? " (core file generated)" : ""); #else ""); #endif } else sprintf(reason, "detached from window"); (void)time(&now); s = ctime(&now); if (s && *s) s[strlen(s) - 1] = '\0'; #ifdef ENABLE_UTMP if (p->w_slot != (slot_t) 0 && p->w_slot != (slot_t) - 1) { RemoveUtmp(p); p->w_slot = NULL; /* "detached" */ } #endif CloseDevice(p); p->w_deadpid = p->w_pid; p->w_pid = 0; ResetWindow(p); /* p->w_y = p->w_bot; */ p->w_y = MFindUsedLine(p, p->w_bot, 1); sprintf(buf, "\n\r=== Command %s (%s) ===", reason, s ? s : "?"); WriteString(p, buf, strlen(buf)); if (p->w_poll_zombie_timeout) { SetTimeout(&p->w_zombieev, p->w_poll_zombie_timeout * 1000); evenq(&p->w_zombieev); } WindowChanged(p, WINESC_WFLAGS); } else KillWindow(p); #ifdef ENABLE_UTMP CarefulUtmp(); #endif } void ResetWindow(Window *win) { win->w_wrap = nwin_default.wrap; win->w_origin = 0; win->w_insert = false; win->w_revvid = 0; win->w_mouse = 0; win->w_bracketed = false; win->w_cursorstyle = 0; win->w_curinv = 0; win->w_curvvis = 0; win->w_autolf = 0; win->w_keypad = 0; win->w_cursorkeys = 0; win->w_top = 0; win->w_bot = win->w_height - 1; win->w_saved.on = 0; win->w_x = win->w_y = 0; win->w_state = LIT; win->w_StringType = NONE; memset(win->w_tabs, 0, win->w_width); for (int i = 8; i < win->w_width; i += 8) win->w_tabs[i] = 1; win->w_rend = mchar_null; ResetCharsets(win); } Window *GetWindowByNumber(uint16_t n) { if (first_window->w_number <= n && n <= last_window->w_number) { Window *w; if ((first_window->w_number + (last_window->w_number - first_window->w_number) / 2) > n) { /* look from the start */ w = first_window; while (w && w->w_number < n) w = w->w_next; } else { /* look from the end */ w = last_window; while (w && w->w_number > n) w = w->w_prev; } if (w && w->w_number == n) return w; } return NULL; } screen-5.0.2/viewport.h0000664000175000017500000000366615224432722013511 0ustar alexalex/* Copyright (c) 2008, 2009 * Juergen Weigert (jnweiger@immd4.informatik.uni-erlangen.de) * Michael Schroeder (mlschroe@immd4.informatik.uni-erlangen.de) * Micah Cowan (micah@cowan.name) * Sadrul Habib Chowdhury (sadrul@users.sourceforge.net) * Copyright (c) 1993-2002, 2003, 2005, 2006, 2007 * Juergen Weigert (jnweiger@immd4.informatik.uni-erlangen.de) * Michael Schroeder (mlschroe@immd4.informatik.uni-erlangen.de) * Copyright (c) 1987 Oliver Laumann * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3, or (at your option) * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program (see the file COPYING); if not, see * https://www.gnu.org/licenses/, or contact Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02111-1301 USA * **************************************************************** * $Id$ GNU */ #ifndef SCREEN_VIEWPORT_H #define SCREEN_VIEWPORT_H #include "canvas.h" typedef struct Viewport Viewport; struct Viewport { Viewport *v_next; /* next vp on canvas */ Canvas *v_canvas; /* back pointer to canvas */ int v_xoff; /* layer x offset on display */ int v_yoff; /* layer y offset on display */ int v_xs; /* vp upper left */ int v_xe; /* vp upper right */ int v_ys; /* vp lower left */ int v_ye; /* vp lower right */ }; int RethinkDisplayViewports (void); void RethinkViewportOffsets (Canvas *); #endif /* SCREEN_VIEWPORT_H */ screen-5.0.2/viewport.c0000664000175000017500000000524415224432722013476 0ustar alexalex/* Copyright (c) 2008, 2009 * Juergen Weigert (jnweiger@immd4.informatik.uni-erlangen.de) * Michael Schroeder (mlschroe@immd4.informatik.uni-erlangen.de) * Micah Cowan (micah@cowan.name) * Sadrul Habib Chowdhury (sadrul@users.sourceforge.net) * Copyright (c) 1993-2002, 2003, 2005, 2006, 2007 * Juergen Weigert (jnweiger@immd4.informatik.uni-erlangen.de) * Michael Schroeder (mlschroe@immd4.informatik.uni-erlangen.de) * Copyright (c) 1987 Oliver Laumann * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3, or (at your option) * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program (see the file COPYING); if not, see * https://www.gnu.org/licenses/, or contact Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02111-1301 USA * **************************************************************** */ #include "viewport.h" #include "screen.h" int RethinkDisplayViewports(void) { Viewport *viewport, *viewport_next; /* free old viewports */ for (Canvas *canvas = display->d_cvlist; canvas; canvas = canvas->c_next) { for (viewport = canvas->c_vplist; viewport; viewport = viewport_next) { viewport_next = viewport->v_next; memset((char *)viewport, 0, sizeof(Viewport)); free(viewport); } canvas->c_vplist = NULL; } display->d_vpxmin = -1; display->d_vpxmax = -1; for (Canvas *canvas = display->d_cvlist; canvas; canvas = canvas->c_next) { if ((viewport = malloc(sizeof(Viewport))) == NULL) { return -1; } viewport->v_canvas = canvas; viewport->v_xs = canvas->c_xs; viewport->v_ys = canvas->c_ys; viewport->v_xe = canvas->c_xe; viewport->v_ye = canvas->c_ye; viewport->v_xoff = canvas->c_xoff; viewport->v_yoff = canvas->c_yoff; viewport->v_next = canvas->c_vplist; canvas->c_vplist = viewport; if (canvas->c_xs < display->d_vpxmin || display->d_vpxmin == -1) { display->d_vpxmin = canvas->c_xs; } if (canvas->c_xe > display->d_vpxmax || display->d_vpxmax == -1) { display->d_vpxmax = canvas->c_xe; } } return 0; } void RethinkViewportOffsets(Canvas *canvas) { for (Viewport *viewport = canvas->c_vplist; viewport; viewport = viewport->v_next) { viewport->v_xoff = canvas->c_xoff; viewport->v_yoff = canvas->c_yoff; } } screen-5.0.2/utmp.h0000664000175000017500000000066615224432722012614 0ustar alexalex#ifndef SCREEN_UTMP_H #define SCREEN_UTMP_H #include "config.h" #include "window.h" #ifdef ENABLE_UTMP void InitUtmp (void); void RemoveLoginSlot (void); void RestoreLoginSlot (void); int SetUtmp (Window *); int RemoveUtmp (Window *); #endif /* ENABLE_UTMP */ void SlotToggle (bool); #ifdef CAREFULUTMP void CarefulUtmp (void); #else # define CarefulUtmp() /* nothing */ #endif /* CAREFULUTMP */ #endif /* SCREEN_UTMP_H */ screen-5.0.2/utmp.c0000664000175000017500000002423015224432722012600 0ustar alexalex/* Copyright (c) 2008, 2009 * Juergen Weigert (jnweiger@immd4.informatik.uni-erlangen.de) * Michael Schroeder (mlschroe@immd4.informatik.uni-erlangen.de) * Micah Cowan (micah@cowan.name) * Sadrul Habib Chowdhury (sadrul@users.sourceforge.net) * Copyright (c) 1993-2002, 2003, 2005, 2006, 2007 * Juergen Weigert (jnweiger@immd4.informatik.uni-erlangen.de) * Michael Schroeder (mlschroe@immd4.informatik.uni-erlangen.de) * Copyright (c) 1987 Oliver Laumann * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3, or (at your option) * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program (see the file COPYING); if not, see * https://www.gnu.org/licenses/, or contact Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02111-1301 USA * **************************************************************** */ #include "config.h" #include "utmp.h" #include #include #include #include #include #include "screen.h" #ifdef HAVE_UTEMPTER #include #endif #include "misc.h" #include "tty.h" #include "winmsg.h" /* * we have a suid-root helper app that changes the utmp for us * (won't work for login-slots) */ #if defined(HAVE_UTEMPTER) #define UTMP_HELPER #endif #ifdef ENABLE_UTMP static slot_t TtyNameSlot(char *); static void makeuser(struct utmpx *, char *, char *, pid_t); static void makedead(struct utmpx *); static int pututslot(slot_t, struct utmpx *, char *, Window *); static struct utmpx *getutslot(slot_t); static int utmpok; static char UtmpName[] = UTMPXFILE; #ifndef UTMP_HELPER static int utmpfd = -1; #endif #undef D_loginhost #define D_loginhost D_utmp_logintty.ut_host #if !defined(HAVE_UT_HOST) #undef D_loginhost #define D_loginhost (NULL) #endif #endif /* ENABLE_UTMP */ /* * SlotToggle - modify the utmp slot of the fore window. * * how == true try to set a utmp slot. * how == false try to withdraw a utmp slot. * * w_slot = -1 window not logged in. * w_slot = 0 window not logged in, but should be logged in. * (unable to write utmp, or detached). */ #ifndef ENABLE_UTMP void SlotToggle(bool how) { (void)how; /* unused */ #ifdef UTMPXFILE Msg(0, "Unable to modify %s.\n", UTMPXFILE); #else Msg(0, "Unable to modify utmp-database.\n"); #endif } #endif #ifdef ENABLE_UTMP void SlotToggle(bool how) { if (fore->w_type != W_TYPE_PTY) { Msg(0, "Can only work with normal windows.\n"); return; } if (how) { if ((fore->w_slot == (slot_t) - 1) || (fore->w_slot == (slot_t) 0)) { if (SetUtmp(fore) == 0) Msg(0, "This window is now logged in."); else Msg(0, "This window should now be logged in."); WindowChanged(fore, WINESC_WFLAGS); } else Msg(0, "This window is already logged in."); } else { if (fore->w_slot == (slot_t) - 1) Msg(0, "This window is already logged out\n"); else if (fore->w_slot == (slot_t) 0) { Msg(0, "This window is not logged in."); fore->w_slot = (slot_t) - 1; } else { RemoveUtmp(fore); if (fore->w_slot != (slot_t) - 1) Msg(0, "What? Cannot remove Utmp slot?"); else Msg(0, "This window is no longer logged in."); #ifdef CAREFULUTMP CarefulUtmp(); #endif WindowChanged(fore, WINESC_WFLAGS); } } } #ifdef CAREFULUTMP /* CAREFULUTMP: goodie for paranoid sysadmins: always leave one * window logged in */ void CarefulUtmp() { Window *p; if (!mru_window) /* hopeless */ return; for (p = mru_window; p; p = p->w_prev_mru) if (p->w_ptyfd >= 0 && p->w_slot != (slot_t)-1) return; /* found one, nothing to do */ for (p = mru_window; p; p = p->w_prev_mru) if (p->w_ptyfd >= 0) /* no zombies please */ break; if (!p) return; /* really hopeless */ SetUtmp(p); Msg(0, "Window %d is now logged in.\n", p->w_number); } #endif /* CAREFULUTMP */ void InitUtmp(void) { #ifndef UTMP_HELPER if ((utmpfd = open(UtmpName, O_RDWR)) == -1) { if (errno != EACCES) Msg(errno, "%s", UtmpName); utmpok = 0; return; } close(utmpfd); /* it was just a test */ utmpfd = -1; #endif /* UTMP_HELPER */ utmpok = 1; } /* * the utmp entry for tty is located and removed. * it is stored in D_utmp_logintty. */ void RemoveLoginSlot(void) { struct utmpx u, *uu; D_loginslot = TtyNameSlot(D_usertty); if (D_loginslot == (slot_t) 0 || D_loginslot == (slot_t) - 1) return; #ifdef UTMP_HELPER if (eff_uid) /* helpers can't do login slots. sigh. */ #else if (!utmpok) #endif { D_loginslot = NULL; } else { if ((uu = getutslot(D_loginslot)) == NULL) { D_loginslot = NULL; } else { D_utmp_logintty = *uu; u = *uu; makedead(&u); if (pututslot(D_loginslot, &u, NULL, NULL) == 0) D_loginslot = NULL; } } if (D_loginslot == (slot_t) 0) { /* couldn't remove slot, do a 'mesg n' at least. */ struct stat stb; char *tty; D_loginttymode = 0; if ((tty = GetPtsPathOrSymlink(D_userfd)) && stat(tty, &stb) == 0 && stb.st_uid == real_uid && !CheckTtyname(tty) && ((int)stb.st_mode & 0777) != 0666) { D_loginttymode = (int)stb.st_mode & 0777; chmod(D_usertty, stb.st_mode & 0600); } } } /* * D_utmp_logintty is reinserted into utmp */ void RestoreLoginSlot(void) { char *tty; if (utmpok && D_loginslot != (slot_t) 0 && D_loginslot != (slot_t) - 1) { if (pututslot(D_loginslot, &D_utmp_logintty, D_loginhost, NULL) == 0) Msg(errno, "Could not write %s", UtmpName); } D_loginslot = (slot_t) 0; if (D_loginttymode && (tty = GetPtsPathOrSymlink(D_userfd)) && !CheckTtyname(tty)) fchmod(D_userfd, D_loginttymode); } /* * Construct a utmp entry for window wi. * the hostname field reflects what we know about the user (display) * location. If d_loginhost is not set, then he is local and we write * down the name of his terminal line; else he is remote and we keep * the hostname here. The letter S and the window id will be appended. * A saved utmp entry in wi->w_savut serves as a template, usually. */ int SetUtmp(Window *win) { slot_t slot; struct utmpx u = { 0 }; int saved_ut; #if defined(HAVE_UT_HOST) char host[ARRAY_SIZE(u.ut_host)]; #else char *host = NULL; #endif win->w_slot = (slot_t) 0; if (!utmpok || win->w_type != W_TYPE_PTY) return -1; if ((slot = TtyNameSlot(win->w_tty)) == (slot_t) 0) { return -1; } if ((saved_ut = memcmp((char *)&win->w_savut, (char *)&u, sizeof(struct utmpx)))) /* restore original, of which we will adopt all fields but ut_host */ memmove((char *)&u, (char *)&win->w_savut, sizeof(struct utmpx)); if (!saved_ut) makeuser(&u, stripdev(win->w_tty), LoginName, win->w_pid); #if defined(HAVE_UT_HOST) if (display) { snprintf(host, ARRAY_SIZE(host), "%s", D_loginhost); if (D_loginslot == (slot_t)0 || D_loginslot == (slot_t)-1 || host[0] == '\0') snprintf(host, ARRAY_SIZE(host), ":%s", stripdev(D_usertty)); } else snprintf(host, ARRAY_SIZE(host), "local"); snprintf(host + strlen(host), ARRAY_SIZE(host) - strlen(host), ":S.%d", win->w_number); memcpy(u.ut_host, host, ARRAY_SIZE(u.ut_host)); #endif if (pututslot(slot, &u, host, win) == 0) { Msg(errno, "Could not write %s", UtmpName); return -1; } win->w_slot = slot; memmove((char *)&win->w_savut, (char *)&u, sizeof(struct utmpx)); return 0; } /* * if slot could be removed or was 0, win->w_slot = -1; * else not changed. */ int RemoveUtmp(Window *win) { struct utmpx u = { 0 }; struct utmpx *uu; slot_t slot; slot = win->w_slot; if (!utmpok) return -1; if (slot == (slot_t)0 || slot == (slot_t)-1) { win->w_slot = (slot_t)-1; return 0; } if ((uu = getutslot(slot)) == NULL) { Msg(0, "Utmp slot not found -> not removed"); return -1; } memmove((char *)&win->w_savut, (char *)uu, sizeof(struct utmpx)); u = *uu; makedead(&u); if (pututslot(slot, &u, NULL, win) == 0) { Msg(errno, "Could not write %s", UtmpName); return -1; } win->w_slot = (slot_t)-1; return 0; } /********************************************************************* * * routines using the getut* api */ #define SLOT_USED(u) (u->ut_type == USER_PROCESS) static struct utmpx *getutslot(slot_t slot) { struct utmpx u = { 0 }; memcpy(u.ut_line, (char *)slot, ARRAY_SIZE(u.ut_line)); setutxent(); return getutxline(&u); } static int pututslot(slot_t slot, struct utmpx *u, char *host, Window *win) { (void)slot; /* unused */ #ifdef HAVE_UTEMPTER if (eff_uid && win && win->w_ptyfd != -1) { /* sigh, linux hackers made the helper functions void */ if (SLOT_USED(u)) utempter_add_record(win->w_ptyfd, host); else utempter_remove_record(win->w_ptyfd); /* * As documented in libutempter: "During execution of * the privileged process spawned by these functions, * SIGCHLD signal handler will be temporarily set to * the default action." Thus in case a SIGCHLD has * been lost, we send a SIGCHLD to oneself in order to * avoid zombies: https://savannah.gnu.org/bugs/?25089 */ kill(getpid(), SIGCHLD); return 1; /* pray for success */ } #else (void)host; /* unused */ (void)win; /* unused */ #endif setutxent(); return pututxline(u) != NULL; } static void makedead(struct utmpx *u) { u->ut_type = DEAD_PROCESS; #if defined(HAVE_UT_EXIT) u->ut_exit.e_termination = 0; u->ut_exit.e_exit = 0; #endif u->ut_user[0] = 0; /* for Digital UNIX, kilbi@rad.rwth-aachen.de */ } static void makeuser(struct utmpx *u, char *line, char *user, pid_t pid) { time_t now; u->ut_type = USER_PROCESS; memcpy(u->ut_user, user, ARRAY_SIZE(u->ut_user)); /* Now the tricky part... guess ut_id */ memcpy(u->ut_id, line + 3, ARRAY_SIZE(u->ut_id)); memcpy(u->ut_line, line, ARRAY_SIZE(u->ut_line)); u->ut_pid = pid; /* must use temp variable because of NetBSD/sparc64, where * ut_xtime is long(64) but time_t is int(32) */ (void)time(&now); u->ut_tv.tv_sec = now; } static slot_t TtyNameSlot(char *name) { return stripdev(name); } #endif /* ENABLE_UTMP */ screen-5.0.2/utf8encodings/0000775000175000017500000000000015224432722014226 5ustar alexalexscreen-5.0.2/utf8encodings/d60000664000175000017500000000032415224432722014461 0ustar alexalexScreenI2UTF8Ö.ISO-8859-10¡¢£"¤*¥(¦6¨;©ª`«f¬}®j¯J±²³#´+µ)¶7¸<¹ºa»g¼~½ ¾k¿KÀÇ.È ÊÌÑEÒL×hÙràç/è êìñFòM÷iùsÿ8screen-5.0.2/utf8encodings/cd0000664000175000017500000000006415224432722014537 0ustar alexalexScreenI2UTF8ÍISO-8859-9ÐÝ0Þ^ðý1þ_screen-5.0.2/utf8encodings/cc0000664000175000017500000000010415224432722014531 0ustar alexalexScreenI2UTF8Ì ISO-8859-5¡€¬ ®€ïOð!ñQ€ü\ý§þ^ÿ_screen-5.0.2/utf8encodings/c80000664000175000017500000000005015224432722014456 0ustar alexalexScreenI2UTF8ÈISO-8859-8ß àЀúêscreen-5.0.2/utf8encodings/c70000664000175000017500000000006415224432722014462 0ustar alexalexScreenI2UTF8ÇISO-8859-6¬ »¿€Ú:à@€òRscreen-5.0.2/utf8encodings/c60000664000175000017500000000010415224432722014454 0ustar alexalexScreenI2UTF8Æ ISO-8859-7¡½¢¼¯ ´„€¶†¸ˆ€ºмŒ¾Ž€ÿÏscreen-5.0.2/utf8encodings/c40000664000175000017500000000034415224432722014460 0ustar alexalexScreenI2UTF8Ä2ISO-8859-4¡¢8£V¥(¦;©`ª«"¬f®}±²Û³Wµ)¶<·ǹaº»#¼g½J¾~¿KÀÇ.È ÊÌÏ*ÐÑEÒLÓ6ÙrÝhÞjàç/è êìï+ðñFòMó7ùsýiþkÿÙscreen-5.0.2/utf8encodings/c30000664000175000017500000000021415224432722014453 0ustar alexalexScreenI2UTF8ÃISO-8859-3¡&¢ئ$©0ª^«¬4¯{±'¶%¹1º_»¼5¿|Å ÆÕ ØÝlÞ\å æ õ!øýmþ]ÿÙscreen-5.0.2/utf8encodings/c20000664000175000017500000000040015224432722014447 0ustar alexalexScreenI2UTF8Â9ISO-8859-2¡¢Ø£A¥=¦Z©`ª^«d¬y®}¯{±²Û³Bµ>¶[·ǹaº_»e¼z½ݾ~¿|ÀTÃÅ9ÆÈ ÊÌÏÐÑCÒGÕPØXÙnÛpÞbàUãå:æè êìïðñDòHõQøYùoûqþcÿÙscreen-5.0.2/utf8encodings/bf0000664000175000017500000000035015224432722014536 0ustar alexalexScreenI2UTF8¿4CP-1251€‚ ƒS„ … &† ‡ !ˆ ¬‰ 0Š ‹ 9Œ  Ž R‘ ’ “ ” • "– — ˜ ™!"šY› :œZ\ž[Ÿ_¡¢^£¥¨©©ª¯²³V´‘¸Q¹!ºT¼X½¾U¿WÀ€ÿOscreen-5.0.2/utf8encodings/a30000664000175000017500000000103015224432722014446 0ustar alexalexScreenI2UTF8£€KOI8-U€%%‚% ƒ%„%…%†%‡%$ˆ%,‰%4Š%<‹%€Œ%„%ˆŽ%Œ%%‘‘%’’%““# ”% •"–"—"H˜"d™"eš ›#!œ°²ž·Ÿ÷ %P¡%Q¢%R£Q¤T¥%T¦V§W¨%W©%Xª%Y«%Z¬%[­‘®%]¯%^°%_±%`²%a³´µ%c¶·¸%f¹%gº%h»%i¼%j½¾%l¿©ÀNÁ0Â1ÃFÄ4Å5ÆDÇ3ÈEÉ8Ê9Ë:Ì;Í<Î=Ï>Ð?ÑOÒ@ÓAÔBÕCÖ6×2ØLÙKÚ7ÛHÜMÝIÞGßJà.áâã&äåæ$çè%éêëìíîïðñ/ò ó!ô"õ#ö÷ø,ù+úû(ü-ý)þ'ÿ*screen-5.0.2/utf8encodings/a10000664000175000017500000000103015224432722014444 0ustar alexalexScreenI2UTF8¡€KOI8-R€%%‚% ƒ%„%…%†%‡%$ˆ%,‰%4Š%<‹%€Œ%„%ˆŽ%Œ%%‘‘%’’%““# ”% • "–"—"H˜"d™"eš ›#!œ°²ž·Ÿ÷ %P¡%Q¢%R£Q¤%S¥%T¦%U§%V¨%W©%Xª%Y«%Z¬%[­%\®%]¯%^°%_±%`²%a³´%bµ%c¶%d·%e¸%f¹%gº%h»%i¼%j½%k¾%l¿©ÀNÁ0Â1ÃFÄ4Å5ÆDÇ3ÈEÉ8Ê9Ë:Ì;Í<Î=Ï>Ð?ÑOÒ@ÓAÔBÕCÖ6×2ØLÙKÚ7ÛHÜMÝIÞGßJà.áâã&äåæ$çè%éêëìíîïðñ/ò ó!ô"õ#ö÷ø,ù+úû(ü-ý)þ'ÿ*screen-5.0.2/utf8encodings/190000664000175000017500000027304015224432722014410 0ustar alexalexScreenI2UTF8]ƒGBK@NANBNCNDNENFNGNHN IN!JN#KN&LN)MN.NN/ON1PN3QN5RN7SN<TN@UNAVNBWNDXNFYNJZNQ[NU\NW]NZ^N[_Nb`NcaNdbNecNgdNheNjfNkgNlhNmiNnjNokNrlNtmNunNvoNwpNxqNyrNzsN{tN|uN}vNwN€xNyN‚zNƒ{N„|N…}N‡~NŠ€NN–‚N—ƒN™„Nœ…N†Nž‡N£ˆNª‰N¯ŠN°‹N±ŒN´N¶ŽN·N¸N¹‘N¼’N½“N¾”NÈ•NÌ–NÏ—NИNÒ™NÚšNÛ›NÜœNàNâžNæŸNç Né¡Ní¢Nî£Nï¤Nñ¥Nô¦Nø§Nù¨Nú©NüªNþ«O¬O­O®O¯O°O±O²O³O ´O µO¶O·O¸O¹OºO»O¼O!½O#¾O(¿O)ÀO,ÁO-ÂO.ÃO1ÄO3ÅO5ÆO7ÇO9ÈO;ÉO>ÊO?ËO@ÌOAÍOBÎODÏOEÐOGÑOHÒOIÓOJÔOKÕOLÖOR×OTØOVÙOaÚObÛOfÜOhÝOjÞOkßOmàOnáOqâOrãOuäOwåOxæOyçOzèO}éO€êOëO‚ìO…íO†îO‡ïOŠðOŒñOŽòOóO’ôO“õO•öO–÷O˜øO™ùOšúOœûOžüOŸýO¡þO¢@O¤AO«BO­CO°DO±EO²FO³GO´HO¶IO·JO¸KO¹LOºMO»NO¼OO½PO¾QOÀROÁSOÂTOÆUOÇVOÈWOÉXOËYOÌZOÍ[OÒ\OÓ]OÔ^OÕ_OÖ`OÙaOÛbOàcOâdOäeOåfOçgOëhOìiOðjOòkOôlOõmOönO÷oOùpOûqOürOýsOÿtPuPvPwPxPyPzP{P|P}P ~P €P P‚PƒP„P…P†P‡PˆP‰PŠP‹P ŒP"P#ŽP$P'P+‘P/’P0“P1”P2•P3–P4—P5˜P6™P7šP8›P9œP;P=žP?ŸP@ PA¡PB¢PD£PE¤PF¥PI¦PJ§PK¨PM©PPªPQ«PR¬PS­PT®PV¯PW°PX±PY²P[³P]´P^µP_¶P`·Pa¸Pb¹PcºPd»Pf¼Pg½Ph¾Pi¿PjÀPkÁPmÂPnÃPoÄPpÅPqÆPrÇPsÈPtÉPuÊPxËPyÌPzÍP|ÎP}ÏPÐP‚ÑPƒÒP„ÓP†ÔP‡ÕP‰ÖPŠ×P‹ØPŒÙPŽÚPÛPÜP‘ÝP’ÞP“ßP”àP•áP–âP—ãP˜äP™åPšæP›çPœèPéPžêPŸëP ìP¡íP¢îP¤ïP¦ðPªñP«òP­óP®ôP¯õP°öP±÷P³øP´ùPµúP¶ûP·üP¸ýP¹þP¼@P½AP¾BP¿CPÀDPÁEPÂFPÃGPÄHPÅIPÆJPÇKPÈLPÉMPÊNPËOPÌPPÍQPÎRPÐSPÑTPÒUPÓVPÔWPÕXP×YPØZPÙ[PÛ\PÜ]PÝ^PÞ_Pß`PàaPábPâcPãdPäePåfPègPéhPêiPëjPïkPðlPñmPònPôoPöpP÷qPørPùsPútPüuPývPþwPÿxQyQzQ{Q|Q}Q~Q€Q Q ‚Q ƒQ „Q…Q†Q‡QˆQ‰QŠQ‹QŒQQŽQQQ‘Q’Q“Q”Q•Q –Q"—Q#˜Q$™Q%šQ&›Q'œQ(Q)žQ*ŸQ+ Q,¡Q-¢Q.£Q/¤Q0¥Q1¦Q2§Q3¨Q4©Q5ªQ6«Q7¬Q8­Q9®Q:¯Q;°Q<±Q=²Q>³QB´QGµQJ¶QL·QN¸QO¹QPºQR»QS¼QW½QX¾QY¿Q[ÀQ]ÁQ^ÂQ_ÃQ`ÄQaÅQcÆQdÇQfÈQgÉQiÊQjËQoÌQrÍQzÎQ~ÏQÐQƒÑQ„ÒQ†ÓQ‡ÔQŠÕQ‹ÖQŽ×QØQÙQ‘ÚQ“ÛQ”ÜQ˜ÝQšÞQßQžàQŸáQ¡âQ£ãQ¦äQ§åQ¨æQ©çQªèQ­éQ®êQ´ëQ¸ìQ¹íQºîQ¾ïQ¿ðQÁñQÂòQÃóQÅôQÈõQÊöQÍ÷QÎøQÐùQÒúQÓûQÔüQÕýQÖþQ×@QØAQÙBQÚCQÜDQÞEQßFQâGQãHQåIQæJQçKQèLQéMQêNQìOQîPQñQQòRQôSQ÷TQþURVRWR XR YR ZR[R\R]R^R_R`RaRbR!cR"dR#eR%fR&gR'hR*iR,jR/kR1lR2mR4nR5oR<pR>qRDrREsRFtRGuRHvRIwRKxRNyROzRR{RS|RU}RW~RX€RYRZ‚R[ƒR]„R_…R`†Rb‡RcˆRd‰RfŠRh‹RkŒRlRmŽRnRpRq‘Rs’Rt“Ru”Rv•Rw–Rx—Ry˜Rz™R{šR|›R~œR€RƒžR„ŸR… R†¡R‡¢R‰£RФR‹¥RŒ¦R§RލR©R‘ªR’«R”¬R•­R–®R—¯R˜°R™±Rš²Rœ³R¤´R¥µR¦¶R§·R®¸R¯¹R°ºR´»Rµ¼R¶½R·¾R¸¿R¹ÀRºÁR»ÂR¼ÃR½ÄRÀÅRÁÆRÂÇRÄÈRÅÉRÆÊRÈËRÊÌRÌÍRÍÎRÎÏRÏÐRÑÑRÓÒRÔÓRÕÔR×ÕRÙÖRÚ×RÛØRÜÙRÝÚRÞÛRàÜRáÝRâÞRãßRåàRæáRçâRèãRéäRêåRëæRìçRíèRîéRïêRñëRòìRóíRôîRõïRöðR÷ñRøòRûóRüôRýõSöS÷SøSùSúS ûS üS ýS þS@SASBSCSDSESFSGSHSIS"JS$KS%LS'MS(NS)OS+PS,QS-RS/SS0TS1US2VS3WS4XS5YS6ZS7[S8\S<]S=^S@_SB`SDaSFbSKcSLdSMeSPfSTgSXhSYiS[jS]kSelShmSjnSloSmpSrqSvrSysS{tS|uS}vS~wS€xSySƒzS‡{Sˆ|SŠ}SŽ~S€SS‘‚S’ƒS“„S”…S–†S—‡S™ˆS›‰SœŠSž‹S ŒS¡S¤ŽS§SªS«‘S¬’S­“S¯”S°•S±–S²—S³˜S´™SµšS·›S¸œS¹SºžS¼ŸS½ S¾¡SÀ¢SãSĤSÅ¥SƦSǧSΨSÏ©SЪSÒ«SÓ¬SÕ­SÚ®SܯSݰSÞ±Sá²Sâ³Sç´SôµSú¶Sþ·Sÿ¸T¹TºT»T¼T ½T¾T¿TÀTÁTÂT"ÃT$ÄT%ÅT*ÆT0ÇT3ÈT6ÉT7ÊT:ËT=ÌT?ÍTAÎTBÏTDÐTEÑTGÒTIÓTLÔTMÕTNÖTO×TQØTZÙT]ÚT^ÛT_ÜT`ÝTaÞTcßTeàTgáTiâTjãTkäTlåTmæTnçToèTpéTtêTyëTzìT~íTîTïTƒðT…ñT‡òTˆóT‰ôTŠõTöT‘÷T“øT—ùT˜úTœûTžüTŸýT þT¡@T¢AT¥BT®CT°DT²ETµFT¶GT·HT¹ITºJT¼KT¾LTÃMTÅNTÊOTËPTÖQTØRTÛSTàTTáUTâVTãWTäXTëYTìZTï[Tð\Tñ]Tô^Tõ_Tö`T÷aTøbTùcTûdTþeUfUgUhUiUjUkU lU mU nU oUpUqUrUsUtUuUvUwUxUyUzU{U|U!}U%~U&€U(U)‚U+ƒU-„U2…U4†U5‡U6ˆU8‰U9ŠU:‹U;ŒU=U@ŽUBUEUG‘UH’UK“UL”UM•UN–UO—UQ˜UR™USšUT›UWœUXUYžUZŸU[ U]¡U^¢U_£U`¤Ub¥Uc¦Uh§Ui¨Uk©UoªUp«Uq¬Ur­Us®Ut¯Uy°Uz±U}²U³U…´U†µUŒ¶U·UޏU¹U’ºU“»U•¼U–½U—¾Uš¿U›ÀUžÁU ÂU¡ÃU¢ÄU£ÅU¤ÆU¥ÇU¦ÈU¨ÉU©ÊUªËU«ÌU¬ÍU­ÎU®ÏU¯ÐU°ÑU²ÒU´ÓU¶ÔU¸ÕUºÖU¼×U¿ØUÀÙUÁÚUÂÛUÃÜUÆÝUÇÞUÈßUÊàUËáUÎâUÏãUÐäUÕåU׿UØçUÙèUÚéUÛêUÞëUàìUâíUçîUéïUíðUîñUðòUñóUôôUöõUøöUù÷UúøUûùUüúUÿûVüVýVþV@VAVBV CV DV EVFVGVHVIVJVKVLVMVNVOVPVQV RV!SV"TV%UV&VV(WV)XV*YV+ZV.[V/\V0]V3^V5_V7`V8aV:bV<cV=dV>eV@fVAgVBhVCiVDjVEkVFlVGmVHnVIoVJpVKqVOrVPsVQtVRuVSvVUwVVxVZyV[zV]{V^|V_}V`~Va€VcVe‚VfƒVg„Vm…Vn†Vo‡VpˆVr‰VsŠVt‹VuŒVwVxŽVyVzV}‘V~’V“V€”V•V‚–Vƒ—V„˜V‡™VˆšV‰›VŠœV‹VŒžVŸV V‘¡V’¢V”£V•¤V–¥V—¦V˜§V™¨Vš©V›ªVœ«V¬Vž­VŸ®V ¯V¡°V¢±V¤²V¥³V¦´V§µV¨¶V©·Vª¸V«¹V¬ºV­»V®¼V°½V±¾V²¿V³ÀV´ÁVµÂV¶ÃV¸ÄV¹ÅVºÆV»ÇV½ÈV¾ÉV¿ÊVÀËVÁÌVÂÍVÃÎVÄÏVÅÐVÆÑVÇÒVÈÓVÉÔVËÕVÌÖVÍ×VÎØVÏÙVÐÚVÑÛVÒÜVÓÝVÕÞVÖßVØàVÙáVÜâVããVåäVæåVçæVèçVéèVêéVìêVîëVïìVòíVóîVöïV÷ðVøñVûòVüóWôWõWöW÷WøW ùW úW ûWüWýWþW@WAWBWCWDWEWFWGWHWIWJWKWLW MW!NW"OW$PW%QW&RW'SW+TW1UW2VW4WW5XW6YW7ZW8[W<\W=]W?^WA_WC`WDaWEbWFcWHdWIeWKfWRgWShWTiWUjWVkWXlWYmWbnWcoWepWgqWlrWnsWptWquWrvWtwWuxWxyWyzWz{W}|W~}W~W€€WW‡‚WˆƒW‰„WŠ…W†WއWˆW‰W‘ŠW”‹W•ŒW–W—ŽW˜W™Wš‘Wœ’W“Wž”WŸ•W¥–W¨—Wª˜W¬™W¯šW°›W±œW³WµžW¶ŸW· W¹¡Wº¢W»£W¼¤W½¥W¾¦W¿§WÀ¨WÁ©WĪWÅ«WƬWÇ­WÈ®WɯWʰW̱WͲWгWÑ´WÓµWÖ¶W×·WÛ¸WܹWÞºWá»Wâ¼Wã½Wå¾Wæ¿WçÀWèÁWéÂWêÃWëÄWìÅWîÆWðÇWñÈWòÉWóÊWõËWöÌW÷ÍWûÎWüÏWþÐWÿÑXÒXÓXÔXÕXÖX ×X ØX ÙXÚXÛXÜXÝXÞXßXàXáXâXãXäXåXæXçX"èX#éX%êX&ëX'ìX(íX)îX+ïX,ðX-ñX.òX/óX1ôX2õX3öX4÷X6øX7ùX8úX9ûX:üX;ýX<þX= @X> AX? BX@ CXA DXB EXC FXE GXF HXG IXH JXI KXJ LXK MXN NXO OXP PXR QXS RXU SXV TXW UXY VXZ WX[ XX\ YX] ZX_ [X` \Xa ]Xb ^Xc _Xd `Xf aXg bXh cXi dXj eXm fXn gXo hXp iXq jXr kXs lXt mXu nXv oXw pXx qXy rXz sX{ tX| uX} vX wX‚ xX„ yX† zX‡ {Xˆ |XŠ }X‹ ~XŒ €X XŽ ‚X ƒX „X‘ …X” †X• ‡X– ˆX— ‰X˜ ŠX› ‹Xœ ŒX X  ŽX¡ X¢ X£ ‘X¤ ’X¥ “X¦ ”X§ •Xª –X« —X¬ ˜X­ ™X® šX¯ ›X° œX± X² žX³ ŸX´  Xµ ¡X¶ ¢X· £X¸ ¤X¹ ¥Xº ¦X» §X½ ¨X¾ ©X¿ ªXÀ «X ¬Xà ­XÄ ®XÆ ¯XÇ °XÈ ±XÉ ²XÊ ³XË ´XÌ µXÍ ¶XÎ ·XÏ ¸XÐ ¹XÒ ºXÓ »XÔ ¼XÖ ½X× ¾XØ ¿XÙ ÀXÚ ÁXÛ ÂXÜ ÃXÝ ÄXÞ ÅXß ÆXà ÇXá ÈXâ ÉXã ÊXå ËXæ ÌXç ÍXè ÎXé ÏXê ÐXí ÑXï ÒXñ ÓXò ÔXô ÕXõ ÖX÷ ×Xø ØXú ÙXû ÚXü ÛXý ÜXþ ÝXÿ ÞY ßY àY áY âY ãY äY åY æY çY èY éY êY ëY ìY íY îY ïY ðY ñY òY óY! ôY" õY# öY& ÷Y( øY, ùY0 úY2 ûY3 üY5 ýY6 þY; @Y= AY> BY? CY@ DYC EYE FYF GYJ HYL IYM JYP KYR LYS MYY NY[ OY\ PY] QY^ RY_ SYa TYc UYd VYf WYg XYh YYi ZYj [Yk \Yl ]Ym ^Yn _Yo `Yp aYq bYr cYu dYw eYz fY{ gY| hY~ iY jY€ kY… lY‰ mY‹ nYŒ oYŽ pY qY rY‘ sY” tY• uY˜ vYš wY› xYœ yY zYŸ {Y  |Y¡ }Y¢ ~Y¦ €Y§ Y¬ ‚Y­ ƒY° „Y± …Y³ †Y´ ‡Yµ ˆY¶ ‰Y· ŠY¸ ‹Yº ŒY¼ Y½ ŽY¿ YÀ YÁ ‘Y ’Yà “YÄ ”YÅ •YÇ –YÈ —YÉ ˜YÌ ™YÍ šYÎ ›YÏ œYÕ YÖ žYÙ ŸYÛ  YÞ ¡Yß ¢Yà £Yá ¤Yâ ¥Yä ¦Yæ §Yç ¨Yé ©Yê ªYë «Yí ¬Yî ­Yï ®Yð ¯Yñ °Yò ±Yó ²Yô ³Yõ ´Yö µY÷ ¶Yø ·Yú ¸Yü ¹Yý ºYþ »Z ¼Z ½Z ¾Z ¿Z ÀZ ÁZ ÂZ ÃZ ÄZ ÅZ ÆZ ÇZ ÈZ ÉZ ÊZ ËZ ÌZ ÍZ! ÎZ" ÏZ$ ÐZ& ÑZ' ÒZ( ÓZ* ÔZ+ ÕZ, ÖZ- ×Z. ØZ/ ÙZ0 ÚZ3 ÛZ5 ÜZ7 ÝZ8 ÞZ9 ßZ: àZ; áZ= âZ> ãZ? äZA åZB æZC çZD èZE éZG êZH ëZK ìZL íZM îZN ïZO ðZP ñZQ òZR óZS ôZT õZV öZW ÷ZX øZY ùZ[ úZ\ ûZ] üZ^ ýZ_ þZ` @Za AZc BZd CZe DZf EZh FZi GZk HZl IZm JZn KZo LZp MZq NZr OZs PZx QZy RZ{ SZ| TZ} UZ~ VZ€ WZ XZ‚ YZƒ ZZ„ [Z… \Z† ]Z‡ ^Zˆ _Z‰ `ZŠ aZ‹ bZŒ cZ dZŽ eZ fZ gZ‘ hZ“ iZ” jZ• kZ– lZ— mZ˜ nZ™ oZœ pZ qZž rZŸ sZ  tZ¡ uZ¢ vZ£ wZ¤ xZ¥ yZ¦ zZ§ {Z¨ |Z© }Z« ~Z¬ €Z­ Z® ‚Z¯ ƒZ° „Z± …Z´ †Z¶ ‡Z· ˆZ¹ ‰Zº ŠZ» ‹Z¼ ŒZ½ Z¿ ŽZÀ Zà ZÄ ‘ZÅ ’ZÆ “ZÇ ”ZÈ •ZÊ –ZË —ZÍ ˜ZÎ ™ZÏ šZÐ ›ZÑ œZÓ ZÕ žZ× ŸZÙ  ZÚ ¡ZÛ ¢ZÝ £ZÞ ¤Zß ¥Zâ ¦Zä §Zå ¨Zç ©Zè ªZê «Zì ¬Zí ­Zî ®Zï ¯Zð °Zò ±Zó ²Zô ³Zõ ´Zö µZ÷ ¶Zø ·Zù ¸Zú ¹Zû ºZü »Zý ¼Zþ ½Zÿ ¾[ ¿[ À[ Á[ Â[ Ã[ Ä[ Å[ Æ[ Ç[ È[ É[ Ê[ Ë[ Ì[ Í[ Î[ Ï[ Ð[ Ñ[ Ò[ Ó[ Ô[ Õ[ Ö[ ×[ Ø[ Ù[ Ú[ Û[ Ü[! Ý[" Þ[# ß[$ à[% á[& â[' ã[( ä[) å[* æ[+ ç[, è[- é[. ê[/ ë[0 ì[1 í[3 î[5 ï[6 ð[8 ñ[9 ò[: ó[; ô[< õ[= ö[> ÷[? ø[A ù[B ú[C û[D ü[E ý[F þ[G @[H A[I B[J C[K D[L E[M F[N G[O H[R I[V J[^ K[` L[a M[g N[h O[k P[m Q[n R[o S[r T[t U[v V[w W[x X[y Y[{ Z[| [[~ \[ ][‚ ^[† _[Š `[ a[Ž b[ c[‘ d[’ e[” f[– g[Ÿ h[§ i[¨ j[© k[¬ l[­ m[® n[¯ o[± p[² q[· r[º s[» t[¼ u[À v[Á w[à x[È y[É z[Ê {[Ë |[Í }[Î ~[Ï €[Ñ [Ô ‚[Õ ƒ[Ö „[× …[Ø †[Ù ‡[Ú ˆ[Û ‰[Ü Š[à ‹[â Œ[ã [æ Ž[ç [é [ê ‘[ë ’[ì “[í ”[ï •[ñ –[ò —[ó ˜[ô ™[õ š[ö ›[÷ œ[ý [þ ž\ Ÿ\  \ ¡\ ¢\ £\ ¤\ ¥\ ¦\ §\ ¨\ ©\ ª\ «\ ¬\ ­\ ®\ ¯\ °\ ±\! ²\# ³\& ´\( µ\) ¶\* ·\+ ¸\- ¹\. º\/ »\0 ¼\2 ½\3 ¾\5 ¿\6 À\7 Á\C Â\D Ã\F Ä\G Å\L Æ\M Ç\R È\S É\T Ê\V Ë\W Ì\X Í\Z Î\[ Ï\\ Ð\] Ñ\_ Ò\b Ó\d Ô\g Õ\h Ö\i ×\j Ø\k Ù\l Ú\m Û\p Ü\r Ý\s Þ\t ß\u à\v á\w â\x ã\{ ä\| å\} æ\~ ç\€ è\ƒ é\„ ê\… ë\† ì\‡ í\‰ î\Š ï\‹ ð\Ž ñ\ ò\’ ó\“ ô\• õ\ ö\ž ÷\Ÿ ø\  ù\¡ ú\¤ û\¥ ü\¦ ý\§ þ\¨ @\ª A\® B\¯ C\° D\² E\´ F\¶ G\¹ H\º I\» J\¼ K\¾ L\À M\ N\à O\Å P\Æ Q\Ç R\È S\É T\Ê U\Ì V\Í W\Î X\Ï Y\Ð Z\Ñ [\Ó \\Ô ]\Õ ^\Ö _\× `\Ø a\Ú b\Û c\Ü d\Ý e\Þ f\ß g\à h\â i\ã j\ç k\é l\ë m\ì n\î o\ï p\ñ q\ò r\ó s\ô t\õ u\ö v\÷ w\ø x\ù y\ú z\ü {\ý |\þ }\ÿ ~] €] ] ‚] ƒ] „] …] †] ‡] ˆ] ‰] Š] ‹] Œ] ] Ž] ] ] ‘] ’] “] ”] •] –] —]! ˜]" ™]# š]% ›]( œ]* ]+ ž], Ÿ]/  ]0 ¡]1 ¢]2 £]3 ¤]5 ¥]6 ¦]7 §]8 ¨]9 ©]: ª]; «]< ¬]? ­]@ ®]A ¯]B °]C ±]D ²]E ³]F ´]H µ]I ¶]M ·]N ¸]O ¹]P º]Q »]R ¼]S ½]T ¾]U ¿]V À]W Á]Y Â]Z Ã]\ Ä]^ Å]_ Æ]` Ç]a È]b É]c Ê]d Ë]e Ì]f Í]g Î]h Ï]j Ð]m Ñ]n Ò]p Ó]q Ô]r Õ]s Ö]u ×]v Ø]w Ù]x Ú]y Û]z Ü]{ Ý]| Þ]} ß]~ à] á]€ â] ã]ƒ ä]„ å]… æ]† ç]‡ è]ˆ é]‰ ê]Š ë]‹ ì]Œ í] î]Ž ï] ð] ñ]‘ ò]’ ó]“ ô]” õ]• ö]– ÷]— ø]˜ ù]š ú]› û]œ ü]ž ý]Ÿ þ] @]¡A]¢B]£C]¤D]¥E]¦F]§G]¨H]©I]ªJ]«K]¬L]­M]®N]¯O]°P]±Q]²R]³S]´T]µU]¶V]¸W]¹X]ºY]»Z]¼[]½\]¾]]¿^]À_]Á`]Âa]Ãb]Äc]Æd]Çe]Èf]Ég]Êh]Ëi]Ìj]Îk]Ïl]Ðm]Ñn]Òo]Óp]Ôq]Õr]Ös]×t]Øu]Ùv]Úw]Üx]ßy]àz]ã{]ä|]ê}]ì~]í€]ð]õ‚]öƒ]ø„]ù…]ú†]û‡]üˆ]ÿ‰^Š^‹^Œ^ ^ Ž^ ^ ^‘^’^“^”^•^–^ —^!˜^"™^#š^$›^%œ^(^)ž^*Ÿ^+ ^,¡^/¢^0£^2¤^3¥^4¦^5§^6¨^9©^:ª^>«^?¬^@­^A®^C¯^F°^G±^H²^I³^J´^Kµ^M¶^N·^O¸^P¹^Qº^R»^S¼^V½^W¾^X¿^YÀ^ZÁ^\Â^]Ã^_Ä^`Å^cÆ^dÇ^eÈ^fÉ^gÊ^hË^iÌ^jÍ^kÎ^lÏ^mÐ^nÑ^oÒ^pÓ^qÔ^uÕ^wÖ^y×^~Ø^Ù^‚Ú^ƒÛ^…Ü^ˆÝ^‰Þ^Œß^à^Žá^’â^˜ã^›ä^å^¡æ^¢ç^£è^¤é^¨ê^©ë^ªì^«í^¬î^®ï^¯ð^°ñ^±ò^²ó^´ô^ºõ^»ö^¼÷^½ø^¿ù^Àú^Áû^Âü^Ãý^Äþ^Å@^ÆA^ÇB^ÈC^ËD^ÌE^ÍF^ÎG^ÏH^ÐI^ÔJ^ÕK^×L^ØM^ÙN^ÚO^ÜP^ÝQ^ÞR^ßS^àT^áU^âV^ãW^äX^åY^æZ^ç[^é\^ë]^ì^^í_^î`^ïa^ðb^ñc^òd^óe^õf^øg^ùh^ûi^üj^ýk_l_m_n_ o_ p_ q_r_s_t_u_v_w_x_y_z_{_!|_"}_#~_$€_(_+‚_,ƒ_.„_0…_2†_3‡_4ˆ_5‰_6Š_7‹_8Œ_;_=Ž_>_?_A‘_B’_C“_D”_E•_F–_G—_H˜_I™_Jš_K›_Lœ_M_Nž_OŸ_Q _T¡_Y¢_Z£_[¤_\¥_^¦__§_`¨_c©_eª_g«_h¬_k­_n®_o¯_r°_t±_u²_v³_x´_zµ_}¶_~·_¸_ƒ¹_†º_»_޼_½_‘¾_“¿_”À_–Á_šÂ_›Ã_Ä_žÅ_ŸÆ_ Ç_¢È_£É_¤Ê_¥Ë_¦Ì_§Í_©Î_«Ï_¬Ð_¯Ñ_°Ò_±Ó_²Ô_³Õ_´Ö_¶×_¸Ø_¹Ù_ºÚ_»Û_¾Ü_¿Ý_ÀÞ_Áß_Âà_Çá_Èâ_Êã_Ëä_Îå_Óæ_Ôç_Õè_Úé_Ûê_Üë_Þì_ßí_âî_ãï_åð_æñ_èò_éó_ìô_ïõ_ðö_ò÷_óø_ôù_öú_÷û_ùü_úý_üþ`@`A` B` C` D`E`F`G`H`I`J`K`L`"M`#N`$O`,P`-Q`.R`0S`1T`2U`3V`4W`6X`7Y`8Z`9[`:\`=]`>^`@_`D``Ea`Fb`Gc`Hd`Ie`Jf`Lg`Nh`Oi`Qj`Sk`Tl`Vm`Wn`Xo`[p`\q`^r`_s``t`au`ev`fw`nx`qy`rz`t{`u|`w}`~~`€€``‚‚`…ƒ`†„`‡…`ˆ†`Ї`‹ˆ`މ`Š`‹`‘Œ`“`•Ž`—`˜`™‘`œ’`ž“`¡”`¢•`¤–`¥—`§˜`©™`ªš`®›`°œ`³`µž`¶Ÿ`· `¹¡`º¢`½£`¾¤`¿¥`À¦`Á§`¨`é`Ī`Ç«`Ȭ`É­`Ì®`ͯ`ΰ`ϱ`в`Ò³`Ó´`Ôµ`Ö¶`×·`Ù¸`Û¹`Þº`á»`â¼`ã½`ä¾`å¿`êÀ`ñÁ`òÂ`õÃ`÷Ä`øÅ`ûÆ`üÇ`ýÈ`þÉ`ÿÊaËaÌaÍaÎaÏa Ða Ña ÒaÓaÔaÕaÖa×aØaÙaÚaÛaÜaÝaÞaßa!àa"áa%âa(ãa)äa*åa,æa-ça.èa/éa0êa1ëa2ìa3ía4îa5ïa6ða7ña8òa9óa:ôa;õa<öa=÷a>øa@ùaAúaBûaCüaDýaEþaF@aGAaIBaKCaMDaOEaPFaRGaSHaTIaVJaWKaXLaYMaZNa[Oa\Pa^Qa_Ra`SaaTacUadVaeWafXaiYajZak[al\am]an^ao_aq`araasbatcavdaxeayfazga{ha|ia}ja~kala€mana‚oaƒpa„qa…ra†sa‡taˆua‰vaŠwaŒxayaza{a‘|a’}a“~a•€a–a—‚a˜ƒa™„aš…a›†aœ‡ažˆaŸ‰a Ša¡‹a¢Œa£a¤Ža¥a¦aª‘a«’a­“a®”a¯•a°–a±—a²˜a³™a´šaµ›a¶œa¸a¹žaºŸa» a¼¡a½¢a¿£aÀ¤aÁ¥aæaħaŨaÆ©aǪaÉ«a̬aÍ­aήaϯaаaÓ±aÕ²aÖ³a×´aصaÙ¶aÚ·aÛ¸aܹaݺaÞ»aß¼aà½aá¾aâ¿aãÀaäÁaåÂaçÃaèÄaéÅaêÆaëÇaìÈaíÉaîÊaïËaðÌañÍaòÎaóÏaôÐaöÑa÷ÒaøÓaùÔaúÕaûÖaü×aýØaþÙbÚbÛbÜbÝbÞbßbàb ábâbãbäbåbæbçb èb#éb&êb'ëb(ìb)íb+îb-ïb/ðb0ñb1òb2ób5ôb6õb8öb9÷b:øb;ùb<úbBûbDübEýbFþbJ@bOAbPBbUCbVDbWEbYFbZGb\Hb]Ib^Jb_Kb`LbaMbbNbdObePbhQbqRbrSbtTbuUbwVbxWbzXb{Yb}Zb[b‚\bƒ]b…^b†_b‡`bˆab‹bbŒcbdbŽebfbgb”hb™ibœjbkbžlb£mb¦nb§ob©pbªqb­rb®sb¯tb°ub²vb³wb´xb¶yb·zb¸{bº|b¾}bÀ~bÁ€bÃbË‚bσbÑ„bÕ…b݆bÞ‡bàˆbá‰bäŠbê‹bëŒbðbòŽbõbøbù‘bú’bû“c”c•c–c—c˜c ™c šc ›c œccžcŸc c¡c¢c£c¤c¥c¦c&§c'¨c)©c,ªc-«c.¬c0­c1®c3¯c4°c5±c6²c7³c8´c;µc<¶c>·c?¸c@¹cAºcD»cG¼cH½cJ¾cQ¿cRÀcSÁcTÂcVÃcWÄcXÅcYÆcZÇc[Èc\Éc]Êc`ËcdÌceÍcfÎchÏcjÐckÑclÒcoÓcpÔcrÕcsÖct×cuØcxÙcyÚc|Ûc}Üc~ÝcÞcßcƒàc„ác…âc†ãc‹äcåc‘æc“çc”èc•éc—êc™ëcšìc›ícœîcïcžðcŸñc¡òc¤óc¦ôc«õc¯öc±÷c²øcµùc¶úc¹ûc»üc½ýc¿þcÀ@cÁAcÂBcÃCcÅDcÇEcÈFcÊGcËHcÌIcÑJcÓKcÔLcÕMc×NcØOcÙPcÚQcÛRcÜScÝTcßUcâVcäWcåXcæYcçZcè[cë\cì]cî^cï_cð`cñacóbcõcc÷dcùecúfcûgcühcþidjdkdldmdnd od pd qdrdsdtdudvdwdxdydzd{d|d"}d#~d$€d%d'‚d(ƒd)„d+…d.†d/‡d0ˆd1‰d2Šd3‹d5Œd6d7Žd8d9d;‘d<’d>“d@”dB•dC–dI—dK˜dL™dMšdN›dOœdPdQždSŸdU dV¡dW¢dY£dZ¤d[¥d\¦d]§d_¨d`©daªdb«dc¬dd­de®df¯dh°dj±dk²dl³dn´doµdp¶dq·dr¸ds¹dtºdu»dv¼dw½d{¾d|¿d}Àd~ÁdÂd€ÃdÄdƒÅd†ÆdˆÇd‰ÈdŠÉd‹ÊdŒËdÌdŽÍdÎdÏd“Ðd”Ñd—Òd˜ÓdšÔd›ÕdœÖd×dŸØd Ùd¡Úd¢Ûd£Üd¥Ýd¦Þd§ßd¨àdªád«âd¯ãd±äd²åd³æd´çd¶èd¹éd»êd½ëd¾ìd¿ídÁîdÃïdÄðdÆñdÇòdÈódÉôdÊõdËödÌ÷dÏødÑùdÓúdÔûdÕüdÖýdÙþdÚ@dÛAdÜBdÝCdßDdàEdáFdãGdåHdçIdèJdéKdêLdëMdìNdíOdîPdïQdðRdñSdòTdóUdôVdõWdöXd÷YdøZdù[dú\dû]dü^dý_dþ`dÿaebecedeeefegeheie je ke le meneoepeqereseteuevewexeyeze{e|e}e ~e!€e"e#‚e$ƒe&„e'…e(†e)‡e*ˆe,‰e-Še0‹e1Œe2e3Že7e:e<‘e=’e@“eA”eB•eC–eD—eF˜eG™eJšeK›eMœeNePžeRŸeS eT¡eW¢eX£eZ¤e\¥e_¦e`§ea¨ed©eeªeg«eh¬ei­ej®em¯en°eo±eq²es³eu´evµex¶ey·ez¸e{¹e|ºe}»e~¼e½e€¾e¿e‚ÀeƒÁe„Âe…Ãe†ÄeˆÅe‰ÆeŠÇeÈeŽÉeÊe’Ëe”Ìe•Íe–Îe˜ÏešÐeÑežÒe Óe¢Ôe£Õe¦Öe¨×eªØe¬Ùe®Úe±Ûe²Üe³Ýe´Þeµße¶àe·áe¸âeºãe»äe¾åe¿æeÀçeÂèeÇéeÈêeÉëeÊìeÍíeÐîeÑïeÓðeÔñeÕòeØóeÙôeÚõeÛöeÜ÷eÝøeÞùeßúeáûeãüeäýeêþeë@eòAeóBeôCeõDeøEeùFeûGeüHeýIeþJeÿKfLfMfNfOfPf Qf Rf SfTfUfVfWfXfYfZf[f\f]f!^f"_f#`f$af&bf)cf*df+ef,ff.gf0hf2if3jf7kf8lf9mf:nf;of=pf?qf@rfBsfDtfEufFvfGwfHxfIyfJzfM{fN|fP}fQ~fX€fYf[‚f\ƒf]„f^…f`†fb‡fcˆfe‰fgŠfi‹fjŒfkflŽfmfqfr‘fs’fu“fx”fy•f{–f|—f}˜f™f€šf›fƒœf…f†žfˆŸf‰ fŠ¡f‹¢f£fޤf¥f¦f’§f“¨f”©f•ªf˜«f™¬fš­f›®fœ¯fž°fŸ±f ²f¡³f¢´f£µf¤¶f¥·f¦¸f©¹fªºf«»f¬¼f­½f¯¾f°¿f±Àf²Áf³ÂfµÃf¶Äf·Åf¸ÆfºÇf»Èf¼Éf½Êf¿ËfÀÌfÁÍfÂÎfÃÏfÄÐfÅÑfÆÒfÇÓfÈÔfÉÕfÊÖfË×fÌØfÍÙfÎÚfÏÛfÐÜfÑÝfÒÞfÓßfÔàfÕáfÖâf×ãfØäfÚåfÞæfßçfàèfáéfâêfãëfäìfåífçîfèïfêðfëñfìòfíófîôfïõfñöfõ÷föøføùfúúfûûfýügýgþg@gAgBgCgDg EgFgGgHgIgJgKgLgMgNgOgPg Qg!Rg"Sg#Tg$Ug%Vg'Wg)Xg.Yg0Zg2[g3\g6]g7^g8_g9`g;ag<bg>cg?dgAegDfgEggGhgJigKjgMkgRlgTmgUngWogXpgYqgZrg[sg]tgbugcvgdwgfxggygkzgl{gn|gq}gt~gv€gxgy‚gzƒg{„g}…g€†g‚‡gƒˆg…‰g†Šgˆ‹gŠŒgŒgŽgŽgg‘‘g’’g““g””g–•g™–g›—gŸ˜g ™g¡šg¤›g¦œg©g¬žg®Ÿg± g²¡g´¢g¹£gº¤g»¥g¼¦g½§g¾¨g¿©gÀªg«gŬgÆ­gÇ®gȯgɰgʱg˲g̳gÍ´gεgÕ¶gÖ·g׸gÛ¹gߺgá»gã¼gä½gæ¾gç¿gèÀgêÁgëÂgíÃgîÄgòÅgõÆgöÇg÷ÈgøÉgùÊgúËgûÌgüÍgþÎhÏhÐhÑhÒhÓh ÔhÕhÖh×hØhÙhÚhÛhÜhÝhÞhßh àh"áh#âh$ãh%äh&åh'æh(çh+èh,éh-êh.ëh/ìh0íh1îh4ïh5ðh6ñh:òh;óh?ôhGõhKöhM÷hOøhRùhVúhWûhXühYýhZþh[@h\Ah]Bh^Ch_DhjEhlFhmGhnHhoIhpJhqKhrLhsMhuNhxOhyPhzQh{Rh|Sh}Th~UhVh€Wh‚Xh„Yh‡Zhˆ[h‰\hŠ]h‹^hŒ_h`hŽahbh‘ch’dh”eh•fh–gh˜hh™ihšjh›khœlhmhžnhŸoh ph¡qh£rh¤sh¥th©uhªvh«wh¬xh®yh±zh²{h´|h¶}h·~h¸€h¹hº‚h»ƒh¼„h½…h¾†h¿‡hÁˆhÉhÄŠhÅ‹hÆŒhÇhÈŽhÊhÌhΑhÏ’hГhÑ”hÓ•hÔ–hÖ—hטhÙ™hÛšhÜ›hÝœhÞhßžháŸhâ hä¡hå¢hæ£hç¤hè¥hé¦hê§hë¨hì©híªhï«hò¬hó­hô®hö¯h÷°hø±hû²hý³hþ´hÿµi¶i·i¸i¹iºi»i¼i ½i ¾i ¿iÀiÁiÂiÃiÄiÅiÆiÇiÈiÉiÊiËiÌiÍi!Îi"Ïi#Ði%Ñi&Òi'Ói(Ôi)Õi*Öi+×i,Øi.Ùi/Úi1Ûi2Üi3Ýi5Þi6ßi7ài8ái:âi;ãi<äi>åi@æiAçiCèiDéiEêiFëiGìiHíiIîiJïiKðiLñiMòiNóiOôiPõiQöiR÷iSøiUùiVúiXûiYüi[ýi\þi_@iaAibBidCieDigEihFiiGijHilIimJioKipLirMisNitOiuPivQizRi{Si}Ti~UiViWiƒXi…YiŠZi‹[iŒ\iŽ]i^i_i‘`i’ai“bi–ci—di™eišfigižhiŸii ji¡ki¢li£mi¤ni¥oi¦pi©qiªri¬si®ti¯ui°vi²wi³xiµyi¶zi¸{i¹|iº}i¼~i½€i¾i¿‚iÀƒi„iÃ…iĆiŇiƈiljiÈŠiÉ‹iËŒiÍiÏŽiÑiÒiÓ‘iÕ’iÖ“i×”iØ•iÙ–iÚ—iܘiÝ™iÞšiá›iâœiãiäžiåŸiæ iç¡iè¢ié£iê¤ië¥iì¦iî§iï¨ið©iñªió«iô¬iõ­iö®i÷¯iø°iù±iú²iû³iü´iþµj¶j·j¸j¹jºj»j¼j½j¾j ¿j Àj Áj ÂjÃjÄjÅjÆjÇjÈjÉjÊjËjÌjÍjÎjÏjÐjÑj Òj"Ój#Ôj$Õj%Öj&×j'Øj)Ùj+Új,Ûj-Üj.Ýj0Þj2ßj3àj4áj6âj7ãj8äj9åj:æj;çj<èj?éj@êjAëjBìjCíjEîjFïjHðjIñjJòjKójLôjMõjNöjO÷jQøjRùjSújTûjUüjVýjWþjZ@j\Aj]Bj^Cj_Dj`EjbFjcGjdHjfIjgJjhKjiLjjMjkNjlOjmPjnQjoRjpSjrTjsUjtVjuWjvXjwYjxZjz[j{\j}]j~^j_j`j‚ajƒbj…cj†dj‡ejˆfj‰gjŠhj‹ijŒjjkjlj’mj“nj”oj•pj–qj˜rj™sjštj›ujœvjwjžxjŸyj¡zj¢{j£|j¤}j¥~j¦€j§j¨‚jªƒj­„j®…j¯†j°‡j±ˆj²‰j³Šj´‹jµŒj¶j·Žj¸j¹jº‘j»’j¼“j½”j¾•j¿–jÀ—jÁ˜j™jÚjÄ›jÅœjÆjÇžjÈŸjÉ jÊ¡jË¢jÌ£jͤjÎ¥jϦjЧjѨjÒ©jÓªjÔ«jÕ¬jÖ­j×®jدjÙ°jÚ±jÛ²jܳjÝ´jÞµjß¶jà·já¸jâ¹jãºjä»jå¼jæ½jç¾jè¿jéÀjêÁjëÂjìÃjíÄjîÅjïÆjðÇjñÈjòÉjóÊjôËjõÌjöÍj÷ÎjøÏjùÐjúÑjûÒjüÓjýÔjþÕjÿÖk×kØkÙkÚkÛkÜkÝkÞkßk àk ák âk ãk äkåkækçkèkékêkëkìkíkîkïkðkñkòkókôkõkök%÷k&øk(ùk)úk*ûk+ük,ýk-þk.@k/Ak0Bk1Ck3Dk4Ek5Fk6Gk8Hk;Ik<Jk=Kk?Lk@MkANkBOkDPkEQkHRkJSkKTkMUkNVkOWkPXkQYkRZkS[kT\kU]kV^kW_kX`kZak[bk\ck]dk^ek_fk`gkahkhikijkkkkllkmmknnkookppkqqkrrksskttkuukvvkwwkxxkzyk}zk~{k|k€}k…~kˆ€kŒkŽ‚kƒk„k‘…k”†k•‡k—ˆk˜‰k™Škœ‹kŒkžkŸŽk k¢k£‘k¤’k¥“k¦”k§•k¨–k©—k«˜k¬™k­šk®›k¯œk°k±žk²Ÿk¶ k¸¡k¹¢kº£k»¤k¼¥k½¦k¾§kÀ¨kékĪkÆ«kǬkÈ­kÉ®kʯk̰kαkвkѳkØ´kÚµkܶkÝ·kÞ¸kß¹kàºkâ»kã¼kä½kå¾kæ¿kçÀkèÁkéÂkìÃkíÄkîÅkðÆkñÇkòÈkôÉköÊk÷ËkøÌkúÍkûÎküÏkþÐkÿÑlÒlÓlÔlÕlÖl×l Øl Ùl Úl ÛlÜlÝlÞlßlàlál âl#ãl%äl+ål,æl-çl1èl3él6êl7ël9ìl:íl;îl<ïl>ðl?ñlCòlDólEôlHõlKölL÷lMølNùlOúlQûlRülSýlVþlX@lYAlZBlbClcDleElfFlgGlkHllIlmJlnKloLlqMlsNluOlwPlxQlzRl{Sl|TlUl€Vl„Wl‡XlŠYl‹ZlŽ\l‘]l’^l•_l–`l—al˜blšclœdlelžfl gl¢hl¨il¬jl¯kl°ll´mlµnl¶ol·plºqlÀrlÁslÂtlÃulÆvlÇwlÈxlËylÍzlÎ{lÏ|lÑ}lÒ~lØ€lÙlÚ‚l܃lÝ„lß…lä†læ‡lçˆlé‰lìŠlí‹lòŒlôlùŽlÿmm‘m’m“m”m•m –m —m ˜m™mšm›mœmmžmŸm m¡m¢m£m ¤m!¥m"¦m#§m$¨m&©m(ªm)«m,¬m-­m/®m0¯m4°m6±m7²m8³m:´m?µm@¶mB·mD¸mI¹mLºmP»mU¼mV½mW¾mX¿m[Àm]Ám_ÂmaÃmbÄmdÅmeÆmgÇmhÈmkÉmlÊmmËmpÌmqÍmrÎmsÏmuÐmvÑmyÒmzÓm{Ôm}Õm~Öm×m€ØmÙmƒÚm„Ûm†Üm‡ÝmŠÞm‹ßmàmámâm’ãm–äm—åm˜æm™çmšèmœém¢êm¥ëm¬ìm­ím°îm±ïm³ðm´ñm¶òm·óm¹ômºõm»öm¼÷m½øm¾ùmÁúmÂûmÃümÈýmÉþmÊ@mÍAmÎBmÏCmÐDmÒEmÓFmÔGmÕHm×ImÚJmÛKmÜLmßMmâNmãOmåPmçQmèRméSmêTmíUmïVmðWmòXmôYmõZmö[mø\mú]mý^mþ_mÿ`nanbncndnenfngnhn in jnknlnmnnnonpnqnrnsntn"un&vn'wn(xn*yn,zn.{n0|n1}n3~n5€n6n7‚n9ƒn;„n<…n=†n>‡n?ˆn@‰nAŠnB‹nEŒnFnGŽnHnInJ‘nK’nL“nO”nP•nQ–nR—nU˜nW™nYšnZ›n\œn]n^žn`Ÿna nb¡nc¢nd£ne¤nf¥ng¦nh§ni¨nj©nlªnm«no¬np­nq®nr¯ns°nt±nu²nv³nw´nxµny¶nz·n{¸n|¹n}ºn€»n¼n‚½n„¾n‡¿nˆÀnŠÁn‹ÂnŒÃnÄnŽÅn‘Æn’Çn“Èn”Én•Ên–Ën—Ìn™ÍnšÎn›ÏnÐnžÑn Òn¡Ón£Ôn¤Õn¦Ön¨×n©Øn«Ùn¬Ún­Ûn®Ün°Ýn³Þnµßn¸àn¹án¼ân¾ãn¿änÀånÃænÄçnÅènÆénÈênÉënÊìnÌínÍînÎïnÐðnÒñnÖònØónÙônÛõnÜönÝ÷nãønçùnêúnëûnìüníýnîþnï@nðAnñBnòCnóDnõEnöFn÷GnøHnúInûJnüKnýLnþMnÿNoOoPoQoRoSoToUo Vo Wo Xo YoZo[o\o]o^o_o`oaobocodoeofogo!ho"io#jo%ko&lo'mo(no,oo.po0qo2ro4so5to7uo8vo9wo:xo;yo<zo={o?|o@}oA~oB€oCoD‚oEƒoH„oI…oJ†oL‡oNˆoO‰oPŠoQ‹oRŒoSoTŽoUoVoW‘oY’oZ“o[”o]•o_–o`—oa˜oc™odšoe›ogœohoižojŸok ol¡oo¢op£oq¤os¥ou¦ov§ow¨oy©o{ªo}«o~¬o­o€®o¯o‚°oƒ±o…²o†³o‡´oеo‹¶o·o¸o‘¹o’ºo“»o”¼o•½o–¾o—¿o˜Ào™ÁošÂo›ÃoÄožÅoŸÆo Ço¢Èo£Éo¤Êo¥Ëo¦Ìo¨Ío©ÎoªÏo«Ðo¬Ño­Òo®Óo¯Ôo°Õo±Öo²×o´ØoµÙo·Úo¸ÛoºÜo»Ýo¼Þo½ßo¾ào¿áoÁâoÃãoÄäoÅåoÆæoÇçoÈèoÊéoËêoÌëoÍìoÎíoÏîoÐïoÓðoÔñoÕòoÖóo×ôoØõoÙöoÚ÷oÛøoÜùoÝúoßûoâüoãýoäþoå@oæAoçBoèCoéDoêEoëFoìGoíHoðIoñJoòKoóLoôMoõNoöOo÷PoøQoùRoúSoûToüUoýVoþWoÿXpYpZp[p\p]p^p_p`pap bp cp dp ep fpgphpipjpkplpmpnpopppqprpsptpup vp!wp"xp$yp%zp&{p'|p(}p)~p*€p+p,‚p-ƒp.„p/…p0†p1‡p2ˆp3‰p4Šp6‹p7Œp8p:Žp;p<p=‘p>’p?“p@”pA•pB–pC—pD˜pE™pFšpG›pHœpIpJžpKŸpM pN¡pP¢pQ£pR¤pS¥pT¦pU§pV¨pW©pXªpY«pZ¬p[­p\®p]¯p_°p`±pa²pb³pc´pdµpe¶pf·pg¸ph¹piºpj»pn¼pq½pr¾ps¿ptÀpwÁpyÂpzÃp{Äp}ÅpÆp‚ÇpƒÈp„Ép†Êp‡ËpˆÌp‹ÍpŒÎpÏpÐpÑp‘Òp“Óp—Ôp˜ÕpšÖp›×pžØpŸÙp Úp¡Ûp¢Üp£Ýp¤Þp¥ßp¦àp§áp¨âp©ãpªäp°åp²æp´çpµèp¶épºêp¾ëp¿ìpÄípÅîpÆïpÇðpÉñpËòpÌópÍôpÎõpÏöpÐ÷pÑøpÒùpÓúpÔûpÕüpÖýp×þpÚ@pÜApÝBpÞCpàDpáEpâFpãGpåHpêIpîJpðKpñLpòMpóNpôOpõPpöQpøRpúSpûTpüUpþVpÿWqXqYqZq[q\q]q^q_q`q aq bq cqdqeqfqgqhqiqjqkqlqmqnq oq!pq"qq#rq$sq%tq'uq(vq)wq*xq+yq,zq-{q.|q2}q3~q4€q5q7‚q8ƒq9„q:…q;†q<‡q=ˆq>‰q?Šq@‹qAŒqBqCŽqDqFqG‘qH’qI“qK”qM•qO–qP—qQ˜qR™qSšqT›qUœqVqWžqXŸqY qZ¡q[¢q]£q_¤q`¥qa¦qb§qc¨qe©qiªqj«qk¬ql­qm®qo¯qp°qq±qt²qu³qv´qwµqy¶q{·q|¸q~¹qºq€»q¼q‚½qƒ¾q…¿q†Àq‡ÁqˆÂq‰Ãq‹ÄqŒÅqÆqŽÇqÈq‘Éq’Êq“Ëq•Ìq–Íq—ÎqšÏq›ÐqœÑqÒqžÓq¡Ôq¢Õq£Öq¤×q¥Øq¦Ùq§Úq©ÛqªÜq«Ýq­Þq®ßq¯àq°áq±âq²ãq´äq¶åq·æq¸çqºèq»éq¼êq½ëq¾ìq¿íqÀîqÁïqÂðqÄñqÅòqÆóqÇôqÈõqÉöqÊ÷qËøqÌùqÍúqÏûqÐüqÑýqÒþqÓ @qÖ Aq× BqØ CqÙ DqÚ EqÛ FqÜ GqÝ HqÞ Iqß Jqá Kqâ Lqã Mqä Nqæ Oqè Pqé Qqê Rqë Sqì Tqí Uqï Vqð Wqñ Xqò Yqó Zqô [qõ \qö ]q÷ ^qø _qú `qû aqü bqý cqþ dqÿ er fr gr hr ir jr kr lr mr nr or pr qr rr sr tr ur vr wr xr yr zr {r |r }r ~r €r r ‚r ƒr „r …r! †r" ‡r# ˆr$ ‰r% Šr& ‹r' Œr) r+ Žr- r. r/ ‘r2 ’r3 “r4 ”r: •r< –r> —r@ ˜rA ™rB šrC ›rD œrE rF žrI ŸrJ  rK ¡rN ¢rO £rP ¤rQ ¥rS ¦rT §rU ¨rW ©rX ªrZ «r\ ¬r^ ­r` ®rc ¯rd °re ±rh ²rj ³rk ´rl µrm ¶rp ·rq ¸rs ¹rt ºrv »rw ¼rx ½r{ ¾r| ¿r} Àr‚ Árƒ Âr… Ãr† Är‡ Årˆ Ær‰ ÇrŒ ÈrŽ Ér Êr‘ Ër“ Ìr” Ír• Îr– Ïr— Ðr˜ Ñr™ Òrš Ór› Ôrœ Õr Örž ×r  Ør¡ Ùr¢ Úr£ Ûr¤ Ür¥ Ýr¦ Þr§ ßr¨ àr© árª âr« ãr® är± år² ær³ çrµ èrº ér» êr¼ ër½ ìr¾ ír¿ îrÀ ïrÅ ðrÆ ñrÇ òrÉ órÊ ôrË õrÌ örÏ ÷rÑ ørÓ ùrÔ úrÕ ûrÖ ürØ ýrÚ þrÛ!@äÆ!AäÇ!BäÈ!CäÉ!DäÊ!EäË!FäÌ!GäÍ!HäÎ!IäÏ!JäÐ!KäÑ!LäÒ!MäÓ!NäÔ!OäÕ!PäÖ!Qä×!RäØ!SäÙ!TäÚ!UäÛ!VäÜ!WäÝ!XäÞ!Yäß!Zäà![äá!\äâ!]äã!^ää!_äå!`äæ!aäç!bäè!cäé!däê!eäë!fäì!gäí!häî!iäï!jäð!käñ!läò!mäó!näô!oäõ!päö!qä÷!räø!säù!täú!uäû!väü!wäý!xäþ!yäÿ!zå!{å!|å!}å!~å!€å!å!‚å!ƒå!„å !…å !†å !‡å !ˆå !‰å!Šå!‹å!Œå!å!Žå!å!å!‘å!’å!“å!”å!•å!–å!—å!˜å!™å!šå!›å !œå!!å"!žå#!Ÿå$! å%!¡0!¢0!£0!¤·!¥É!¦Ç!§¨!¨0!©0!ª !«ÿ^!¬ !­ &!® !¯ !° !± !²0!³0!´0!µ0 !¶0 !·0 !¸0 !¹0 !º0!»0!¼0!½0!¾0!¿0!À±!Á×!Â÷!Ã"6!Ä"'!Å"(!Æ"!Ç"!È"*!É")!Ê"!Ë"7!Ì"!Í"¥!Î"%!Ï" !Ð#!Ñ"™!Ò"+!Ó".!Ô"a!Õ"L!Ö"H!×"=!Ø"!Ù"`!Ú"n!Û"o!Ü"d!Ý"e!Þ"!ß"5!à"4!á&B!â&@!ã°!ä 2!å 3!æ!!çÿ!è¤!éÿà!êÿá!ë 0!ì§!í!!î&!ï&!ð%Ë!ñ%Ï!ò%Î!ó%Ç!ô%Æ!õ%¡!ö% !÷%³!ø%²!ù ;!ú!’!û!!ü!‘!ý!“!þ0"@å&"Aå'"Bå("Cå)"Då*"Eå+"Få,"Gå-"Hå."Iå/"Jå0"Kå1"Lå2"Må3"Nå4"Oå5"På6"Qå7"Rå8"Så9"Tå:"Uå;"Vå<"Wå="Xå>"Yå?"Zå@"[åA"\åB"]åC"^åD"_åE"`åF"aåG"båH"cåI"dåJ"eåK"fåL"gåM"håN"iåO"jåP"kåQ"låR"måS"nåT"oåU"påV"qåW"råX"såY"tåZ"uå["vå\"wå]"xå^"yå_"zå`"{åa"|åb"}åc"~åd"€åe"åf"‚åg"ƒåh"„åi"…åj"†åk"‡ål"ˆåm"‰ån"Šåo"‹åp"Œåq"år"Žås"åt"åu"‘åv"’åw"“åx"”åy"•åz"–å{"—å|"˜å}"™å~"šå"›å€"œå"å‚"žåƒ"Ÿå„" å…"¡!p"¢!q"£!r"¤!s"¥!t"¦!u"§!v"¨!w"©!x"ª!y"«å†"¬å‡"­åˆ"®å‰"¯åŠ"°å‹"±$ˆ"²$‰"³$Š"´$‹"µ$Œ"¶$"·$Ž"¸$"¹$"º$‘"»$’"¼$“"½$”"¾$•"¿$–"À$—"Á$˜"Â$™"Ã$š"Ä$›"Å$t"Æ$u"Ç$v"È$w"É$x"Ê$y"Ë$z"Ì${"Í$|"Î$}"Ï$~"Ð$"Ñ$€"Ò$"Ó$‚"Ô$ƒ"Õ$„"Ö$…"×$†"Ø$‡"Ù$`"Ú$a"Û$b"Ü$c"Ý$d"Þ$e"ß$f"à$g"á$h"â$i"ãåŒ"äå"å2 "æ2!"ç2""è2#"é2$"ê2%"ë2&"ì2'"í2("î2)"ïåŽ"ðå"ñ!`"ò!a"ó!b"ô!c"õ!d"ö!e"÷!f"ø!g"ù!h"ú!i"û!j"ü!k"ýå"þå‘#@å’#Aå“#Bå”#Cå•#Då–#Eå—#Få˜#Gå™#Håš#Iå›#Jåœ#Kå#Låž#MåŸ#Nå #Oå¡#På¢#Qå£#Rå¤#Så¥#Tå¦#Uå§#Vå¨#Wå©#Xåª#Yå«#Zå¬#[å­#\å®#]å¯#^å°#_å±#`å²#aå³#bå´#cåµ#då¶#eå·#få¸#gå¹#håº#iå»#jå¼#kå½#lå¾#må¿#nåÀ#oåÁ#påÂ#qåÃ#råÄ#såÅ#tåÆ#uåÇ#våÈ#wåÉ#xåÊ#yåË#zåÌ#{åÍ#|åÎ#}åÏ#~åÐ#€åÑ#åÒ#‚åÓ#ƒåÔ#„åÕ#…åÖ#†å×#‡åØ#ˆåÙ#‰åÚ#ŠåÛ#‹åÜ#ŒåÝ#åÞ#Žåß#åà#åá#‘åâ#’åã#“åä#”åå#•åæ#–åç#—åè#˜åé#™åê#šåë#›åì#œåí#åî#žåï#Ÿåð# åñ#¡ÿ#¢ÿ#£ÿ#¤ÿå#¥ÿ#¦ÿ#§ÿ#¨ÿ#©ÿ #ªÿ #«ÿ #¬ÿ #­ÿ #®ÿ#¯ÿ#°ÿ#±ÿ#²ÿ#³ÿ#´ÿ#µÿ#¶ÿ#·ÿ#¸ÿ#¹ÿ#ºÿ#»ÿ#¼ÿ#½ÿ#¾ÿ#¿ÿ#Àÿ #Áÿ!#Âÿ"#Ãÿ##Äÿ$#Åÿ%#Æÿ&#Çÿ'#Èÿ(#Éÿ)#Êÿ*#Ëÿ+#Ìÿ,#Íÿ-#Îÿ.#Ïÿ/#Ðÿ0#Ñÿ1#Òÿ2#Óÿ3#Ôÿ4#Õÿ5#Öÿ6#×ÿ7#Øÿ8#Ùÿ9#Úÿ:#Ûÿ;#Üÿ<#Ýÿ=#Þÿ>#ßÿ?#àÿ@#áÿA#âÿB#ãÿC#äÿD#åÿE#æÿF#çÿG#èÿH#éÿI#êÿJ#ëÿK#ìÿL#íÿM#îÿN#ïÿO#ðÿP#ñÿQ#òÿR#óÿS#ôÿT#õÿU#öÿV#÷ÿW#øÿX#ùÿY#úÿZ#ûÿ[#üÿ\#ýÿ]#þÿã$@åò$Aåó$Båô$Cåõ$Dåö$Eå÷$Fåø$Gåù$Håú$Iåû$Jåü$Kåý$Låþ$Måÿ$Næ$Oæ$Pæ$Qæ$Ræ$Sæ$Tæ$Uæ$Væ$Wæ $Xæ $Yæ $Zæ $[æ $\æ$]æ$^æ$_æ$`æ$aæ$bæ$cæ$dæ$eæ$fæ$gæ$hæ$iæ$jæ$kæ$læ$mæ$næ $oæ!$pæ"$qæ#$ræ$$sæ%$tæ&$uæ'$væ($wæ)$xæ*$yæ+$zæ,${æ-$|æ.$}æ/$~æ0$€æ1$æ2$‚æ3$ƒæ4$„æ5$…æ6$†æ7$‡æ8$ˆæ9$‰æ:$Šæ;$‹æ<$Œæ=$æ>$Žæ?$æ@$æA$‘æB$’æC$“æD$”æE$•æF$–æG$—æH$˜æI$™æJ$šæK$›æL$œæM$æN$žæO$ŸæP$ æQ$¡0A$¢0B$£0C$¤0D$¥0E$¦0F$§0G$¨0H$©0I$ª0J$«0K$¬0L$­0M$®0N$¯0O$°0P$±0Q$²0R$³0S$´0T$µ0U$¶0V$·0W$¸0X$¹0Y$º0Z$»0[$¼0\$½0]$¾0^$¿0_$À0`$Á0a$Â0b$Ã0c$Ä0d$Å0e$Æ0f$Ç0g$È0h$É0i$Ê0j$Ë0k$Ì0l$Í0m$Î0n$Ï0o$Ð0p$Ñ0q$Ò0r$Ó0s$Ô0t$Õ0u$Ö0v$×0w$Ø0x$Ù0y$Ú0z$Û0{$Ü0|$Ý0}$Þ0~$ß0$à0€$á0$â0‚$ã0ƒ$ä0„$å0…$æ0†$ç0‡$è0ˆ$é0‰$ê0Š$ë0‹$ì0Œ$í0$î0Ž$ï0$ð0$ñ0‘$ò0’$ó0“$ôæR$õæS$öæT$÷æU$øæV$ùæW$úæX$ûæY$üæZ$ýæ[$þæ\%@æ]%Aæ^%Bæ_%Cæ`%Dæa%Eæb%Fæc%Gæd%Hæe%Iæf%Jæg%Kæh%Læi%Mæj%Næk%Oæl%Pæm%Qæn%Ræo%Sæp%Tæq%Uær%Væs%Wæt%Xæu%Yæv%Zæw%[æx%\æy%]æz%^æ{%_æ|%`æ}%aæ~%bæ%cæ€%dæ%eæ‚%fæƒ%gæ„%hæ…%iæ†%jæ‡%kæˆ%læ‰%mæŠ%næ‹%oæŒ%pæ%qæŽ%ræ%sæ%tæ‘%uæ’%væ“%wæ”%xæ•%yæ–%zæ—%{æ˜%|æ™%}æš%~æ›%€æœ%æ%‚æž%ƒæŸ%„æ %…æ¡%†æ¢%‡æ£%ˆæ¤%‰æ¥%Šæ¦%‹æ§%Œæ¨%æ©%Žæª%æ«%æ¬%‘æ­%’æ®%“æ¯%”æ°%•æ±%–æ²%—æ³%˜æ´%™æµ%šæ¶%›æ·%œæ¸%æ¹%žæº%Ÿæ»% æ¼%¡0¡%¢0¢%£0£%¤0¤%¥0¥%¦0¦%§0§%¨0¨%©0©%ª0ª%«0«%¬0¬%­0­%®0®%¯0¯%°0°%±0±%²0²%³0³%´0´%µ0µ%¶0¶%·0·%¸0¸%¹0¹%º0º%»0»%¼0¼%½0½%¾0¾%¿0¿%À0À%Á0Á%Â0Â%Ã0Ã%Ä0Ä%Å0Å%Æ0Æ%Ç0Ç%È0È%É0É%Ê0Ê%Ë0Ë%Ì0Ì%Í0Í%Î0Î%Ï0Ï%Ð0Ð%Ñ0Ñ%Ò0Ò%Ó0Ó%Ô0Ô%Õ0Õ%Ö0Ö%×0×%Ø0Ø%Ù0Ù%Ú0Ú%Û0Û%Ü0Ü%Ý0Ý%Þ0Þ%ß0ß%à0à%á0á%â0â%ã0ã%ä0ä%å0å%æ0æ%ç0ç%è0è%é0é%ê0ê%ë0ë%ì0ì%í0í%î0î%ï0ï%ð0ð%ñ0ñ%ò0ò%ó0ó%ô0ô%õ0õ%ö0ö%÷æ½%øæ¾%ùæ¿%úæÀ%ûæÁ%üæÂ%ýæÃ%þæÄ&@æÅ&AæÆ&BæÇ&CæÈ&DæÉ&EæÊ&FæË&GæÌ&HæÍ&IæÎ&JæÏ&KæÐ&LæÑ&MæÒ&NæÓ&OæÔ&PæÕ&QæÖ&Ræ×&SæØ&TæÙ&UæÚ&VæÛ&WæÜ&XæÝ&YæÞ&Zæß&[æà&\æá&]æâ&^æã&_æä&`æå&aææ&bæç&cæè&dæé&eæê&fæë&gæì&hæí&iæî&jæï&kæð&læñ&mæò&næó&oæô&pæõ&qæö&ræ÷&sæø&tæù&uæú&væû&wæü&xæý&yæþ&zæÿ&{ç&|ç&}ç&~ç&€ç&ç&‚ç&ƒç&„ç&…ç &†ç &‡ç &ˆç &‰ç &Šç&‹ç&Œç&ç&Žç&ç&ç&‘ç&’ç&“ç&”ç&•ç&–ç&—ç&˜ç&™ç&šç&›ç&œç &ç!&žç"&Ÿç#& ç$&¡‘&¢’&£“&¤”&¥•&¦–&§—&¨˜&©™&ªš&«›&¬œ&­&®ž&¯Ÿ&° &±¡&²£&³¤&´¥&µ¦&¶§&·¨&¸©&¹ç%&ºç&&»ç'&¼ç(&½ç)&¾ç*&¿ç+&Àç,&Á±&²&ó&Ä´&ŵ&ƶ&Ç·&ȸ&ɹ&ʺ&Ë»&̼&ͽ&ξ&Ï¿&ÐÀ&ÑÁ&ÒÃ&ÓÄ&ÔÅ&ÕÆ&ÖÇ&×È&ØÉ&Ùç-&Úç.&Ûç/&Üç0&Ýç1&Þç2&ßç3&àþ5&áþ6&âþ9&ãþ:&äþ?&åþ@&æþ=&çþ>&èþA&éþB&êþC&ëþD&ìç4&íç5&îþ;&ïþ<&ðþ7&ñþ8&òþ1&óç6&ôþ3&õþ4&öç7&÷ç8&øç9&ùç:&úç;&ûç<&üç=&ýç>&þç?'@ç@'AçA'BçB'CçC'DçD'EçE'FçF'GçG'HçH'IçI'JçJ'KçK'LçL'MçM'NçN'OçO'PçP'QçQ'RçR'SçS'TçT'UçU'VçV'WçW'XçX'YçY'ZçZ'[ç['\ç\']ç]'^ç^'_ç_'`ç`'aça'bçb'cçc'dçd'eçe'fçf'gçg'hçh'içi'jçj'kçk'lçl'mçm'nçn'oço'pçp'qçq'rçr'sçs'tçt'uçu'vçv'wçw'xçx'yçy'zçz'{ç{'|ç|'}ç}'~ç~'€ç'ç€'‚ç'ƒç‚'„çƒ'…ç„'†ç…'‡ç†'ˆç‡'‰çˆ'Šç‰'‹çŠ'Œç‹'çŒ'Žç'çŽ'ç'‘ç'’ç‘'“ç’'”ç“'•ç”'–ç•'—ç–'˜ç—'™ç˜'šç™'›çš'œç›'çœ'žç'Ÿçž' çŸ'¡'¢'£'¤'¥'¦'§'¨'©'ª'«'¬'­'®'¯'°'±'² '³!'´"'µ#'¶$'·%'¸&'¹''º('»)'¼*'½+'¾,'¿-'À.'Á/'Âç 'Ãç¡'Äç¢'Åç£'Æç¤'Çç¥'Èç¦'Éç§'Êç¨'Ëç©'Ìçª'Íç«'Îç¬'Ïç­'Ðç®'Ñ0'Ò1'Ó2'Ô3'Õ4'Ö5'×Q'Ø6'Ù7'Ú8'Û9'Ü:'Ý;'Þ<'ß='à>'á?'â@'ãA'äB'åC'æD'çE'èF'éG'êH'ëI'ìJ'íK'îL'ïM'ðN'ñO'òç¯'óç°'ôç±'õç²'öç³'÷ç´'øçµ'ùç¶'úç·'ûç¸'üç¹'ýçº'þç»(@Ê(AË(BÙ(C (D (E %(F 5(G!(H! (I!–(J!—(K!˜(L!™(M"(N"(O"#(P"R(Q"f(R"g(S"¿(T%P(U%Q(V%R(W%S(X%T(Y%U(Z%V([%W(\%X(]%Y(^%Z(_%[(`%\(a%](b%^(c%_(d%`(e%a(f%b(g%c(h%d(i%e(j%f(k%g(l%h(m%i(n%j(o%k(p%l(q%m(r%n(s%o(t%p(u%q(v%r(w%s(x%(y%‚(z%ƒ({%„(|%…(}%†(~%‡(€%ˆ(%‰(‚%Š(ƒ%‹(„%Œ(…%(†%Ž(‡%(ˆ%“(‰%”(Š%•(‹%¼(Œ%½(%â(Ž%ã(%ä(%å(‘& (“0(”0(•0(–ç¼(—ç½(˜ç¾(™ç¿(šçÀ(›çÁ(œçÂ(çÃ(žçÄ(ŸçÅ( çÆ(¡(¢á(£Î(¤à(¥(¦é(§(¨è(©+(ªí(«Ð(¬ì(­M(®ó(¯Ò(°ò(±k(²ú(³Ô(´ù(µÖ(¶Ø(·Ú(¸Ü(¹ü(ºê(»Q(¼çÇ(½D(¾H(¿çÈ(Àa(ÁçÉ(ÂçÊ(ÃçË(ÄçÌ(Å1(Æ1(Ç1(È1(É1 (Ê1 (Ë1 (Ì1 (Í1 (Î1(Ï1(Ð1(Ñ1(Ò1(Ó1(Ô1(Õ1(Ö1(×1(Ø1(Ù1(Ú1(Û1(Ü1(Ý1(Þ1(ß1(à1 (á1!(â1"(ã1#(ä1$(å1%(æ1&(ç1'(è1((é1)(êçÍ(ëçÎ(ìçÏ(íçÐ(îçÑ(ïçÒ(ðçÓ(ñçÔ(òçÕ(óçÖ(ôç×(õçØ(öçÙ(÷çÚ(øçÛ(ùçÜ(úçÝ(ûçÞ(üçß(ýçà(þçá)@0!)A0")B0#)C0$)D0%)E0&)F0')G0()H0))I2£)J3Ž)K3)L3œ)M3)N3ž)O3¡)P3Ä)Q3Î)R3Ñ)S3Ò)T3Õ)Uþ0)Vÿâ)Wÿä)Xçâ)Y!!)Z21)[çã)\ )]çä)^çå)_çæ)`0ü)a0›)b0œ)c0ý)d0þ)e0)f0)g0ž)hþI)iþJ)jþK)kþL)lþM)mþN)nþO)oþP)pþQ)qþR)rþT)sþU)tþV)uþW)vþY)wþZ)xþ[)yþ\)zþ]){þ^)|þ_)}þ`)~þa)€þb)þc)‚þd)ƒþe)„þf)…þh)†þi)‡þj)ˆþk)‰çç)Šçè)‹çé)Œçê)çë)Žçì)çí)çî)‘çï)’çð)“çñ)”çò)•çó)–0)—çô)˜çõ)™çö)šç÷)›çø)œçù)çú)žçû)Ÿçü) çý)¡çþ)¢çÿ)£è)¤%)¥%)¦%)§%)¨%)©%)ª%)«%)¬%)­% )®% )¯% )°% )±% )²%)³%)´%)µ%)¶%)·%)¸%)¹%)º%)»%)¼%)½%)¾%)¿%)À%)Á%)Â%)Ã%)Ä% )Å%!)Æ%")Ç%#)È%$)É%%)Ê%&)Ë%')Ì%()Í%))Î%*)Ï%+)Ð%,)Ñ%-)Ò%.)Ó%/)Ô%0)Õ%1)Ö%2)×%3)Ø%4)Ù%5)Ú%6)Û%7)Ü%8)Ý%9)Þ%:)ß%;)à%<)á%=)â%>)ã%?)ä%@)å%A)æ%B)ç%C)è%D)é%E)ê%F)ë%G)ì%H)í%I)î%J)ï%K)ðè)ñè)òè)óè)ôè)õè)öè)÷è)øè )ùè )úè )ûè )üè )ýè)þè*@rÜ*ArÝ*Brß*Crâ*Drã*Erä*Frå*Græ*Hrç*Irê*Jrë*Krõ*Lrö*Mrù*Nrý*Orþ*Prÿ*Qs*Rs*Ss*Ts*Us*Vs*Ws*Xs *Ys *Zs *[s *\s*]s*^s*_s*`s*as*bs*cs*ds*es *fs#*gs$*hs&*is'*js(*ks-*ls/*ms0*ns2*os3*ps5*qs6*rs:*ss;*ts<*us=*vs@*wsA*xsB*ysC*zsD*{sE*|sF*}sG*~sH*€sI*sJ*‚sK*ƒsL*„sN*…sO*†sQ*‡sS*ˆsT*‰sU*ŠsV*‹sX*ŒsY*sZ*Žs[*s\*s]*‘s^*’s_*“sa*”sb*•sc*–sd*—se*˜sf*™sg*šsh*›si*œsj*sk*žsn*Ÿsp* sq*¡à*¢à*£à*¤à*¥à*¦à*§à*¨à*©à*ªà *«à *¬à *­à *®à *¯à*°à*±à*²à*³à*´à*µà*¶à*·à*¸à*¹à*ºà*»à*¼à*½à*¾à*¿à*Àà*Áà *Âà!*Ãà"*Äà#*Åà$*Æà%*Çà&*Èà'*Éà(*Êà)*Ëà**Ìà+*Íà,*Îà-*Ïà.*Ðà/*Ñà0*Òà1*Óà2*Ôà3*Õà4*Öà5*×à6*Øà7*Ùà8*Úà9*Ûà:*Üà;*Ýà<*Þà=*ßà>*àà?*áà@*âàA*ãàB*äàC*åàD*æàE*çàF*èàG*éàH*êàI*ëàJ*ìàK*íàL*îàM*ïàN*ðàO*ñàP*òàQ*óàR*ôàS*õàT*öàU*÷àV*øàW*ùàX*úàY*ûàZ*üà[*ýà\*þà]+@sr+Ass+Bst+Csu+Dsv+Esw+Fsx+Gsy+Hsz+Is{+Js|+Ks}+Ls+Ms€+Ns+Os‚+Psƒ+Qs…+Rs†+Ssˆ+TsŠ+UsŒ+Vs+Ws+Xs+Ys’+Zs“+[s”+\s•+]s—+^s˜+_s™+`sš+asœ+bs+csž+ds +es¡+fs£+gs¤+hs¥+is¦+js§+ks¨+lsª+ms¬+ns­+os±+ps´+qsµ+rs¶+ss¸+ts¹+us¼+vs½+ws¾+xs¿+ysÁ+zsÃ+{sÄ+|sÅ+}sÆ+~sÇ+€sË+sÌ+‚sÎ+ƒsÒ+„sÓ+…sÔ+†sÕ+‡sÖ+ˆs×+‰sØ+ŠsÚ+‹sÛ+ŒsÜ+sÝ+Žsß+sá+sâ+‘sã+’sä+“sæ+”sè+•sê+–së+—sì+˜sî+™sï+šsð+›sñ+œsó+sô+žsõ+Ÿsö+ s÷+¡à^+¢à_+£à`+¤àa+¥àb+¦àc+§àd+¨àe+©àf+ªàg+«àh+¬ài+­àj+®àk+¯àl+°àm+±àn+²ào+³àp+´àq+µàr+¶às+·àt+¸àu+¹àv+ºàw+»àx+¼ày+½àz+¾à{+¿à|+Àà}+Áà~+Âà+Ãà€+Äà+Åà‚+Æàƒ+Çà„+Èà…+Éà†+Êà‡+Ëàˆ+Ìà‰+ÍàŠ+Îà‹+ÏàŒ+Ðà+ÑàŽ+Òà+Óà+Ôà‘+Õà’+Öà“+×à”+Øà•+Ùà–+Úà—+Ûà˜+Üà™+Ýàš+Þà›+ßàœ+àà+áàž+âàŸ+ãà +äà¡+åà¢+æà£+çà¤+èà¥+éà¦+êà§+ëà¨+ìà©+íàª+îà«+ïà¬+ðà­+ñà®+òà¯+óà°+ôà±+õà²+öà³+÷à´+øàµ+ùà¶+úà·+ûà¸+üà¹+ýàº+þà»,@sø,Asù,Bsú,Csû,Dsü,Esý,Fsþ,Gsÿ,Ht,It,Jt,Kt,Lt,Mt,Nt ,Ot ,Pt ,Qt,Rt,St,Tt,Ut,Vt,Wt,Xt,Yt,Zt,[t,\t,]t,^t,_t ,`t!,at#,bt$,ct',dt),et+,ft-,gt/,ht1,it2,jt7,kt8,lt9,mt:,nt;,ot=,pt>,qt?,rt@,stB,ttC,utD,vtE,wtF,xtG,ytH,ztI,{tJ,|tK,}tL,~tM,€tN,tO,‚tP,ƒtQ,„tR,…tS,†tT,‡tV,ˆtX,‰t],Št`,‹ta,Œtb,tc,Žtd,te,tf,‘tg,’th,“ti,”tj,•tk,–tl,—tn,˜to,™tq,štr,›ts,œtt,tu,žtx,Ÿty, tz,¡à¼,¢à½,£à¾,¤à¿,¥àÀ,¦àÁ,§àÂ,¨àÃ,©àÄ,ªàÅ,«àÆ,¬àÇ,­àÈ,®àÉ,¯àÊ,°àË,±àÌ,²àÍ,³àÎ,´àÏ,µàÐ,¶àÑ,·àÒ,¸àÓ,¹àÔ,ºàÕ,»àÖ,¼à×,½àØ,¾àÙ,¿àÚ,ÀàÛ,ÁàÜ,ÂàÝ,ÃàÞ,Äàß,Åàà,Æàá,Çàâ,Èàã,Éàä,Êàå,Ëàæ,Ìàç,Íàè,Îàé,Ïàê,Ðàë,Ñàì,Òàí,Óàî,Ôàï,Õàð,Öàñ,×àò,Øàó,Ùàô,Úàõ,Ûàö,Üà÷,Ýàø,Þàù,ßàú,ààû,áàü,âàý,ãàþ,äàÿ,åá,æá,çá,èá,éá,êá,ëá,ìá,íá,îá ,ïá ,ðá ,ñá ,òá ,óá,ôá,õá,öá,÷á,øá,ùá,úá,ûá,üá,ýá,þá-@t{-At|-Bt}-Ct-Dt‚-Et„-Ft…-Gt†-Htˆ-It‰-JtŠ-KtŒ-Lt-Mt-Nt‘-Ot’-Pt“-Qt”-Rt•-St–-Tt—-Ut˜-Vt™-Wtš-Xt›-Yt-ZtŸ-[t -\t¡-]t¢-^t£-_t¤-`t¥-at¦-btª-ct«-dt¬-et­-ft®-gt¯-ht°-it±-jt²-kt³-lt´-mtµ-nt¶-ot·-pt¸-qt¹-rt»-st¼-tt½-ut¾-vt¿-wtÀ-xtÁ-ytÂ-ztÃ-{tÄ-|tÅ-}tÆ-~tÇ-€tÈ-tÉ-‚tÊ-ƒtË-„tÌ-…tÍ-†tÎ-‡tÏ-ˆtÐ-‰tÑ-ŠtÓ-‹tÔ-ŒtÕ-tÖ-Žt×-tØ-tÙ-‘tÚ-’tÛ-“tÝ-”tß-•tá-–tå-—tç-˜tè-™té-štê-›të-œtì-tí-žtð-Ÿtñ- tò-¡á-¢á-£á-¤á-¥á-¦á-§á -¨á!-©á"-ªá#-«á$-¬á%-­á&-®á'-¯á(-°á)-±á*-²á+-³á,-´á--µá.-¶á/-·á0-¸á1-¹á2-ºá3-»á4-¼á5-½á6-¾á7-¿á8-Àá9-Áá:-Âá;-Ãá<-Äá=-Åá>-Æá?-Çá@-ÈáA-ÉáB-ÊáC-ËáD-ÌáE-ÍáF-ÎáG-ÏáH-ÐáI-ÑáJ-ÒáK-ÓáL-ÔáM-ÕáN-ÖáO-×áP-ØáQ-ÙáR-ÚáS-ÛáT-ÜáU-ÝáV-ÞáW-ßáX-àáY-ááZ-âá[-ãá\-äá]-åá^-æá_-çá`-èáa-éáb-êác-ëád-ìáe-íáf-îág-ïáh-ðái-ñáj-òák-óál-ôám-õán-öáo-÷áp-øáq-ùár-úás-ûát-üáu-ýáv-þáw.@tó.Atõ.Btø.Ctù.Dtú.Etû.Ftü.Gtý.Htþ.Iu.Ju.Ku.Lu.Mu.Nu.Ou.Pu.Qu .Ru .Su .Tu .Uu.Vu.Wu.Xu.Yu.Zu.[u.\u.]u.^u._u .`u!.au".bu#.cu$.du&.eu'.fu*.gu..hu4.iu6.ju9.ku<.lu=.mu?.nuA.ouB.puC.quD.ruF.suG.tuI.uuJ.vuM.wuP.xuQ.yuR.zuS.{uU.|uV.}uW.~uX.€u].u^.‚u_.ƒu`.„ua.…ub.†uc.‡ud.ˆug.‰uh.Šui.‹uk.Œul.um.Žun.uo.up.‘uq.’us.“uu.”uv.•uw.–uz.—u{.˜u|.™u}.šu~.›u€.œu.u‚.žu„.Ÿu…. u‡.¡áx.¢áy.£áz.¤á{.¥á|.¦á}.§á~.¨á.©á€.ªá.«á‚.¬áƒ.­á„.®á….¯á†.°á‡.±áˆ.²á‰.³áŠ.´á‹.µáŒ.¶á.·áŽ.¸á.¹á.ºá‘.»á’.¼á“.½á”.¾á•.¿á–.Àá—.Áá˜.Âá™.Ãáš.Äá›.Åáœ.Æá.Çáž.ÈáŸ.Éá .Êá¡.Ëá¢.Ìá£.Íá¤.Îá¥.Ïá¦.Ðá§.Ñá¨.Òá©.Óáª.Ôá«.Õá¬.Öá­.×á®.Øá¯.Ùá°.Úá±.Ûá².Üá³.Ýá´.Þáµ.ßá¶.àá·.áá¸.âá¹.ãáº.äá».åá¼.æá½.çá¾.èá¿.éáÀ.êáÁ.ëáÂ.ìáÃ.íáÄ.îáÅ.ïáÆ.ðáÇ.ñáÈ.òáÉ.óáÊ.ôáË.õáÌ.öáÍ.÷áÎ.øáÏ.ùáÐ.úáÑ.ûáÒ.üáÓ.ýáÔ.þáÕ/@uˆ/Au‰/BuŠ/CuŒ/Du/EuŽ/Fu/Gu“/Hu•/Iu˜/Ju›/Kuœ/Luž/Mu¢/Nu¦/Ou§/Pu¨/Qu©/Ruª/Su­/Tu¶/Uu·/Vuº/Wu»/Xu¿/YuÀ/ZuÁ/[uÆ/\uË/]uÌ/^uÎ/_uÏ/`uÐ/auÑ/buÓ/cu×/duÙ/euÚ/fuÜ/guÝ/huß/iuà/juá/kuå/lué/muì/nuí/ouî/puï/quò/ruó/suõ/tuö/uu÷/vuø/wuú/xuû/yuý/zuþ/{v/|v/}v/~v/€v/v /‚v /ƒv /„v/…v/†v/‡v/ˆv/‰v/Šv/‹v/Œv/v/Žv/v!/v#/‘v'/’v(/“v,/”v./•v//–v1/—v2/˜v6/™v7/šv9/›v:/œv;/v=/žvA/ŸvB/ vD/¡áÖ/¢á×/£áØ/¤áÙ/¥áÚ/¦áÛ/§áÜ/¨áÝ/©áÞ/ªáß/«áà/¬áá/­áâ/®áã/¯áä/°áå/±áæ/²áç/³áè/´áé/µáê/¶áë/·áì/¸áí/¹áî/ºáï/»áð/¼áñ/½áò/¾áó/¿áô/Àáõ/Ááö/Âá÷/Ãáø/Äáù/Åáú/Æáû/Çáü/Èáý/Éáþ/Êáÿ/Ëâ/Ìâ/Íâ/Îâ/Ïâ/Ðâ/Ñâ/Òâ/Óâ/Ôâ /Õâ /Öâ /×â /Øâ /Ùâ/Úâ/Ûâ/Üâ/Ýâ/Þâ/ßâ/àâ/áâ/ââ/ãâ/äâ/åâ/æâ/çâ/èâ/éâ/êâ/ëâ /ìâ!/íâ"/îâ#/ïâ$/ðâ%/ñâ&/òâ'/óâ(/ôâ)/õâ*/öâ+/÷â,/øâ-/ùâ./úâ//ûâ0/üâ1/ýâ2/þâ30@vE0AvF0BvG0CvH0DvI0EvJ0FvK0GvN0HvO0IvP0JvQ0KvR0LvS0MvU0NvW0OvX0PvY0QvZ0Rv[0Sv]0Tv_0Uv`0Vva0Wvb0Xvd0Yve0Zvf0[vg0\vh0]vi0^vj0_vl0`vm0avn0bvp0cvq0dvr0evs0fvt0gvu0hvv0ivw0jvy0kvz0lv|0mv0nv€0ov0pvƒ0qv…0rv‰0svŠ0tvŒ0uv0vv0wv0xv’0yv”0zv•0{v—0|v˜0}vš0~v›0€vœ0v0‚vž0ƒvŸ0„v 0…v¡0†v¢0‡v£0ˆv¥0‰v¦0Šv§0‹v¨0Œv©0vª0Žv«0v¬0v­0‘v¯0’v°0“v³0”vµ0•v¶0–v·0—v¸0˜v¹0™vº0šv»0›v¼0œv½0v¾0žvÀ0ŸvÁ0 vÃ0¡UJ0¢–?0£WÃ0¤c(0¥TÎ0¦U 0§TÀ0¨v‘0©vL0ª…<0«wî0¬‚~0­x0®r10¯–˜0°—0±l(0²[‰0³Oú0´c 0µf—0¶\¸0·€ú0¸hH0¹€®0ºf0»vÎ0¼Qù0½eV0¾q¬0¿ñ0Àˆ„0ÁP²0ÂYe0ÃaÊ0Äo³0Å‚­0ÆcL0ÇbR0ÈSí0ÉT'0Ê{0ËQk0Ìu¤0Í]ô0ÎbÔ0ÏË0Зv0ÑbŠ0Ò€0ÓW]0Ô—80Õb0Ör80×v}0ØgÏ0Ùv~0ÚdF0ÛOp0Ü%0ÝbÜ0Þz0ße‘0àsí0ád,0âbs0ã‚,0ä˜0åg0ærH0çbn0èbÌ0éO40êtã0ëSJ0ìRž0í~Ê0î¦0ï^.0ðh†0ñiœ0ò€0ó~Ñ0ôhÒ0õxÅ0ö†Œ0÷•Q0øP0ùŒ$0ú‚Þ0û€Þ0üS0ý‰0þRe1@vÄ1AvÇ1BvÉ1CvË1DvÌ1EvÓ1FvÕ1GvÙ1HvÚ1IvÜ1JvÝ1KvÞ1Lvà1Mvá1Nvâ1Ovã1Pvä1Qvæ1Rvç1Svè1Tvé1Uvê1Vvë1Wvì1Xví1Yvð1Zvó1[võ1\vö1]v÷1^vú1_vû1`vý1avÿ1bw1cw1dw1ew1fw1gw 1hw 1iw1jw1kw1lw1mw1nw1ow1pw1qw1rw1sw1tw1uw1vw1ww1xw!1yw#1zw$1{w%1|w'1}w*1~w+1€w,1w.1‚w01ƒw11„w21…w31†w41‡w91ˆw;1‰w=1Šw>1‹w?1ŒwB1wD1ŽwE1wF1wH1‘wI1’wJ1“wK1”wL1•wM1–wN1—wO1˜wR1™wS1šwT1›wU1œwV1wW1žwX1ŸwY1 w\1¡…„1¢–ù1£OÝ1¤X!1¥™q1¦[1§b±1¨b¥1©f´1ªŒy1«œ1¬r1­go1®x‘1¯`²1°SQ1±S1²ˆ1³€Ì1´1µ”¡1¶P 1·rÈ1¸Y1¹`ë1ºq1»ˆ«1¼YT1½‚ï1¾g,1¿{(1À])1Á~÷1Âu-1Ãlõ1ÄŽf1Åø1Æ<1ÇŸ;1ÈkÔ1É‘1Ê{1Ë_|1Ìx§1Í„Ö1Î…=1ÏkÕ1ÐkÙ1ÑkÖ1Ò^1Ó^‡1Ôuù1Õ•í1Öe]1×_ 1Ø_Å1ÙŸ1ÚXÁ1ÛÂ1Ü1Ý–[1Þ—­1ß¹1à1á,1âbA1ãO¿1äSØ1åS^1æ¨1ç©1è«1éM1êh1ë_j1ì˜1íˆh1îœÖ1ïa‹1ðR+1ñv*1ò_l1óeŒ1ôoÒ1õnè1ö[¾1÷dH1øQu1ùQ°1úgÄ1ûN1üyÉ1ý™|1þp³2@w]2Aw^2Bw_2Cw`2Dwd2Ewg2Fwi2Gwj2Hwm2Iwn2Jwo2Kwp2Lwq2Mwr2Nws2Owt2Pwu2Qwv2Rww2Swx2Twz2Uw{2Vw|2Ww2Xw‚2Ywƒ2Zw†2[w‡2\wˆ2]w‰2^wŠ2_w‹2`w2aw2bw“2cw”2dw•2ew–2fw—2gw˜2hw™2iwš2jw›2kwœ2lw2mwž2nw¡2ow£2pw¤2qw¦2rw¨2sw«2tw­2uw®2vw¯2ww±2xw²2yw´2zw¶2{w·2|w¸2}w¹2~wº2€w¼2w¾2‚wÀ2ƒwÁ2„wÂ2…wÃ2†wÄ2‡wÅ2ˆwÆ2‰wÇ2ŠwÈ2‹wÉ2ŒwÊ2wË2ŽwÌ2wÎ2wÏ2‘wÐ2’wÑ2“wÒ2”wÓ2•wÔ2–wÕ2—wÖ2˜wØ2™wÙ2šwÚ2›wÝ2œwÞ2wß2žwà2Ÿwá2 wä2¡uÅ2¢^v2£s»2¤ƒà2¥d­2¦bè2§”µ2¨lâ2©SZ2ªRÃ2«d2¬”Â2­{”2®O/2¯^2°‚62±2²Š2³n$2´lÊ2µšs2¶cU2·S\2¸Tú2¹ˆe2ºWà2»N 2¼^2½ke2¾|?2¿è2À`2Ádæ2Âs2ÈÁ2ÄgP2ÅbM2Æ"2Çwl2ÈŽ)2É‘Ç2Ê_i2˃Ü2Ì…!2Í™2ÎSÂ2φ•2Ðk‹2Ñ`í2Ò`è2Óp2Ô‚Í2Õ‚12ÖNÓ2×l§2Ø…Ï2ÙdÍ2Ú|Ù2Ûiý2Üfù2݃I2ÞS•2ß{V2àO§2áQŒ2âmK2ã\B2äŽm2åcÒ2æSÉ2çƒ,2èƒ62égå2êx´2ëd=2ì[ß2í\”2î]î2ï‹ç2ðbÆ2ñgô2òŒz2ód2ôcº2õ‡I2ö™‹2÷Œ2ø 2ù”ò2úN§2û–2ü˜¤2ýf 2þs3@wæ3Awè3Bwê3Cwï3Dwð3Ewñ3Fwò3Gwô3Hwõ3Iw÷3Jwù3Kwú3Lwû3Mwü3Nx3Ox3Px3Qx3Rx3Sx3Tx 3Ux 3Vx3Wx3Xx3Yx3Zx3[x3\x3]x3^x 3_x!3`x"3ax$3bx(3cx*3dx+3ex.3fx/3gx13hx23ix33jx53kx63lx=3mx?3nxA3oxB3pxC3qxD3rxF3sxH3txI3uxJ3vxK3wxM3xxO3yxQ3zxS3{xT3|xX3}xY3~xZ3€x[3x\3‚x^3ƒx_3„x`3…xa3†xb3‡xc3ˆxd3‰xe3Šxf3‹xg3Œxh3xi3Žxo3xp3xq3‘xr3’xs3“xt3”xu3•xv3–xx3—xy3˜xz3™x{3šx}3›x~3œx3x€3žx3Ÿx‚3 xƒ3¡W:3¢\3£^83¤•3¥P3¦€ 3§S‚3¨e^3©uE3ªU13«P!3¬…3­b„3®”ž3¯g3°V23±on3²]â3³T53´p’3µf3¶bo3·d¤3¸c£3¹_{3ºoˆ3»ô3¼ã3½°3¾\3¿fh3À_ñ3Ál‰3–H3Ã3Ĉl3Åd‘3Æyð3ÇWÎ3ÈjY3Éb3ÊTH3ËNX3Ìz 3Í`é3Îo„3Ï‹Ú3Ðb3Ñ3Òš‹3Óyä3ÔT3Õuô3Öc3×S3Øl`3Ùß3Ú_3Ûšp3Ü€;3ÝŸ3ÞOˆ3ß\:3àd3áÅ3âe¥3ãp½3äQE3åQ²3æ†k3ç]3è[ 3éb½3ê‘l3ëut3ìŽ 3íz 3îa3ï{y3ðNÇ3ñ~ø3òw…3óN3ôí3õR3öQú3÷jq3øS¨3ùއ3ú•3û–Ï3ünÁ3ý–d3þiZ4@x„4Ax…4Bx†4Cxˆ4DxŠ4Ex‹4Fx4Gx4Hx’4Ix”4Jx•4Kx–4Lx™4Mx4Nxž4Ox 4Px¢4Qx¤4Rx¦4Sx¨4Tx©4Uxª4Vx«4Wx¬4Xx­4Yx®4Zx¯4[xµ4\x¶4]x·4^x¸4_xº4`x»4ax¼4bx½4cx¿4dxÀ4exÂ4fxÃ4gxÄ4hxÆ4ixÇ4jxÈ4kxÌ4lxÍ4mxÎ4nxÏ4oxÑ4pxÒ4qxÓ4rxÖ4sx×4txØ4uxÚ4vxÛ4wxÜ4xxÝ4yxÞ4zxß4{xà4|xá4}xâ4~xã4€xä4xå4‚xæ4ƒxç4„xé4…xê4†xë4‡xí4ˆxî4‰xï4Šxð4‹xñ4Œxó4xõ4Žxö4xø4xù4‘xû4’xü4“xý4”xþ4•xÿ4–y4—y4˜y4™y4šy4›y4œy4y 4žy 4Ÿy 4 y 4¡x@4¢P¨4£w×4¤d4¥‰æ4¦Y4§cã4¨]Ý4©z4ªi=4«O 4¬‚94­U˜4®N24¯u®4°z—4±^b4²^Š4³•ï4´R4µT94¶pŠ4·cv4¸•$4¹W‚4ºf%4»i?4¼‘‡4½U4¾mó4¿~¯4Àˆ"4Áb34Â~ð4Ãuµ4ă(4ÅxÁ4Æ–Ì4Çž4ÈaH4Ét÷4Ê‹Í4Ëkd4ÌR:4ÍP4Îk!4Ï€j4Єq4ÑVñ4ÒS4ÓNÎ4ÔN4ÕQÑ4Ö|—4ב‹4Ø|4ÙOÃ4ÚŽ4Û{á4Üzœ4Ýdg4Þ]4ßP¬4à4áv4â|¹4ãmì4äà4ågQ4æ[X4ç[ø4èxË4éd®4êd4ëcª4ìc+4í•4îd-4ï¾4ð{T4ñv)4òbS4óY'4ôTF4õky4öP£4÷b44ø^&4ùk†4úNã4û74üˆ‹4ý_…4þ.5@y 5Ay5By5Cy5Dy5Ey5Fy5Gy5Hy5Iy5Jy5Ky5Ly5My5Ny5Oy5Py5Qy 5Ry!5Sy"5Ty#5Uy%5Vy&5Wy'5Xy(5Yy)5Zy*5[y+5\y,5]y-5^y.5_y/5`y05ay15by25cy35dy55ey65fy75gy85hy95iy=5jy?5kyB5lyC5myD5nyE5oyG5pyJ5qyK5ryL5syM5tyN5uyO5vyP5wyQ5xyR5yyT5zyU5{yX5|yY5}ya5~yc5€yd5yf5‚yi5ƒyj5„yk5…yl5†yn5‡yp5ˆyq5‰yr5Šys5‹yt5Œyu5yv5Žyy5y{5y|5‘y}5’y~5“y5”y‚5•yƒ5–y†5—y‡5˜yˆ5™y‰5šy‹5›yŒ5œy5yŽ5žy5Ÿy‘5 y’5¡` 5¢€=5£bÅ5¤N95¥SU5¦ø5§c¸5¨€Æ5©eæ5ªl.5«OF5¬`î5­má5®‹Þ5¯_95°†Ë5±_S5²c!5³QZ5´ƒa5µhc5¶R5·cc5¸ŽH5¹P5º\›5»yw5¼[ü5½R05¾z;5¿`¼5ÀS5Áv×5Â_·5Ã_—5Äv„5ÅŽl5Æpo5Çv{5È{I5Éwª5ÊQó5Ë“5ÌX$5ÍON5Înô5Ïê5ÐeL5Ñ{5ÒrÄ5Óm¤5Ôß5ÕZá5Öbµ5×^•5ØW05Ù„‚5Ú{,5Û^5Ü_5Ý5Þ5ߘ 5àc‚5ánÇ5âx˜5ãp¹5äQx5å—[5æW«5çu55èOC5éu85ê^—5ë`æ5ìY`5ímÀ5îk¿5ïx‰5ðSü5ñ–Õ5òQË5óR5ôc‰5õT 5ö”“5÷Œ5øÌ5ùr95úxŸ5û‡v5üí5ýŒ 5þSà6@y“6Ay”6By•6Cy–6Dy—6Ey˜6Fy™6Gy›6Hyœ6Iy6Jyž6KyŸ6Ly 6My¡6Ny¢6Oy£6Py¤6Qy¥6Ry¦6Sy¨6Ty©6Uyª6Vy«6Wy¬6Xy­6Yy®6Zy¯6[y°6\y±6]y²6^y´6_yµ6`y¶6ay·6by¸6cy¼6dy¿6eyÂ6fyÄ6gyÅ6hyÇ6iyÈ6jyÊ6kyÌ6lyÎ6myÏ6nyÐ6oyÓ6pyÔ6qyÖ6ry×6syÙ6tyÚ6uyÛ6vyÜ6wyÝ6xyÞ6yyà6zyá6{yâ6|yå6}yè6~yê6€yì6yî6‚yñ6ƒyò6„yó6…yô6†yõ6‡yö6ˆy÷6‰yù6Šyú6‹yü6Œyþ6yÿ6Žz6z6z6‘z6’z6“z 6”z 6•z 6–z6—z6˜z6™z6šz6›z6œz6z6žz6Ÿz6 z6¡N6¢vï6£Sî6¤”‰6¥˜v6¦Ÿ6§•-6¨[š6©‹¢6ªN"6«N6¬Q¬6­„c6®aÂ6¯R¨6°h 6±O—6²`k6³Q»6´m6µQ\6¶b–6·e—6¸–a6¹ŒF6º6»uØ6¼ý6½wc6¾kÒ6¿rŠ6Àrì6Á‹û6ÂX56Ãwy6ÄL6Åg\6Æ•@6Ç€š6È^¦6Én!6ÊY’6Ëzï6Ìwí6Í•;6Îkµ6Ïe­6Ð6ÑX6ÒQQ6Ó–6Ô[ù6ÕX©6ÖT(6׎r6Øef6Ù˜6ÚVä6Û”6Üvþ6ÝA6Þc‡6ßTÆ6àY6áY:6âW›6㎲6äg56åú6æ‚56çRA6è`ð6éX6ê†þ6ë\è6ìžE6íOÄ6î˜66ðZ%6ñ`v6òS„6ób|6ôO6õ‘6ö™6÷`i6ø€ 6ùQ?6ú€36û\6ü™u6ým16þNŒ7@z7Az7Bz!7Cz"7Dz$7Ez%7Fz&7Gz'7Hz(7Iz)7Jz*7Kz+7Lz,7Mz-7Nz.7Oz/7Pz07Qz17Rz27Sz47Tz57Uz67Vz87Wz:7Xz>7Yz@7ZzA7[zB7\zC7]zD7^zE7_zG7`zH7azI7bzJ7czK7dzL7ezM7fzN7gzO7hzP7izR7jzS7kzT7lzU7mzV7nzX7ozY7pzZ7qz[7rz\7sz]7tz^7uz_7vz`7wza7xzb7yzc7zzd7{ze7|zf7}zg7~zh7€zi7zj7‚zk7ƒzl7„zm7…zn7†zo7‡zq7ˆzr7‰zs7Šzu7‹z{7Œz|7z}7Žz~7z‚7z…7‘z‡7’z‰7“zŠ7”z‹7•zŒ7–zŽ7—z7˜z7™z“7šz”7›z™7œzš7z›7žzž7Ÿz¡7 z¢7¡07¢SÑ7£Z7¤{O7¥O7¦NO7§–7¨lÕ7©sÐ7ª…é7«^7¬uj7­û7®j 7¯wþ7°”’7±~A7²Qá7³pæ7´SÍ7µÔ7¶ƒ7·)7¸r¯7¹™m7ºlÛ7»WJ7¼‚³7½e¹7¾€ª7¿b?7À–27ÁY¨7ÂNÿ7Ë¿7Ä~º7Åe>7ƃò7Ç—^7ÈUa7ɘÞ7Ê€¥7ËS*7Ì‹ý7ÍT 7΀º7Ï^Ÿ7Ðl¸7Ñ97Ò‚¬7Ó‘Z7ÔT)7Õl7ÖR7×~·7ØW_7Ùq7Úl~7Û|‰7ÜYK7ÝNý7Þ_ÿ7ßa$7à|ª7áN07â\7ãg«7ä‡7å\ð7æ• 7ç˜Î7èu¯7épý7ê"7ëQ¯7ì7틽7îYI7ïQä7ðO[7ñT&7òY+7óew7ô€¤7õ[u7öbv7÷bÂ7ø7ù^E7úl7û{&7üO7ýOØ7þg 8@z£8Az¤8Bz§8Cz©8Dzª8Ez«8Fz®8Gz¯8Hz°8Iz±8Jz²8Kz´8Lzµ8Mz¶8Nz·8Oz¸8Pz¹8Qzº8Rz»8Sz¼8Tz½8Uz¾8VzÀ8WzÁ8XzÂ8YzÃ8ZzÄ8[zÅ8\zÆ8]zÇ8^zÈ8_zÉ8`zÊ8azÌ8bzÍ8czÎ8dzÏ8ezÐ8fzÑ8gzÒ8hzÓ8izÔ8jzÕ8kz×8lzØ8mzÚ8nzÛ8ozÜ8pzÝ8qzá8rzâ8szä8tzç8uzè8vzé8wzê8xzë8yzì8zzî8{zð8|zñ8}zò8~zó8€zô8zõ8‚zö8ƒz÷8„zø8…zû8†zü8‡zþ8ˆ{8‰{8Š{8‹{8Œ{8{ 8Ž{ 8{ 8{8‘{8’{8“{8”{8•{8–{8—{8˜{8™{8š{8›{!8œ{"8{#8ž{'8Ÿ{)8 {-8¡mn8¢mª8£y8¤ˆ±8¥_8¦u+8§bš8¨…8©Oï8ª‘Ü8«e§8¬/8­Q8®^œ8¯P8°t8±Ro8²‰†8³K8´Y 8µP…8¶NØ8·–8¸r68¹y8º8»[Ì8¼‹£8½–D8¾Y‡8¿8ÀT8ÁVv8ÂV8Ëå8Äe98Åi‚8Æ”™8ÇvÖ8Èn‰8É^r8Êu8ËgF8ÌgÑ8Ízÿ8΀8Ïv8Ða8ÑyÆ8Òeb8Óc8ÔQˆ8ÕR8Ö”¢8×88Ø€›8Ù~²8Ú\—8Ûn/8Üg`8Ý{Ù8Þv‹8ßšØ8à8á”8â|Õ8ãd8ä•P8åz?8æTJ8çTå8èkL8éd8êb8ëž=8ì€ó8íu™8îRr8ï—i8ð„[8ñh<8ò†ä8ó–8ô–”8õ”ì8öN*8÷T8ø~Ù8ùh98úß8û€8üfô8ý^š8þ¹9@{/9A{09B{29C{49D{59E{69F{79G{99H{;9I{=9J{?9K{@9L{A9M{B9N{C9O{D9P{F9Q{H9R{J9S{M9T{N9U{S9V{U9W{W9X{Y9Y{\9Z{^9[{_9\{a9]{c9^{d9_{e9`{f9a{g9b{h9c{i9d{j9e{k9f{l9g{m9h{o9i{p9j{s9k{t9l{v9m{x9n{z9o{|9p{}9q{9r{9s{‚9t{ƒ9u{„9v{†9w{‡9x{ˆ9y{‰9z{Š9{{‹9|{Œ9}{Ž9~{9€{‘9{’9‚{“9ƒ{–9„{˜9…{™9†{š9‡{›9ˆ{ž9‰{Ÿ9Š{ 9‹{£9Œ{¤9{¥9Ž{®9{¯9{°9‘{²9’{³9“{µ9”{¶9•{·9–{¹9—{º9˜{»9™{¼9š{½9›{¾9œ{¿9{À9ž{Â9Ÿ{Ã9 {Ä9¡WÂ9¢€?9£h—9¤]å9¥e;9¦RŸ9§`m9¨Ÿš9©O›9ªŽ¬9«Ql9¬[«9­_9®]é9¯l^9°bñ9±!9²Qq9³”©9´Rþ9µlŸ9¶‚ß9·r×9¸W¢9¹g„9º-9»Y9¼œ9½ƒÇ9¾T•9¿{9ÀO09Ál½9Â[d9ÃYÑ9ÄŸ9ÅSä9ƆÊ9Çš¨9ÈŒ79É€¡9ÊeE9˘~9ÌVú9Í–Ç9ÎR.9ÏtÜ9ÐRP9Ñ[á9Òc9Ó‰9ÔNV9ÕbÐ9Ö`*9×hú9ØQs9Ù[˜9ÚQ 9Û‰Â9Ü{¡9Ý™†9ÞP9ß`ï9àpL9á/9âQI9ã^9ä9åtp9æ‰Ä9çW-9èxE9é_R9꟟9ë•ú9ìh9í›<9î‹á9ïvx9ðhB9ñgÜ9òê9ó59ôR=9õŠ9önÚ9÷hÍ9ø•9ùí9úVý9ûgœ9üˆù9ýÇ9þTÈ:@{Å:A{È:B{É:C{Ê:D{Ë:E{Í:F{Î:G{Ï:H{Ð:I{Ò:J{Ô:K{Õ:L{Ö:M{×:N{Ø:O{Û:P{Ü:Q{Þ:R{ß:S{à:T{â:U{ã:V{ä:W{ç:X{è:Y{é:Z{ë:[{ì:\{í:]{ï:^{ð:_{ò:`{ó:a{ô:b{õ:c{ö:d{ø:e{ù:f{ú:g{û:h{ý:i{ÿ:j|:k|:l|:m|:n|:o|:p|:q|:r| :s| :t| :u|:v|:w|:x|:y|:z|:{|:||:}|:~|:€|:|:‚|:ƒ|:„|:…| :†|!:‡|":ˆ|#:‰|$:Š|%:‹|(:Œ|):|+:Ž|,:|-:|.:‘|/:’|0:“|1:”|2:•|3:–|4:—|5:˜|6:™|7:š|9:›|::œ|;:|<:ž|=:Ÿ|>: |B:¡š¸:¢[i:£mw:¤l&:¥N¥:¦[³:§š‡:¨‘c:©a¨:ª¯:«—é:¬T+:­mµ:®[Ò:¯Qý:°UŠ:±U:²ð:³d¼:´cM:µeñ:¶a¾:·`:¸q :¹lW:ºlI:»Y/:¼gm:½‚*:¾XÕ:¿VŽ:ÀŒj:Ákë:ÂÝ:ÃY}:Ä€:ÅS÷:Æmi:ÇTu:ÈU:Ƀw:ʃÏ:Ëh8:Ìy¾:ÍTŒ:ÎOU:ÏT:ÐvÒ:ÑŒ‰:Ò–:Ól³:Ôm¸:Õk:Ö‰:מd:Ø::ÙV?:ÚžÑ:ÛuÕ:Ü_ˆ:Ýrà:Þ`h:ßTü:àN¨:áj*:âˆa:ã`R:äp:åTÄ:æpØ:ç†y:èž?:ém*:ê[:ë_:ì~¢:íU‰:îO¯:ïs4:ðT<:ñSš:òP:óT:ôT|:õNN:ö_ý:÷tZ:øXö:ù„k:ú€á:û‡t:ürÐ:ý|Ê:þnV;@|C;A|D;B|E;C|F;D|G;E|H;F|I;G|J;H|K;I|L;J|N;K|O;L|P;M|Q;N|R;O|S;P|T;Q|U;R|V;S|W;T|X;U|Y;V|Z;W|[;X|\;Y|];Z|^;[|_;\|`;]|a;^|b;_|c;`|d;a|e;b|f;c|g;d|h;e|i;f|j;g|k;h|l;i|m;j|n;k|o;l|p;m|q;n|r;o|u;p|v;q|w;r|x;s|y;t|z;u|~;v|;w|€;x|;y|‚;z|ƒ;{|„;||…;}|†;~|‡;€|ˆ;|Š;‚|‹;ƒ|Œ;„|;…|Ž;†|;‡|;ˆ|“;‰|”;Š|–;‹|™;Œ|š;|›;Ž| ;|¡;|£;‘|¦;’|§;“|¨;”|©;•|«;–|¬;—|­;˜|¯;™|°;š|´;›|µ;œ|¶;|·;ž|¸;Ÿ|º; |»;¡_';¢†N;£U,;¤b¤;¥N’;¦lª;§b7;¨‚±;©T×;ªSN;«s>;¬nÑ;­u;;®R;¯S;°‹Ý;±iÐ;²_Š;³`;´mî;µWO;¶k";·s¯;¸hS;¹Ø;º;»cb;¼`£;½U$;¾uê;¿Œb;Àq;Ám£;Â[¦;Ã^{;ăR;ÅaL;ÆžÄ;Çxú;ȇW;É|';Êv‡;ËQð;Ì`ö;ÍqL;ÎfC;Ï^L;Ð`M;ÑŒ;Òpp;Óc%;Ô‰;Õ_½;Ö`b;׆Ô;ØVÞ;ÙkÁ;Ú`”;Ûag;ÜSI;Ý`à;Þff;ß?;àyý;áO;âpé;ãlG;䋳;å‹ò;æ~Ø;çƒd;èf;éZZ;ê›B;ëmQ;ìm÷;íŒA;îm;;ïO;ðpk;ñƒ·;òb;ó`Ñ;ô— ;õ';öyx;÷Qû;øW>;ùWú;úg:;ûux;üz=;ýyï;þ{•<@|¿<×u2<Ø”¾<ÙPG<Úz<<ÛN÷<Üg¶<Ýš~<ÞZÁ<ßk|<àvÑ<áWZ<â\<ã{:<ä•ô<åqN<æQ|<瀩<è‚p<éYx<ê<ëƒ'<ìhÀ<ígì<îx±<ïxw<ðbã<ñca<ò{€<óOí<ôRj<õQÏ<öƒP<÷iÛ<ø’t<ùõ<ú1<û‰Á<ü•.<ý{­<þNö=@}7=A}8=B}9=C}:=D};=E}<=F}==G}>=H}?=I}@=J}A=K}B=L}C=M}D=N}E=O}F=P}G=Q}H=R}I=S}J=T}K=U}L=V}M=W}N=X}O=Y}P=Z}Q=[}R=\}S=]}T=^}U=_}V=`}W=a}X=b}Y=c}Z=d}[=e}\=f}]=g}^=h}_=i}`=j}a=k}b=l}c=m}d=n}e=o}f=p}g=q}h=r}i=s}j=t}k=u}l=v}m=w}o=x}p=y}q=z}r={}s=|}t=}}u=~}v=€}x=}y=‚}z=ƒ}{=„}|=…}}=†}~=‡}=ˆ}€=‰}=Š}‚=‹}ƒ=Œ}„=}…=Ž}†=}‡=}ˆ=‘}‰=’}Š=“}‹=”}Œ=•}=–}Ž=—}=˜}=™}‘=š}’=›}“=œ}”=}•=ž}–=Ÿ}—= }˜=¡Pe=¢‚0=£RQ=¤™o=¥n=¦n…=§m§=¨^ú=©Põ=ªYÜ=«\=¬mF=­l_=®u†=¯„‹=°hh=±YV=²‹²=³S =´‘q=µ–M=¶…I=·i=¸y=¹q&=º€ö=»N¤=¼Ê=½mG=¾š„=¿Z=ÀV¼=Ád=”ð=Ãwë=ÄO¥=Å=Ærá=ljÒ=È™z=É4=Ê~Þ=ËR=ÌeY=Í‘u=Î=σ=ÐSë=Ñz–=Òcí=Óc¥=Ôv†=Õyø=ÖˆW=×–6=Øb*=ÙR«=Ú‚‚=ÛhT=Ügp=Ýcw=Þwk=ßzí=àm=á~Ó=â‰ã=ãYÐ=äb=å…É=æ‚¥=çuL=èP=éNË=êu¥=ë‹ë=ì\J=í]þ=î{K=ïe¤=ð‘Ñ=ñNÊ=òm%=ó‰_=ô}'=õ•&=öNÅ=÷Œ(=øÛ=ù—s=úfK=ûy=üÑ=ýpì=þmx>@}™>A}š>B}›>C}œ>D}>E}ž>F}Ÿ>G} >H}¡>I}¢>J}£>K}¤>L}¥>M}§>N}¨>O}©>P}ª>Q}«>R}¬>S}­>T}¯>U}°>V}±>W}²>X}³>Y}´>Z}µ>[}¶>\}·>]}¸>^}¹>_}º>`}»>a}¼>b}½>c}¾>d}¿>e}À>f}Á>g}Â>h}Ã>i}Ä>j}Å>k}Æ>l}Ç>m}È>n}É>o}Ê>p}Ë>q}Ì>r}Í>s}Î>t}Ï>u}Ð>v}Ñ>w}Ò>x}Ó>y}Ô>z}Õ>{}Ö>|}×>}}Ø>~}Ù>€}Ú>}Û>‚}Ü>ƒ}Ý>„}Þ>…}ß>†}à>‡}á>ˆ}â>‰}ã>Š}ä>‹}å>Œ}æ>}ç>Ž}è>}é>}ê>‘}ë>’}ì>“}í>”}î>•}ï>–}ð>—}ñ>˜}ò>™}ó>š}ô>›}õ>œ}ö>}÷>ž}ø>Ÿ}ù> }ú>¡\=>¢R²>£ƒF>¤Qb>¥ƒ>¦w[>§fv>¨œ¸>©N¬>ª`Ê>«|¾>¬|³>­~Ï>®N•>¯‹f>°fo>±˜ˆ>²—Y>³Xƒ>´el>µ•\>¶_„>·uÉ>¸—V>¹zß>ºzÞ>»QÀ>¼p¯>½z˜>¾cê>¿zv>À~ >Ás–>—í>ÃNE>Äpx>ÅN]>Æ‘R>ÇS©>ÈeQ>Éeç>Êü>Ë‚>ÌTŽ>Í\1>Îuš>Ï— >ÐbØ>ÑrÙ>Òu½>Ó\E>Ôšy>ÕƒÊ>Ö\@>×T€>Øwé>ÙN>>Úl®>Û€Z>ÜbÒ>Ýcn>Þ]è>ßQw>àÝ>áŽ>â•/>ãOñ>äSå>å`ç>æp¬>çRg>ècP>éžC>êZ>ëP&>ìw7>íSw>î~â>ïd…>ðe+>ñb‰>òc˜>óP>ôr5>õ‰É>öQ³>÷‹À>ø~Ý>ùWG>úƒÌ>û”§>üQ›>ýT>þ\û?@}û?A}ü?B}ý?C}þ?D}ÿ?E~?F~?G~?H~?I~?J~?K~?L~?M~?N~ ?O~ ?P~ ?Q~ ?R~ ?S~?T~?U~?V~?W~?X~?Y~?Z~?[~?\~?]~?^~?_~?`~?a~?b~?c~?d~?e~ ?f~!?g~"?h~#?i~$?j~%?k~&?l~'?m~(?n~)?o~*?p~+?q~,?r~-?s~.?t~/?u~0?v~1?w~2?x~3?y~4?z~5?{~6?|~7?}~8?~~9?€~:?~?„~??…~@?†~B?‡~C?ˆ~D?‰~E?Š~F?‹~H?Œ~I?~J?Ž~K?~L?~M?‘~N?’~O?“~P?”~Q?•~R?–~S?—~T?˜~U?™~V?š~W?›~X?œ~Y?~Z?ž~[?Ÿ~\? ~]?¡OÊ?¢zã?£mZ?¤á?¥š?¦U€?§T–?¨Sa?©T¯?ª_?«cé?¬iw?­Qï?®ah?¯R ?°X*?±RØ?²WN?³x ?´w ?µ^·?¶aw?·|à?¸b[?¹b—?ºN¢?»p•?¼€?½b÷?¾pä?¿—`?ÀWw?Á‚Û?Âgï?Ãhõ?ÄxÕ?Ř—?ÆyÑ?ÇXó?ÈT³?ÉSï?Ên4?ËQK?ÌR;?Í[¢?΋þ?Ï€¯?ÐUC?ÑW¦?Ò`s?ÓWQ?ÔT-?Õzz?Ö`P?×[T?Øc§?Ùb ?ÚSã?Ûbc?Ü[Ç?Ýg¯?ÞTí?ßzŸ?à‚æ?á‘w?â^“?ãˆä?äY8?åW®?æc?çè?è€ï?éWW?ê{w?ëO©?ì_ë?í[½?îk>?ïS!?ð{P?ñrÂ?òhF?ówÿ?ôw6?õe÷?öQµ?÷N?øvÔ?ù\¿?úz¥?û„u?üYN?ý›A?þP€@@~^@A~_@B~`@C~a@D~b@E~c@F~d@G~e@H~f@I~g@J~h@K~i@L~j@M~k@N~l@O~m@P~n@Q~o@R~p@S~q@T~r@U~s@V~t@W~u@X~v@Y~w@Z~x@[~y@\~z@]~{@^~|@_~}@`~~@a~@b~€@c~@d~ƒ@e~„@f~…@g~†@h~‡@i~ˆ@j~‰@k~Š@l~‹@m~Œ@n~@o~Ž@p~@q~@r~‘@s~’@t~“@u~”@v~•@w~–@x~—@y~˜@z~™@{~š@|~œ@}~@~~ž@€~®@~´@‚~»@ƒ~¼@„~Ö@…~ä@†~ì@‡~ù@ˆ @‰@Š@‹7@Œ9@;@Ž<@=@>@‘?@’@@“A@”C@•F@–G@—H@˜I@™J@šK@›L@œM@N@žO@ŸR@ S@¡™ˆ@¢a'@£nƒ@¤Wd@¥f@¦cF@§Vð@¨bì@©bi@ª^Ó@«–@¬Wƒ@­bÉ@®U‡@¯‡!@°J@±£@²Uf@³ƒ±@´ge@µV@¶„Ý@·Zj@¸h@¹bæ@º{î@»–@¼Qp@½oœ@¾Œ0@¿cý@À‰È@ÁaÒ@Â@ÃpÂ@Änå@Åt@Æi”@Çrü@È^Ê@ÉÎ@Êg@Ëmj@Ìc^@ÍR³@Îrb@Ï€@ÐOl@ÑYå@Ò‘j@ÓpÙ@Ôm@ÕRÒ@ÖNP@×–÷@Ø•m@Ù…~@ÚxÊ@Û}/@ÜQ!@ÝW’@ÞdÂ@߀‹@à|{@álê@âhñ@ãi^@äQ·@åS˜@æh¨@çr@èžÎ@é{ñ@êrø@ëy»@ìo@ít@îgN@ï‘Ì@ðœ¤@ñy<@òƒ‰@óƒT@ôT@õh@öN=@÷S‰@øR±@ùx>@úS†@ûR)@üPˆ@ýO‹@þOÐA@VAAYAB[AC\AD]AE^AF`AGcAHdAIeAJfAKgALkAMlANmAOoAPpAQsARuASvATwAUxAVzAW{AX|AY}AZA[€A\‚A]ƒA^„A_…A`†Aa‡AbˆAc‰Ad‹AeAfAgAh‘Ai’Aj“Ak•Al–Am—An˜Ao™Ap›AqœAr As¢At£Au¥Av¦Aw¨Ax©AyªAz«A{¬A|­A}®A~±A€³A´A‚µAƒ¶A„·A…ºA†»A‡¾AˆÀA‰ÂAŠÃA‹ÄAŒÆAÇAŽÈAÉAËA‘ÍA’ÏA“ÐA”ÑA•ÒA–ÓA—ÖA˜×A™ÙAšÚA›ÛAœÜAÝAžÞAŸâA ãA¡uâA¢zËA£|’A¤l¥A¥–¶A¦R›A§tƒA¨TéA©OéAª€TA«ƒ²A¬ÞA­•pA®^ÉA¯`A°mŸA±^A²e[A³8A´”þAµ`KA¶p¼A·~ÃA¸|®A¹QÉAºhA»|±A¼‚oA½N$A¾†A¿‘ÏAÀf~AÁN®AÂŒAÃd©AÄ€JAÅPÚAÆu—AÇqÎAÈ[åAɽAÊofAËN†AÌd‚AÍ•cAÎ^ÖAÏe™AÐRAшÂAÒpÈAÓR£AÔsAÕt3AÖg—A×x÷AØ—AÙN4AÚ»AÛœÞAÜmËAÝQÛAÞAAßTAàbÎAás²AâƒñAã–öA䟄Aå”ÃAæO6AçšAèQÌAépuAê–uAë\­A옆AíSæAîNäAïnœAðt Añi´AòxkAó™AôuYAõRAöv$A÷mAAøgóAùQmAúŸ™Aû€KAüT™Aý{Bp€@Bq€ABr€DBs€EBt€GBu€HBv€IBw€NBx€OBy€PBz€QB{€SB|€UB}€VB~€WB€€YB€[B‚€\Bƒ€]B„€^B…€_B†€`B‡€aBˆ€bB‰€cBŠ€dB‹€eBŒ€fB€gBŽ€hB€kB€lB‘€mB’€nB“€oB”€pB•€rB–€sB—€tB˜€uB™€vBš€wB›€xBœ€yB€zBž€{BŸ€|B €}B¡–†B¢W„B£bâB¤–GB¥i|B¦ZB§dB¨{ÓB©oBª–KB«‚¦B¬SbB­˜…B®^B¯p‰B°c³B±SdB²†OB³œB´ž“BµxŒB¶—2B·ïB¸BB¹žBºo^B»y„B¼_UB½–FB¾b.B¿štBÀTBÁ”ÝBÂO£BÃeÅBÄ\eBÅ\aBÆBdžQBÈl/BÉ_‹BÊs‡BËnäBÌ~ÿBÍ\æBÎcBÏ[jBÐnæBÑSuBÒNqBÓc BÔueBÕb¡BÖnB×O&BØNÑBÙl¦BÚ~¶BÛ‹ºBÜ„B݇ºBÞWBß;Bà•#Bá{©Bâš¡BãˆøBä„=BåmB暆Bç~ÜBèYˆBéž»Bês›BëxB솂BíšlBîš‚BïVBðTBñWËBòNpBóž¦BôSVBõÈBö B÷w’Bø™’Bù†îBúnáBû…BüfüBýabBþo+C@€~CA€CB€‚CC€…CD€ˆCE€ŠCF€CG€ŽCH€CI€CJ€‘CK€’CL€”CM€•CN€—CO€™CP€žCQ€£CR€¦CS€§CT€¨CU€¬CV€°CW€³CX€µCY€¶CZ€¸C[€¹C\€»C]€ÅC^€ÇC_€ÈC`€ÉCa€ÊCb€ËCc€ÏCd€ÐCe€ÑCf€ÒCg€ÓCh€ÔCi€ÕCj€ØCk€ßCl€àCm€âCn€ãCo€æCp€îCq€õCr€÷Cs€ùCt€ûCu€þCv€ÿCwCxCyCzC{C|C}C~ C€ CC‚CƒC„C…C†C‡Cˆ C‰!CŠ"C‹#CŒ$C%CŽ&C'C(C‘)C’*C“+C”-C•.C–0C—3C˜4C™5Cš7C›9Cœ:C;CžEÊeEËoXEÌvØEÍxÐEÎvüEÏuTEÐR$EÑSÛEÒNSEÓ^žEÔeÁEÕ€*EÖ€ÖE×b›EØT†EÙR(EÚp®EÛˆEÜÑEÝláEÞTxE߀ÚEàWùEáˆôEâTEã–jEä‘MEåOiEæl›EçU·EèvÆEéx0Eêb¨EëpùEìoŽEí_mEî„ìEïhÚEðx|Eñ{÷Eò¨Eóg EôžOEõcgEöx°E÷WoEøxEù—9EúbyEûb«EüRˆEýt5Eþk×F@‚jFA‚kFB‚lFC‚mFD‚qFE‚uFF‚vFG‚wFH‚xFI‚{FJ‚|FK‚€FL‚FM‚ƒFN‚…FO‚†FP‚‡FQ‚‰FR‚ŒFS‚FT‚“FU‚”FV‚•FW‚–FX‚šFY‚›FZ‚žF[‚ F\‚¢F]‚£F^‚§F_‚²F`‚µFa‚¶Fb‚ºFc‚»Fd‚¼Fe‚¿Ff‚ÀFg‚ÂFh‚ÃFi‚ÅFj‚ÆFk‚ÉFl‚ÐFm‚ÖFn‚ÙFo‚ÚFp‚ÝFq‚âFr‚çFs‚èFt‚éFu‚êFv‚ìFw‚íFx‚îFy‚ðFz‚òF{‚óF|‚õF}‚öF~‚øF€‚úF‚üF‚‚ýFƒ‚þF„‚ÿF…ƒF†ƒ F‡ƒ Fˆƒ F‰ƒFŠƒF‹ƒFŒƒFƒFŽƒFƒFƒF‘ƒF’ƒ F“ƒ!F”ƒ"F•ƒ#F–ƒ$F—ƒ%F˜ƒ&F™ƒ)Fšƒ*F›ƒ.Fœƒ0Fƒ2Fžƒ7FŸƒ;F ƒ=F¡UdF¢>F£u²F¤v®F¥S9F¦uÞF§PûF¨\AF©‹lFª{ÇF«POF¬rGF­š—F®˜ØF¯oF°tâF±yhF²d‡F³w¥F´büFµ˜‘F¶+F·TÁF¸€XF¹NRFºWjF»‚ùF¼„ F½^sF¾QíF¿töFÀ‹ÄFÁ\OFÂWaFÃlüFʇFÅZFFÆx4FÇ›DFÈëFÉ|•FÊRVFËbQFÌ”úFÍNÆF΃†FÏ„aFЃéFÑ„²FÒWÔFÓg4FÔWFÕfnFÖmfF׌1FØfÝFÙpFÚgFÛk:FÜhFÝbFÞY»FßNFàQÄFáoFâgÒFãlFäQvFåhËFæYGFçkgFèufFé]FêFëŸPFìe×FíyHFîyAFïš‘FðwFñ\‚FòN^FóOFôT/FõYQFöx F÷VhFølFùÄFú_Fûl}FülãFý‹«FþcG@ƒ>GAƒ?GBƒAGCƒBGDƒDGEƒEGFƒHGGƒJGHƒKGIƒLGJƒMGKƒNGLƒSGMƒUGNƒVGOƒWGPƒXGQƒYGRƒ]GSƒbGTƒpGUƒqGVƒrGWƒsGXƒtGYƒuGZƒvG[ƒyG\ƒzG]ƒ~G^ƒG_ƒ€G`ƒGaƒ‚GbƒƒGcƒ„Gdƒ‡GeƒˆGfƒŠGgƒ‹GhƒŒGiƒGjƒGkƒGlƒ‘Gmƒ”Gnƒ•Goƒ–Gpƒ—Gqƒ™GrƒšGsƒGtƒŸGuƒ¡Gvƒ¢Gwƒ£Gxƒ¤Gyƒ¥Gzƒ¦G{ƒ§G|ƒ¬G}ƒ­G~ƒ®G€ƒ¯GƒµG‚ƒ»Gƒƒ¾G„ƒ¿G…ƒÂG†ƒÃG‡ƒÄGˆƒÆG‰ƒÈGŠƒÉG‹ƒËGŒƒÍGƒÎGŽƒÐGƒÑGƒÒG‘ƒÓG’ƒÕG“ƒ×G”ƒÙG•ƒÚG–ƒÛG—ƒÞG˜ƒâG™ƒãGšƒäG›ƒæGœƒçGƒèGžƒëGŸƒìG ƒíG¡`pG¢m=G£ruG¤bfG¥”ŽG¦”ÅG§SCG¨ÁG©{~GªNßG«Œ&G¬N~G­žÔG®”±G¯”³G°RMG±o\G²cG³mEG´Œ4GµXG¶]LG·k G¸kIG¹gªGºT[G»TG¼ŒG½X™G¾…7G¿_:GÀb¢GÁjGG•9GÃerGÄ`„GÅheGÆw§GÇNTGÈO¨GÉ]çGÊ—˜GËd¬GÌØGÍ\íGÎOÏGÏzGÐRGуGÒNGÓ`/GÔzƒGÕ”¦GÖOµG×N²GØyæGÙt4GÚRäGÛ‚¹GÜdÒGÝy½GÞ[ÝGßlGà—RGá{Gâl"GãP>GäSGånGædÎGçftGèl0Gé`ÅGê˜wGë‹÷Gì^†GítHu„?Hv„@Hw„AHx„BHy„CHz„DH{„EH|„GH}„HH~„IH€„JH„KH‚„LHƒ„MH„„NH…„OH†„PH‡„RHˆ„SH‰„THŠ„UH‹„VHŒ„XH„]HŽ„^H„_H„`H‘„bH’„dH“„eH”„fH•„gH–„hH—„jH˜„nH™„oHš„pH›„rHœ„tH„wHž„yHŸ„{H „|H¡SÖH¢Z6H£Ÿ‹H¤£H¥S»H¦WH§˜§H¨gCH©‘›HªlÉH«QhH¬uÊH­bóH®r¬H¯R8H°RH±:H²p”H³v8H´StHµžJH¶i·H·xnH¸–ÀH¹ˆÙHº¤H»q6H¼qÃH½Q‰H¾gÓH¿täHÀXäHÁeHÂV·HË©HÄ™vHÅbpHÆ~ÕHÇ`ùHÈpíHÉXìHÊNÁHËNºHÌ_ÍHÍ—çHÎNûHÏ‹¤HÐRHÑYŠHÒ~«HÓbTHÔNÍHÕeåHÖbH׃8HØ„ÉHÙƒcHÚ‡HÛq”HÜn¶HÝ[¹HÞ~ÒHßQ—HàcÉHágÔH Hãƒ9HäˆHåQHæ[zHçY‚Hè±HéNsHêl]HëQeHì‰%HíoHî–.Hï…JHðt^Hñ•Hò•ðHóm¦Hô‚åHõ_1Höd’H÷mHø„(HùnHúœÃHûX^Hü[HýN HþSÁI@„}IA„~IB„IC„€ID„IE„ƒIF„„IG„…IH„†II„ŠIJ„IK„IL„IM„‘IN„’IO„“IP„”IQ„•IR„–IS„˜IT„šIU„›IV„IW„žIX„ŸIY„ IZ„¢I[„£I\„¤I]„¥I^„¦I_„§I`„¨Ia„©Ib„ªIc„«Id„¬Ie„­If„®Ig„°Ih„±Ii„³Ij„µIk„¶Il„·Im„»In„¼Io„¾Ip„ÀIq„ÂIr„ÃIs„ÅIt„ÆIu„ÇIv„ÈIw„ËIx„ÌIy„ÎIz„ÏI{„ÒI|„ÔI}„ÕI~„×I€„ØI„ÙI‚„ÚIƒ„ÛI„„ÜI…„ÞI†„áI‡„âIˆ„äI‰„çIŠ„èI‹„éIŒ„êI„ëIŽ„íI„îI„ïI‘„ñI’„òI“„óI”„ôI•„õI–„öI—„÷I˜„øI™„ùIš„úI›„ûIœ„ýI„þIž…IŸ…I …I¡OI¢ecI£hQI¤UÓI¥N'I¦dI§ššI¨bkI©ZÂIªt_I«‚rI¬m©I­hîI®PçI¯ƒŽI°xI±g@I²R9I³l™I´~±IµP»I¶UeI·q^I¸{[I¹fRIºsÊI»‚ëI¼gII½\qI¾R I¿q}IÀˆkIÁ•êI–UIÃdÅIÄaIųIÆU„IÇlUIÈbGIÉ.IÊX’IËO$IÌUFIÍOIÎfLIÏN IÐ\IшóIÒh¢IÓcNIÔz IÕpçIÖ‚I×RúIØ—öIÙ\IÚTèIÛµIÜ~ÍIÝYbIÞJI߆ÇIà‚ Iá‚ IâfIãdDIä\IåaQIæm‰Içy>I苾Iéx7Iêu3IëT{IìO8I펫IîmñIïZ Ið~ÅIñy^IòlˆIó[¡IôZvIõuIö€¾I÷aNIønIùXðIúuIûu%IürrIýSGIþ~óJ@…JA…JB…JC…JD…JE…JF… JG… JH… JI… JJ…JK…JL…JM…JN…JO…JP…JQ…JR…JS…JT…JU…JV…JW… JX…"JY…#JZ…$J[…%J\…&J]…'J^…(J_…)J`…*Ja…-Jb….Jc…/Jd…0Je…1Jf…2Jg…3Jh…4Ji…5Jj…6Jk…>Jl…?Jm…@Jn…AJo…BJp…DJq…EJr…FJs…GJt…KJu…LJv…MJw…NJx…OJy…PJz…QJ{…RJ|…SJ}…TJ~…UJ€…WJ…XJ‚…ZJƒ…[J„…\J……]J†…_J‡…`Jˆ…aJ‰…bJŠ…cJ‹…eJŒ…fJ…gJŽ…iJ…jJ…kJ‘…lJ’…mJ“…nJ”…oJ•…pJ–…qJ—…sJ˜…uJ™…vJš…wJ›…xJœ…|J…}Jž…JŸ…€J …J¡wJ¢vÛJ£RiJ¤€ÜJ¥W#J¦^J§Y1J¨rîJ©e½JªnJ«‹×J¬\8J­†qJ®SAJ¯wóJ°bþJ±eöJ²NÀJ³˜ßJ´†€Jµ[žJ¶‹ÆJ·SòJ¸wâJ¹OJº\NJ»švJ¼YËJ½_J¾y:J¿XëJÀNJÁgÿJÂN‹JÃbíJÄŠ“JÅJÆR¿JÇf/JÈUÜJÉVlJÊJËNÕJÌOJÍ‘ÊJΙpJÏlJÐ^JÑ`CJÒ[¤JÓ‰ÆJÔ‹ÕJÕe6JÖbKJ×™–JØ[ˆJÙ[ÿJÚcˆJÛU.JÜS×JÝv&JÞQ}Jß…,Jàg¢Jáh³JâkŠJãb’Jä“JåSÔJæ‚JçmÑJèuJéNfJêNJë[pJìqŸJí…¯Jîf‘JïfÙJðrJñ‡JòžÍJóŸ Jô\^Jõg/JöðJ÷hJøg_Jùb JúzÖJûX…Jü^¶JýepJþo1K@…‚KA…ƒKB…†KC…ˆKD…‰KE…ŠKF…‹KG…ŒKH…KI…ŽKJ…KK…‘KL…’KM…“KN…”KO…•KP…–KQ…—KR…˜KS…™KT…šKU…KV…žKW…ŸKX… KY…¡KZ…¢K[…£K\…¥K]…¦K^…§K_…©K`…«Ka…¬Kb…­Kc…±Kd…²Ke…³Kf…´Kg…µKh…¶Ki…¸Kj…ºKk…»Kl…¼Km…½Kn…¾Ko…¿Kp…ÀKq…ÂKr…ÃKs…ÄKt…ÅKu…ÆKv…ÇKw…ÈKx…ÊKy…ËKz…ÌK{…ÍK|…ÎK}…ÑK~…ÒK€…ÔK…ÖK‚…×Kƒ…ØK„…ÙK……ÚK†…ÛK‡…ÝKˆ…ÞK‰…ßKŠ…àK‹…áKŒ…âK…ãKŽ…åK…æK…çK‘…èK’…êK“…ëK”…ìK•…íK–…îK—…ïK˜…ðK™…ñKš…òK›…óKœ…ôK…õKž…öKŸ…÷K …øK¡`UK¢R7K£€ K¤dTK¥ˆpK¦u)K§^K¨hK©bôKª—K«SÌK¬r=K­ŒK®l4K¯waK°zK±T.K²w¬K³˜zK´‚Kµ‹ôK¶xUK·gK¸pÁK¹e¯Kºd•K»V6K¼`K½yÁK¾SøK¿NKÀk{KÁ€†KÂ[úKÃUãKÄVÛKÅO:KÆOL}†?L~†@L€†AL†BL‚†CLƒ†DL„†EL…†FL††GL‡†HLˆ†IL‰†JLІKL‹†LLŒ†RL†SLކUL†VL†WL‘†XL’†YL“†[L”†\L•†]L–†_L—†`L˜†aL™†cLš†dL›†eLœ†fL†gLž†hLŸ†iL †jL¡smL¢cL£ŽKL¤ŽL¥€ÎL¦‚ÔL§b¬L¨SðL©lðLª‘^L«Y*L¬`L­lpL®WML¯dJL°*L±v+L²néL³W[L´j€LµuðL¶omL·Œ-L¸ŒL¹WfLºkïL»ˆ’L¼x³L½c¢L¾SùL¿p­LÀldLÁXXLÂd*LÃXLÄhàLÅ›LÆULÇ|ÖLÈPLÉŽºLÊmÌLËŸLÌpëLÍcLÎm›LÏnÔLÐ~æLÑ„LÒhCLÓLÔmØLÕ–vLÖ‹¨L×YWLØryLÙ…äLÚ~LÛu¼LÜŠŠLÝh¯LÞRTLߎ"Là•LácÐL☘LãŽDLäU|LåOSLæfÿLçVLè`ÕLém•LêRCLë\ILìY)LímûLîXkLïu0LðuLñ`lLò‚LóFLôcLõgaLöâL÷w:LøóLù4Lú”ÁLû^LüS…LýT,LþpÃM@†mMA†oMB†pMC†rMD†sME†tMF†uMG†vMH†wMI†xMJ†ƒMK†„ML†…MM††MN†‡MO†ˆMP†‰MQ†ŽMR†MS†MT†‘MU†’MV†”MW†–MX†—MY†˜MZ†™M[†šM\†›M]†žM^†ŸM_† M`†¡Ma†¢Mb†¥Mc†¦Md†«Me†­Mf†®Mg†²Mh†³Mi†·Mj†¸Mk†¹Ml†»Mm†¼Mn†½Mo†¾Mp†¿Mq†ÁMr†ÂMs†ÃMt†ÅMu†ÈMv†ÌMw†ÍMx†ÒMy†ÓMz†ÕM{†ÖM|†×M}†ÚM~†ÜM€†ÝM†àM‚†áMƒ†âM„†ãM…†åM††æM‡†çMˆ†èM‰†êMІëM‹†ìMŒ†ïM†õMކöM†÷M†úM‘†ûM’†üM“†ýM”†ÿM•‡M–‡M—‡M˜‡M™‡ Mš‡ M›‡Mœ‡M‡Mž‡MŸ‡M ‡M¡l@M¢^÷M£P\M¤N­M¥^­M¦c:M§‚GM¨M©hPMª‘nM«w³M¬T M­”ÜM®_dM¯zåM°hvM±cEM²{RM³~ßM´uÛMµPwM¶b•M·Y4M¸M¹QøMºyÃM»zM¼VþM½_’M¾M¿m‚MÀ\`MÁWMÂTMÃQTMÄnMMÅVâMÆc¨Mǘ“MÈMɇMʉ*MËMÌTMÍ\oMÎÀMÏbÖMÐbXMÑ1MÒž5MÓ–@MÔšnMÕš|MÖi-M×Y¥MØbÓMÙU>MÚcMÛTÇM܆ÙMÝmN³~¬N´g*Nµ…N¶TsN·uON¸€ÃN¹U‚Nº›ON»OMN¼n-N½ŒN¾\ N¿apNÀSkNÁvNÂn)NÆŠNÄe‡NÅ•ûNÆ~¹NÇT;NÈz3NÉ} NÊ•îNËUáNÌÁNÍtîNÎcNχNÐm¡NÑzNÒbNÓe¡NÔSgNÕcáNÖlƒN×]ëNØT\NÙ”¨NÚNLNÛlaNÜ‹ìNÝ\KNÞeàNß‚œNàh§NáT>NâT4NãkËNäkfNåN”NæcBNçSHNè‚NéO NêO®NëW^Nìb Ní–þNîfdNïriNðRÿNñR¡Nò`ŸNó‹ïNôfNõq™NögN÷‰NøxRNùwýNúfpNûV;NüT8Ný•!NþrzO@‡¥OA‡¦OB‡§OC‡©OD‡ªOE‡®OF‡°OG‡±OH‡²OI‡´OJ‡¶OK‡·OL‡¸OM‡¹ON‡»OO‡¼OP‡¾OQ‡¿OR‡ÁOS‡ÂOT‡ÃOU‡ÄOV‡ÅOW‡ÇOX‡ÈOY‡ÉOZ‡ÌO[‡ÍO\‡ÎO]‡ÏO^‡ÐO_‡ÔO`‡ÕOa‡ÖOb‡×Oc‡ØOd‡ÙOe‡ÚOf‡ÜOg‡ÝOh‡ÞOi‡ßOj‡áOk‡âOl‡ãOm‡äOn‡æOo‡çOp‡èOq‡éOr‡ëOs‡ìOt‡íOu‡ïOv‡ðOw‡ñOx‡òOy‡óOz‡ôO{‡õO|‡öO}‡÷O~‡øO€‡úO‡ûO‚‡üOƒ‡ýO„‡ÿO…ˆO†ˆO‡ˆOˆˆO‰ˆOŠˆO‹ˆOŒˆOˆ OŽˆ Oˆ Oˆ O‘ˆO’ˆO“ˆO”ˆO•ˆO–ˆO—ˆO˜ˆO™ˆOšˆO›ˆOœˆOˆOžˆOŸˆ O ˆ#O¡zO¢`oO£^ O¤`‰O¥O¦YO§`ÜO¨q„O©pïOªnªO«lPO¬r€O­j„O®ˆ­O¯^-O°N`O±Z³O²UœO³”ãO´mOµ|ûO¶–™O·bO¸~ÆO¹wŽOº†~O»S#O¼—O½–O¾f‡O¿\áOÀO OÁríOÂN OÃS¦OÄYOÅTOÆc€OÇ•(OÈQHOÉNÙOÊœœOË~¤OÌT¸OÍ$OΈTOÏ‚7OЕòOÑmŽOÒ_&OÓZÌOÔf>OÕ–iOÖs°O×s.OØS¿OÙzOÚ™…OÛ¡OÜ[ªOÝ–wOÞ–POß~¿OàvøOáS¢Oâ•vOã™™Oä{±Oå‰DOænXOçNaOèÔOéyeOê‹æOë`óOìTÍOíN«Oî˜yOï]÷OðjaOñPÏOòTOóŒaOô„'Oõx]Oö—O÷RJOøTîOùV£Oú•OûmˆOü[µOýmÆOþfSP@ˆ$PAˆ%PBˆ&PCˆ'PDˆ(PEˆ)PFˆ*PGˆ+PHˆ,PIˆ-PJˆ.PKˆ/PLˆ0PMˆ1PNˆ3POˆ4PPˆ5PQˆ6PRˆ7PSˆ8PTˆ:PUˆ;PVˆ=PWˆ>PXˆ?PYˆAPZˆBP[ˆCP\ˆFP]ˆGP^ˆHP_ˆIP`ˆJPaˆKPbˆNPcˆOPdˆPPeˆQPfˆRPgˆSPhˆUPiˆVPjˆXPkˆZPlˆ[Pmˆ\Pnˆ]Poˆ^Ppˆ_Pqˆ`PrˆfPsˆgPtˆjPuˆmPvˆoPwˆqPxˆsPyˆtPzˆuP{ˆvP|ˆxP}ˆyP~ˆzP€ˆ{Pˆ|P‚ˆ€PƒˆƒP„ˆ†P…ˆ‡P†ˆ‰P‡ˆŠPˆˆŒP‰ˆŽPŠˆP‹ˆPŒˆ‘Pˆ“PŽˆ”Pˆ•Pˆ—P‘ˆ˜P’ˆ™P“ˆšP”ˆ›P•ˆP–ˆžP—ˆŸP˜ˆ P™ˆ¡Pšˆ£P›ˆ¥Pœˆ¦Pˆ§Pžˆ¨PŸˆ©P ˆªP¡\P¢[]P£h!P¤€–P¥UxP¦{P§eHP¨iTP©N›PªkGP«‡NP¬—‹P­SOP®cP¯d:P°ªP±eœP²€ÁP³ŒP´Q™Pµh°P¶SxP·‡ùP¸aÈP¹lÄPºlûP»Œ"P¼\QP½…ªP¾‚¯P¿• PÀk#PÁ›PÂe°PÃ_ûPÄ_ÃPÅOáPƈEPÇfPÈePÉs)PÊ`úPËQtPÌRPÍW‹PÎ_bPÏ¢PЈLPÑ‘’PÒ^xPÓgOPÔ`'PÕYÓPÖQDP×QöPØ€øPÙSPÚlyPÛ–ÄPÜqŠPÝOPÞOîPßžPàg=PáUÅPâ•PãyÀP䈖På~ãPæXŸPçb Pè—Pé†ZPêVPë˜{Pì_P틸Pî„ÄPï‘WPðSÙPñeíPò^Póu\Pô`dPõ}nPöZP÷~êPø~íPùiPúU§Pû[£Pü`¬PýeËPþs„Q@ˆ¬QAˆ®QBˆ¯QCˆ°QDˆ²QEˆ³QFˆ´QGˆµQHˆ¶QIˆ¸QJˆ¹QKˆºQLˆ»QMˆ½QNˆ¾QOˆ¿QPˆÀQQˆÃQRˆÄQSˆÇQTˆÈQUˆÊQVˆËQWˆÌQXˆÍQYˆÏQZˆÐQ[ˆÑQ\ˆÓQ]ˆÖQ^ˆ×Q_ˆÚQ`ˆÛQaˆÜQbˆÝQcˆÞQdˆàQeˆáQfˆæQgˆçQhˆéQiˆêQjˆëQkˆìQlˆíQmˆîQnˆïQoˆòQpˆõQqˆöQrˆ÷QsˆúQtˆûQuˆýQvˆÿQw‰Qx‰Qy‰Qz‰Q{‰Q|‰Q}‰Q~‰Q€‰ Q‰ Q‚‰ Qƒ‰ Q„‰Q…‰Q†‰Q‡‰Qˆ‰Q‰‰QЉQ‹‰QŒ‰Q‰QމQ‰Q‰ Q‘‰"Q’‰#Q“‰$Q”‰&Q•‰'Q–‰(Q—‰)Q˜‰,Q™‰-Qš‰.Q›‰/Qœ‰1Q‰2Qž‰3QŸ‰5Q ‰7Q¡ Q¢vcQ£w)Q¤~ÚQ¥—tQ¦…›Q§[fQ¨ztQ©–êQªˆ@Q«RËQ¬qQ­_ªQ®eìQ¯‹âQ°[ûQ±šoQ²]áQ³k‰Q´l[Qµ‹­Q¶‹¯Q· Q¸ÅQ¹S‹Qºb¼Q»ž&Q¼ž-Q½T@Q¾N+Q¿‚½QÀrYQÁ†œQÂ]QÈYQÄm¯QÅ–ÅQÆTÑQÇNšQÈ‹¶QÉq QÊT½QË– QÌpßQÍmùQÎvÐQÏN%QÐxQчQÒ\©QÓ^öQÔŠQÕ˜œQÖ–Q×pŽQØl¿QÙYDQÚc©QÛwQû€QüpQýY–QþtvR@‰8RA‰9RB‰:RC‰;RD‰RG‰?RH‰@RI‰BRJ‰CRK‰ERL‰FRM‰GRN‰HRO‰IRP‰JRQ‰KRR‰LRS‰MRT‰NRU‰ORV‰PRW‰QRX‰RRY‰SRZ‰TR[‰UR\‰VR]‰WR^‰XR_‰YR`‰ZRa‰[Rb‰\Rc‰]Rd‰`Re‰aRf‰bRg‰cRh‰dRi‰eRj‰gRk‰hRl‰iRm‰jRn‰kRo‰lRp‰mRq‰nRr‰oRs‰pRt‰qRu‰rRv‰sRw‰tRx‰uRy‰vRz‰wR{‰xR|‰yR}‰zR~‰|R€‰}R‰~R‚‰€Rƒ‰‚R„‰„R…‰…R†‰‡R‡‰ˆRˆ‰‰R‰‰ŠRЉ‹R‹‰ŒRŒ‰R‰ŽRމR‰R‰‘R‘‰’R’‰“R“‰”R”‰•R•‰–R–‰—R—‰˜R˜‰™R™‰šRš‰›R›‰œRœ‰R‰žRž‰ŸRŸ‰ R ‰¡R¡dGR¢\'R£eR¤z‘R¥Œ#R¦YÚR§T¬R¨‚R©ƒoRª‰R«€R¬i0R­VNR®€6R¯r7R°‘ÎR±Q¶R²N_R³˜uR´c–RµNR¶SöR·fóR¸KR¹YRºm²R»NR¼XùR½S;R¾cÖR¿”ñRÀORÁO RˆcRØRÄY7RÅWRÆyûRÇNêRÈ€ðRÉu‘RÊl‚RË[œRÌYèRÍ_]RÎiRφRÐPRÑ]òRÒNYRÓwãRÔNåRÕ‚zRÖb‘R×fRØ‘RÙ\yRÚN¿RÛ_yRÜÆRÝ8RÞ€„Rßu«RàN¦RáˆÔRâaRãkÅRä_ÆRåNIRævÊRçn¢Rè‹ãRé‹®RêŒ Rë‹ÑRì_RíüRîÌRï~ÎRðƒ5RñƒkRòVàRók·Rô—óRõ–4RöYûR÷TRø”öRùmëRú[ÅRû™nRü\9Rý_Rþ–S@‰¢SA‰£SB‰¤SC‰¥SD‰¦SE‰§SF‰¨SG‰©SH‰ªSI‰«SJ‰¬SK‰­SL‰®SM‰¯SN‰°SO‰±SP‰²SQ‰³SR‰´SS‰µST‰¶SU‰·SV‰¸SW‰¹SX‰ºSY‰»SZ‰¼S[‰½S\‰¾S]‰¿S^‰ÀS_‰ÃS`‰ÍSa‰ÓSb‰ÔSc‰ÕSd‰×Se‰ØSf‰ÙSg‰ÛSh‰ÝSi‰ßSj‰àSk‰áSl‰âSm‰äSn‰çSo‰èSp‰éSq‰êSr‰ìSs‰íSt‰îSu‰ðSv‰ñSw‰òSx‰ôSy‰õSz‰öS{‰÷S|‰øS}‰ùS~‰úS€‰ûS‰üS‚‰ýSƒ‰þS„‰ÿS…ŠS†ŠS‡ŠSˆŠS‰ŠSŠŠS‹ŠSŒŠ SŠ SŽŠ SŠ SŠ S‘ŠS’ŠS“ŠS”ŠS•ŠS–ŠS—ŠS˜ŠS™ŠSšŠS›ŠSœŠSŠSžŠSŸŠS ŠS¡SpS¢‚ñS£j1S¤ZtS¥žpS¦^”S§(S¨ƒ¹S©„$Sª„%S«ƒgS¬‡GS­ÎS®bS¯vÈS°_qS±˜–S²xlS³f S´TßSµbåS¶OcS·ÃS¸uÈS¹^¸Sº–ÍS»Ž S¼†ùS½TS¾lóS¿mŒSÀl8SÁ`SÂRÇSÃu(SÄ^}SÅOSÆ` SÇ_çSÈ\$SÉu1SÊ®SË”ÀSÌr¹SÍl¹SÎn8SÏ‘ISÐg SÑSËSÒSóSÓOQSÔ‘ÉSÕ‹ñSÖSÈS×^|SØÂSÙmäSÚNŽSÛvÂSÜi†S݆^SÞaSß‚SàOYSáOÞSâ>Sãœ|Säa SånSænSç–…SèNˆSéZ1Sê–èSëNSì\Síy¹Sî[‡Sï‹íSð½Sñs‰SòWßSó‚‹SôÁSõTSöGS÷U»Sø\êSù_¡SúaSûk2SürñSý€²SþЉT@ŠTAŠTBŠ TCŠ!TDŠ"TEŠ#TFŠ$TGŠ%THŠ&TIŠ'TJŠ(TKŠ)TLŠ*TMŠ+TNŠ,TOŠ-TPŠ.TQŠ/TRŠ0TSŠ1TTŠ2TUŠ3TVŠ4TWŠ5TXŠ6TYŠ7TZŠ8T[Š9T\Š:T]Š;T^ŠVš‹?V›‹@Vœ‹AV‹BVž‹CVŸ‹DV ‹EV¡^'V¢uÇV£ÑV¤‹ÁV¥‚V¦gV§e/V¨T1V©‡VªwåV«€¢V¬V­lAV®NKV¯~ÇV°€LV±vôV²i V³k–V´bgVµPXGŒ?XHŒ@XIŒBXJŒCXKŒDXLŒEXMŒHXNŒJXOŒKXPŒMXQŒNXRŒOXSŒPXTŒQXUŒRXVŒSXWŒTXXŒVXYŒWXZŒXX[ŒYX\Œ[X]Œ\X^Œ]X_Œ^X`Œ_XaŒ`XbŒcXcŒdXdŒeXeŒfXfŒgXgŒhXhŒiXiŒlXjŒmXkŒnXlŒoXmŒpXnŒqXoŒrXpŒtXqŒuXrŒvXsŒwXtŒ{XuŒ|XvŒ}XwŒ~XxŒXyŒ€XzŒX{ŒƒX|Œ„X}Œ†X~Œ‡X€ŒˆXŒ‹X‚ŒXƒŒŽX„ŒX…ŒX†Œ‘X‡Œ’XˆŒ“X‰Œ•XŠŒ–X‹Œ—XŒŒ™XŒšXŽŒ›XŒœXŒX‘ŒžX’ŒŸX“Œ X”Œ¡X•Œ¢X–Œ£X—Œ¤X˜Œ¥X™Œ¦XšŒ§X›Œ¨XœŒ©XŒªXžŒ«XŸŒ¬X Œ­X¡NX¢N X£Q@X¤NX¥^ÿX¦SEX§NX¨N˜X©NXª›2X«[lX¬ViX­N(X®yºX¯N?X°SX±NGX²Y-X³r;X´SnXµlX¶VßX·€äX¸™—X¹kÓXºw~X»ŸX¼N6X½NŸX¾ŸX¿N\XÀNiXÁN“X‚ˆXÃ[[XÄUlXÅVXÆNÄXÇSXÈSXÉS£XÊS¥XËS®XÌ—eXÍ]XÎSXÏSõXÐS&XÑS.XÒS>XÓ\XÔSfXÕScXÖRX×RXØRXÙR-XÚR3XÛR?XÜR@XÝRLXÞR^XßRaXàR\XᄯXâR}XãR‚XäRXåRXæR“XçQ‚XèTXéN»XêNÃXëNÉXìNÂXíNèXîNáXïNëXðNÞXñOXòNóXóO"XôOdXõNõXöO%X÷O'XøO XùO+XúO^XûOgXüe8XýOZXþO]Y@Œ®YAŒ¯YBŒ°YCŒ±YDŒ²YEŒ³YFŒ´YGŒµYHŒ¶YIŒ·YJŒ¸YKŒ¹YLŒºYMŒ»YNŒ¼YOŒ½YPŒ¾YQŒ¿YRŒÀYSŒÁYTŒÂYUŒÃYVŒÄYWŒÅYXŒÆYYŒÇYZŒÈY[ŒÉY\ŒÊY]ŒËY^ŒÌY_ŒÍY`ŒÎYaŒÏYbŒÐYcŒÑYdŒÒYeŒÓYfŒÔYgŒÕYhŒÖYiŒ×YjŒØYkŒÙYlŒÚYmŒÛYnŒÜYoŒÝYpŒÞYqŒßYrŒàYsŒáYtŒâYuŒãYvŒäYwŒåYxŒæYyŒçYzŒèY{ŒéY|ŒêY}ŒëY~ŒìY€ŒíYŒîY‚ŒïYƒŒðY„ŒñY…ŒòY†ŒóY‡ŒôYˆŒõY‰ŒöYŠŒ÷Y‹ŒøYŒŒùYŒúYŽŒûYŒüYŒýY‘ŒþY’ŒÿY“Y”Y•Y–Y—Y˜Y™YšY›Yœ Y Yž YŸ Y  Y¡O_Y¢OWY£O2Y¤O=Y¥OvY¦OtY§O‘Y¨O‰Y©OƒYªOY«O~Y¬O{Y­OªY®O|Y¯O¬Y°O”Y±OæY²OèY³OêY´OÅYµOÚY¶OãY·OÜY¸OÑY¹OßYºOøY»P)Y¼PLY½OóY¾P,Y¿PYÀP.YÁP-YÂOþYÃPYÄP YÅP%YÆP(YÇP~YÈPCYÉPUYÊPHYËPNYÌPlYÍP{YÎP¥YÏP§YÐP©YÑPºYÒPÖYÓQYÔPíYÕPìYÖPæY×PîYØQYÙQ YÚNÝYÛl=YÜOXYÝOeYÞOÎYߟ YàlFYá|tYâQnYã]ýYäžÉY噘YæQYçYYèRùYéS YêŠYëSYìQëYíYYîQUYïN YðQVYñN³YòˆnYóˆ¤YôNµYõYöˆÒY÷y€Yø[4YùˆYú¸YûQ«YüQ±YýQ½YþQ¼Z@ZAZBZCZDZEZFZGZHZIZJZKZLZMZNZO ZPQZQRZRWZS_ZTeZUhZViZWjZXlZYnZZoZ[qZ\rZ]xZ^yZ_zZ`{Za|Zb}Zc~ZdZe€Zf‚ZgƒZh†Zi‡ZjˆZk‰ZlŒZmZnŽZoZpZq’Zr“Zs•Zt–Zu—Zv˜Zw™ZxšZy›ZzœZ{Z|žZ} Z~¡Z€¢Z¤Z‚¥Zƒ¦Z„§Z…¨Z†©Z‡ªZˆ«Z‰¬ZŠ­Z‹®ZŒ¯Z°Z޲Z¶Z·Z‘¹Z’»Z“½Z”ÀZ•ÁZ–ÂZ—ÅZ˜ÇZ™ÈZšÉZ›ÊZœÍZÐZžÒZŸÓZ ÔZ¡QÇZ¢Q–Z£Q¢Z¤Q¥Z¥‹ Z¦‹¦Z§‹§Z¨‹ªZ©‹´Zª‹µZ«‹·Z¬‹ÂZ­‹ÃZ®‹ËZ¯‹ÏZ°‹ÎZ±‹ÒZ²‹ÓZ³‹ÔZ´‹ÖZµ‹ØZ¶‹ÙZ·‹ÜZ¸‹ßZ¹‹àZº‹äZ»‹èZ¼‹éZ½‹îZ¾‹ðZ¿‹óZÀ‹öZÁ‹ùZ‹üZËÿZÄŒZÅŒZÆŒZÇŒZÈŒ ZÉŒZÊŒZËŒZÌŒZÍŒZÎŒZÏŒZÐŒZÑŒZÒŒZÓŒZÔŒ ZÕŒ!ZÖŒ%Z׌'ZØŒ*ZÙŒ+ZÚŒ.ZÛŒ/ZÜŒ2ZÝŒ3ZÞŒ5Zߌ6ZàSiZáSzZâ–Zã–"Zä–!Zå–1Zæ–*Zç–=Zè–[€Ž?[ŽC[‚ŽE[ƒŽF[„ŽL[…ŽM[†ŽN[‡ŽO[ˆŽP[‰ŽS[ŠŽT[‹ŽU[ŒŽV[ŽW[ŽŽX[ŽZ[Ž[[‘Ž\[’Ž][“Ž^[”Ž_[•Ž`[–Ža[—Žb[˜Žc[™Žd[šŽe[›Žg[œŽh[Žj[žŽk[ŸŽn[ Žq[¡¸[¢°[£Ï[¤Å[¥¾[¦Ð[§Ä[¨Ç[©Ó[ªæ[«â[¬Ü[­×[®Û[¯ë[°ï[±þ[²‘[³‘"[´‘[µ‘#[¶‘1[·‘/[¸‘9[¹‘C[º‘F[»R [¼YB[½R¢[¾R¬[¿R­[ÀR¾[ÁTÿ[ÂRÐ[ÃRÖ[ÄRð[ÅSß[Æqî[ÇwÍ[È^ô[ÉQõ[ÊQü[Ë›/[ÌS¶[Í_[ÎuZ[Ï]ï[ÐWL[ÑW©[ÒW¡[ÓX~[ÔX¼[ÕXÅ[ÖXÑ[×W)[ØW,[ÙW*[ÚW3[ÛW9[ÜW.[ÝW/[ÞW\[ßW;[àWB[áWi[âW…[ãWk[äW†[åW|[æW{[çWh[èWm[éWv[êWs[ëW­[ìW¤[íWŒ[îW²[ïWÏ[ðW§[ñW´[òW“[óW [ôWÕ[õWØ[öWÚ[÷WÙ[øWÒ[ùW¸[úWô[ûWï[üWø[ýWä[þWÝ\@Žs\AŽu\BŽw\CŽx\DŽy\EŽz\FŽ{\GŽ}\HŽ~\IŽ€\JŽ‚\KŽƒ\LŽ„\Mކ\NŽˆ\Oމ\PŽŠ\QŽ‹\RŽŒ\SŽ\TŽŽ\UŽ‘\VŽ’\WŽ“\XŽ•\YŽ–\ZŽ—\[Ž˜\\Ž™\]Žš\^Ž›\_Ž\`ŽŸ\aŽ \bŽ¡\cŽ¢\dŽ£\eޤ\fŽ¥\gަ\hާ\iލ\jŽ©\kŽª\lŽ­\mŽ®\nް\oޱ\p޳\qŽ´\r޵\s޶\tŽ·\uޏ\v޹\wŽ»\x޼\y޽\z޾\{Ž¿\|ŽÀ\}ŽÁ\~ŽÂ\€ŽÃ\ŽÄ\‚ŽÅ\ƒŽÆ\„ŽÇ\…ŽÈ\†ŽÉ\‡ŽÊ\ˆŽË\‰ŽÌ\ŠŽÍ\‹ŽÏ\ŒŽÐ\ŽÑ\ŽŽÒ\ŽÓ\ŽÔ\‘ŽÕ\’ŽÖ\“Ž×\”ŽØ\•ŽÙ\–ŽÚ\—ŽÛ\˜ŽÜ\™ŽÝ\šŽÞ\›Žß\œŽà\Žá\žŽâ\ŸŽã\ Žä\¡X \¢X \£Wý\¤Wí\¥X\¦X\§X\¨XD\©X \ªXe\«Xl\¬X\­X‰\®Xš\¯X€\°™¨\±Ÿ\²aÿ\³‚y\´‚}\µ‚\¶‚\·‚Š\¸‚¨\¹‚„\º‚Ž\»‚‘\¼‚—\½‚™\¾‚«\¿‚¸\À‚¾\Á‚°\‚È\ÂÊ\Ä‚ã\Å‚˜\Æ‚·\Ç‚®\È‚Ë\É‚Ì\Ê‚Á\Ë‚©\Ì‚´\Í‚¡\΂ª\Ï‚Ÿ\ЂÄ\Ñ‚Î\Ò‚¤\Ó‚á\Ôƒ \Õ‚÷\Ö‚ä\׃\؃\Ù‚Ü\Ú‚ô\Û‚Ò\Ü‚Ø\݃ \Þ‚û\ß‚Ó\àƒ\áƒ\âƒ\ãƒ\äƒ\å‚à\æ‚Õ\çƒ\èƒQ\éƒ[\êƒ\\ëƒ\샒\íƒ<\îƒ4\ïƒ1\ðƒ›\ñƒ^\òƒ/\óƒO\ôƒG\õƒC\öƒ_\÷ƒ@\øƒ\ùƒ`\úƒ-\ûƒ:\üƒ3\ýƒf\þƒe]@Žå]AŽæ]BŽç]CŽè]DŽé]EŽê]FŽë]GŽì]HŽí]IŽî]JŽï]KŽð]LŽñ]MŽò]NŽó]OŽô]PŽõ]QŽö]RŽ÷]SŽø]TŽù]UŽú]VŽû]WŽü]XŽý]YŽþ]ZŽÿ][]\]]]^]_]`]a]b]c]d ]e ]f ]g ]h ]i]j]k]l]m]n]o]p]q]r]s]t]u]v]w]x]y]z]{ ]|!]}"]~#]€$]%]‚&]ƒ']„(]…)]†*]‡+]ˆ,]‰-]Š.]‹/]Œ0]1]Ž2]3]4]‘5]’6]“7]”8]•9]–:]—;]˜<]™=]š>]›?]œ@]A]žB]ŸC] D]¡ƒh]¢ƒ]£ƒi]¤ƒl]¥ƒj]¦ƒm]§ƒn]¨ƒ°]©ƒx]ªƒ³]«ƒ´]¬ƒ ]­ƒª]®ƒ“]¯ƒœ]°ƒ…]±ƒ|]²ƒ¶]³ƒ©]´ƒ}]µƒ¸]¶ƒ{]·ƒ˜]¸ƒž]¹ƒ¨]ºƒº]»ƒ¼]¼ƒÁ]½„]¾ƒå]¿ƒØ]ÀX]Á„]„ ]ÃÝ]ăý]ŃÖ]Æ„]Ç„8]È„]É„]ʃÔ]˃ß]Ì„]Í„]΃ø]σù]Ѓê]уÅ]ÒƒÀ]Ó„&]Ôƒð]Õƒá]Ö„\]ׄQ]Ø„Z]Ù„Y]Ú„s]Û„‡]Ü„ˆ]Ý„z]Þ„‰]ß„x]à„<]á„F]â„i]ã„v]䄌]儎]æ„1]ç„m]è„Á]é„Í]ê„Ð]ë„æ]섽]í„Ó]î„Ê]ï„¿]ð„º]ñ„à]ò„¡]ó„¹]ô„´]õ„—]ö„å]÷„ã]ø… ]ùu ]ú…8]û„ð]ü…9]ý…]þ…:^@E^AF^BG^CH^DI^EJ^FK^GL^HM^IN^JO^KP^LQ^MR^NS^OT^PU^QV^RW^SX^TY^UZ^V[^W\^X]^Y^^Z_^[`^\a^]b^^c^_d^`e^aj^b€^cŒ^d’^e^f ^g¡^h¢^i¤^j¥^k¦^l§^mª^n¬^o­^p®^q¯^r²^s³^t´^uµ^v·^w¸^xº^y»^z¼^{¿^|À^}Ã^~Æ^€É^Ê^‚Ë^ƒÌ^„Í^…Ï^†Ò^‡Ö^ˆ×^‰Ú^Šà^‹á^Œã^ç^Žì^ï^ñ^‘ò^’ô^“õ^”ö^•ú^–û^—ü^˜þ^™ÿ^š^›^œ ^^ž^Ÿ^ ^¡…V^¢…;^£„ÿ^¤„ü^¥…Y^¦…H^§…h^¨…d^©…^^ª…z^«w¢^¬…C^­…r^®…{^¯…¤^°…¨^±…‡^²…^³…y^´…®^µ…œ^¶……^·…¹^¸…·^¹…°^º…Ó^»…Á^¼…Ü^½…ÿ^¾†'^¿†^À†)^Á†^†<^Ã^þ^Ä_^ÅY<^ÆYA^Ç€7^ÈYU^ÉYZ^ÊYX^ËS^Ì\"^Í\%^Î\,^Ï\4^ÐbL^Ñbj^ÒbŸ^Ób»^ÔbÊ^ÕbÚ^Öb×^×bî^Øc"^Ùbö^Úc9^ÛcK^ÜcC^Ýc­^Þcö^ßcq^àcz^ácŽ^âc´^ãcm^äc¬^åcŠ^æci^çc®^èc¼^écò^êcø^ëcà^ìcÿ^ícÄ^îcÞ^ïcÎ^ðdR^ñcÆ^òc¾^ódE^ôdA^õd ^öd^÷d ^ød ^ùd&^úd!^ûd^^üd„^ýdm^þd–_@_A_B#_C$_D%_E'_F(_G)_H*_I+_J,_K0_L1_M2_N3_O4_P7_Q9_R:_S=_T?_U@_VC_WE_XF_YH_ZI_[J_\K_]L_^N__T_`U_aV_bY_cZ_d\_e]_f^_g__h`_ia_jd_kf_lg_mi_nj_ok_pl_qo_rp_sq_tr_us_vv_ww_xx_yy_zz_{{_||_}~_~_€„_…_‚†_ƒ‡_„‰_…Š_†Œ_‡_ˆŽ_‰_Š_‹’_Œ”_–_Ž˜_š_œ_‘ž_’Ÿ_“ _”¤_•¥_–§_—¨_˜©_™«_š­_›²_œ·_¼_ž½_Ÿ¿_ À_¡dz_¢d·_£d¸_¤d™_¥dº_¦dÀ_§dÐ_¨d×_©dä_ªdâ_«e _¬e%_­e._®_ _¯_Ò_°u_±__²S__³Sñ_´Sý_µSé_¶Sè_·Sû_¸T_¹T_ºT_»TK_¼TR_½TS_¾TT_¿TV_ÀTC_ÁT!_ÂTW_ÃTY_ÄT#_ÅT2_ÆT‚_ÇT”_ÈTw_ÉTq_ÊTd_ËTš_ÌT›_ÍT„_ÎTv_ÏTf_ÐT_ÑTÐ_ÒT­_ÓTÂ_ÔT´_ÕTÒ_ÖT§_×T¦_ØTÓ_ÙTÔ_ÚTr_ÛT£_ÜTÕ_ÝT»_ÞT¿_ßTÌ_àTÙ_áTÚ_âTÜ_ãT©_äTª_åT¤_æTÝ_çTÏ_èTÞ_éU_êTç_ëU _ìTý_íU_îTó_ïU"_ðU#_ñU_òU_óU'_ôU*_õUg_öU_÷Uµ_øUI_ùUm_úUA_ûUU_üU?_ýUP_þU<`@Â`AÃ`BÆ`CÈ`DÉ`EË`FÌ`GÍ`HÒ`IÔ`JÕ`KÖ`LØ`MÙ`NÚ`OÞ`Pß`Qà`Rã`Sä`Tå`Ué`Vê`Wì`Xî`Yð`Zñ`[ò`\ó`]õ`^ö`_÷``ù`aú`bû`cü`dÿ`e‘`f‘`g‘`h‘`i‘`j‘`k‘`l‘ `m‘ `n‘ `o‘ `p‘ `q‘`r‘`s‘`t‘`u‘`v‘`w‘`x‘`y‘`z‘`{‘`|‘`}‘`~‘`€‘`‘`‚‘ `ƒ‘!`„‘$`…‘%`†‘&`‡‘'`ˆ‘(`‰‘)`Š‘*`‹‘+`Œ‘,`‘-`Ž‘.`‘0`‘2`‘‘3`’‘4`“‘5`”‘6`•‘7`–‘8`—‘:`˜‘;`™‘<`š‘=`›‘>`œ‘?`‘@`ž‘A`Ÿ‘B` ‘D`¡U7`¢UV`£Uu`¤Uv`¥Uw`¦U3`§U0`¨U\`©U‹`ªUÒ`«Uƒ`¬U±`­U¹`®Uˆ`¯U`°UŸ`±U~`²UÖ`³U‘`´U{`µUß`¶U½`·U¾`¸U”`¹U™`ºUê`»U÷`¼UÉ`½V`¾UÑ`¿Uë`ÀUì`ÁUÔ`ÂUæ`ÃUÝ`ÄUÄ`ÅUï`ÆUå`ÇUò`ÈUó`ÉUÌ`ÊUÍ`ËUè`ÌUõ`ÍUä`Δ`ÏV`ÐV`ÑV `ÒV`ÓV$`ÔV#`ÕUþ`ÖV`×V'`ØV-`ÙVX`ÚV9`ÛVW`ÜV,`ÝVM`ÞVb`ßVY`àV\`áVL`âVT`ãV†`äVd`åVq`æVk`çV{`èV|`éV…`êV“`ëV¯`ìVÔ`íV×`îVÝ`ïVá`ðVõ`ñVë`òVù`óVÿ`ôW`õW `öW `÷W`ø^`ù^`ú^`û^`ü^1`ý^;`þ^aË]4aÌ]=aÍ]laÎ][aÏ]oaÐ]]aÑ]kaÒ]KaÓ]JaÔ]iaÕ]taÖ]‚a×]™aØ]aÙŒsaÚ]·aÛ]ÅaÜ_saÝ_waÞ_‚aß_‡aà_‰aá_Œaâ_•aã_™aä_œaå_¨aæ_­aç_µaè_¼aéˆbaê_aaër­aìr°aír´aîr·aïr¸aðrÃañrÁaòrÎaórÍaôrÒaõrèaörïa÷réaøròaùrôaúr÷aûsaüróaýsaþrúb@‘æbA‘çbB‘èbC‘ébD‘êbE‘ëbF‘ìbG‘íbH‘îbI‘ïbJ‘ðbK‘ñbL‘òbM‘óbN‘ôbO‘õbP‘öbQ‘÷bR‘øbS‘ùbT‘úbU‘ûbV‘übW‘ýbX‘þbY‘ÿbZ’b[’b\’b]’b^’b_’b`’ba’bb’bc’ bd’ be’ bf’ bg’ bh’bi’bj’bk’bl’bm’bn’bo’bp’bq’br’bs’bt’bu’bv’bw’bx’by’bz’ b{’!b|’"b}’#b~’$b€’%b’&b‚’'bƒ’(b„’)b…’*b†’+b‡’,bˆ’-b‰’.bŠ’/b‹’0bŒ’1b’2bŽ’3b’4b’5b‘’6b’’7b“’8b”’9b•’:b–’;b—’bš’?b›’@bœ’Ab’Bbž’CbŸ’Db ’Eb¡rûb¢sb£sb¤s!b¥s b¦sb§sb¨sb©s"bªs9b«s%b¬s,b­s8b®s1b¯sPb°sMb±sWb²s`b³slb´sobµs~b¶‚b·Y%b¸˜çb¹Y$bºYb»™cb¼™gb½™hb¾™ib¿™jbÀ™kbÁ™lb™tbÙwbÄ™}bÅ™€bÆ™„bÇ™‡bÈ™ŠbÉ™bÊ™bË™‘bÌ™“bÍ™”bΙ•bÏ^€bÐ^‘bÑ^‹bÒ^–bÓ^¥bÔ^ bÕ^¹bÖ^µb×^¾bØ^³bÙSbÚ^ÒbÛ^ÑbÜ^ÛbÝ^èbÞ^êbߺbà_Äbá_Ébâ_Öbã_Ïbä`bå_îbæ`bç_ábè_äbé_þbê`bë`bì_êbí_íbî_øbï`bð`5bñ`&bò`bó`bô` bõ`)bö`+b÷` bø`?bù`!bú`xbû`ybü`{bý`zbþ`Bc@’FcA’GcB’HcC’IcD’JcE’KcF’LcG’McH’NcI’OcJ’PcK’QcL’RcM’ScN’TcO’UcP’VcQ’WcR’XcS’YcT’ZcU’[cV’\cW’]cX’^cY’_cZ’`c[’ac\’bc]’cc^’dc_’ec`’fca’gcb’hcc’icd’jce’kcf’lcg’mch’nci’ocj’pck’qcl’rcm’scn’uco’vcp’wcq’xcr’ycs’zct’{cu’|cv’}cw’~cx’cy’€cz’c{’‚c|’ƒc}’„c~’…c€’†c’‡c‚’ˆcƒ’‰c„’Šc…’‹c†’Œc‡’cˆ’c‰’cŠ’‘c‹’’cŒ’“c’”cŽ’•c’–c’—c‘’˜c’’™c“’šc”’›c•’œc–’c—’žc˜’Ÿc™’ cš’¡c›’¢cœ’£c’¤cž’¥cŸ’¦c ’§c¡`jc¢`}c£`–c¤`šc¥`­c¦`c§`ƒc¨`’c©`Œcª`›c«`ìc¬`»c­`±c®`Ýc¯`Øc°`Æc±`Úc²`´c³a c´a&cµac¶a#c·`ôc¸ac¹acºa+c»aJc¼auc½a¬c¾a”c¿a§cÀa·cÁaÔcÂaõcÃ_ÝcÄ–³cÅ•écÆ•ëcÇ•ñcÈ•ócÉ•õcÊ•öcË•ücÌ•þcÍ–cΖcÏ–cЖcÑ– cÒ– cÓ– cÔ– cÕ–cÖ–c×–cØ–cÙ–cÚ–cÛ–cÜN,cÝr?cÞbcßl5càlTcál\câlJcãl£cäl…cålcæl”cçlŒcèlhcélicêltcëlvcìl†cíl©cîlÐcïlÔcðl­cñl÷còløcólñcôl×cõl²cölàc÷lÖcølúcùlëcúlîcûl±cülÓcýlïcþlþd@’¨dA’©dB’ªdC’«dD’¬dE’­dF’¯dG’°dH’±dI’²dJ’³dK’´dL’µdM’¶dN’·dO’¸dP’¹dQ’ºdR’»dS’¼dT’½dU’¾dV’¿dW’ÀdX’ÁdY’ÂdZ’Ãd[’Äd\’Åd]’Æd^’Çd_’Éd`’Êda’Ëdb’Ìdc’Ídd’Îde’Ïdf’Ðdg’Ñdh’Òdi’Ódj’Ôdk’Õdl’Ödm’×dn’Ødo’Ùdp’Údq’Ûdr’Üds’Ýdt’Þdu’ßdv’àdw’ádx’âdy’ãdz’äd{’åd|’æd}’çd~’èd€’éd’êd‚’ëdƒ’ìd„’íd…’îd†’ïd‡’ðdˆ’ñd‰’òdŠ’ód‹’ôdŒ’õd’ödŽ’÷d’ød’ùd‘’úd’’ûd“’üd”’ýd•’þd–’ÿd—“d˜“d™“dš“d›“dœ“d“dž“dŸ“d “ d¡m9d¢m'd£m d¤mCd¥mHd¦md§md¨md©mdªm+d«mMd¬m.d­m5d®md¯mOd°mRd±mTd²m3d³m‘d´modµmžd¶m d·m^d¸m“d¹m”dºm\d»m`d¼m|d½mcd¾nd¿mÇdÀmÅdÁmÞdÂndÃm¿dÄmàdÅndÆmædÇmÝdÈmÙdÉndÊm«dËn dÌm®dÍn+dÎnndÏnNdÐnkdÑn²dÒn_dÓn†dÔnSdÕnTdÖn2d×n%dØnDdÙnßdÚn±dÛn˜dÜnàdÝo-dÞnâdßn¥dàn§dán½dân»dãn·dän×dån´dænÏdçndènÂdénŸdêobdëoFdìoGdío$dîodïnùdðo/dño6dòoKdóotdôo*dõo döo)d÷o‰døodùoŒdúoxdûordüo|dýozdþoÑe@“ eA“ eB“ eC“ eD“eE“eF“eG“eH“eI“eJ“eK“eL“eM“eN“eO“eP“eQ“eR“eS“eT“eU“eV“ eW“!eX“"eY“#eZ“$e[“%e\“&e]“'e^“(e_“)e`“*ea“+eb“,ec“-ed“.ee“/ef“0eg“1eh“2ei“3ej“4ek“5el“6em“7en“8eo“9ep“:eq“;er“gß•gàsŽgás‘gâs®gãs¢gäsŸgåsÏgæsÂgçsÑgès·gés³gêsÀgësÉgìsÈgísågîsÙgï˜|gðt gñségòsçgósÞgôsºgõsògötg÷t*gøt[gùt&gút%gût(güt0gýt.gþt,h@”/hA”0hB”1hC”2hD”3hE”4hF”5hG”6hH”7hI”8hJ”9hK”:hL”;hM”hðhJhñhIhòh)hóhµhôhhõhthöhwh÷h“høhkhùhÂhúinhûhühüihýi hþhùi@•'iA•3iB•=iC•CiD•HiE•KiF•UiG•ZiH•`iI•niJ•tiK•uiL•wiM•xiN•yiO•ziP•{iQ•|iR•}iS•~iT•€iU•iV•‚iW•ƒiX•„iY•…iZ•†i[•‡i\•ˆi]•‰i^•Ši_•‹i`•Œia•ib•Žic•id•ie•‘if•’ig•“ih•”ii••ij•–ik•—il•˜im•™in•šio•›ip•œiq•ir•žis•Ÿit• iu•¡iv•¢iw•£ix•¤iy•¥iz•¦i{•§i|•¨i}•©i~•ªi€•«i•¬i‚•­iƒ•®i„•¯i…•°i†•±i‡•²iˆ•³i‰•´iŠ•µi‹•¶iŒ•·i•¸iŽ•¹i•ºi•»i‘•¼i’•½i“•¾i”•¿i••Ài–•Ái—•Âi˜•Ãi™•Äiš•Åi›•Æiœ•Çi•Èiž•ÉiŸ•Êi •Ëi¡i$i¢hði£i i¤ii¥iWi¦hãi§ii¨iqi©i9iªi`i«iBi¬i]i­i„i®iki¯i€i°i˜i±ixi²i4i³iÌi´i‡iµiˆi¶iÎi·i‰i¸ifi¹iciºiyi»i›i¼i§i½i»i¾i«i¿i­iÀiÔiÁi±iÂiÁiÃiÊiÄißiÅi•iÆiàiÇiiÈiÿiÉj/iÊiíiËjiÌjiÍjeiÎiòiÏjDiÐj>iÑj iÒjPiÓj[iÔj5iÕjŽiÖjyi×j=iØj(iÙjXiÚj|iÛj‘iÜjiÝj©iÞj—ißj«iàs7iásRiâkiãk‚iäk‡iåk„iæk’içk“ièkiékšiêk›iëk¡iìkªiíkiîmiïqiðriñsiòuióviôxiõwiöyi÷ziø|iù~iúiû‚iü„iý‡iþ‹j@•ÌjA•ÍjB•ÎjC•ÏjD•ÐjE•ÑjF•ÒjG•ÓjH•ÔjI•ÕjJ•ÖjK•×jL•ØjM•ÙjN•ÚjO•ÛjP•ÜjQ•ÝjR•ÞjS•ßjT•àjU•ájV•âjW•ãjX•äjY•åjZ•æj[•çj\•ìj]•ÿj^–j_–j`–ja–jb–jc– jd–#je–$jf–%jg–&jh–'ji–(jj–)jk–+jl–,jm–-jn–/jo–0jp–7jq–8jr–9js–:jt–>ju–Ajv–Cjw–Jjx–Njy–Ojz–Qj{–Rj|–Sj}–Vj~–Wj€–Xj–Yj‚–Zjƒ–\j„–]j…–^j†–`j‡–cjˆ–ej‰–fjŠ–kj‹–mjŒ–nj–ojŽ–pj–qj–sj‘–xj’–yj“–zj”–{j•–|j––}j—–~j˜–j™–€jš–j›–‚jœ–ƒj–„jž–‡jŸ–‰j –Šj¡j¢Žj£j¤˜j¥šj¦ŽÎj§b j¨bj©bjªbj«b"j¬b!j­b%j®b$j¯b,j°çj±tïj²tôj³tÿj´ujµuj¶uj·e4j¸eîj¹eïjºeðj»f j¼fj½grj¾fj¿fjÀfjÁp…jÂf÷jÃfjÄf4jÅf1jÆf6jÇf5jÈ€jÉf_jÊfTjËfAjÌfOjÍfVjÎfajÏfWjÐfwjÑf„jÒfŒjÓf§jÔfjÕf¾jÖfÛj×fÜjØfæjÙféjÚ2jÛ3jÜ6jÝ;jÞ=jß@jàEjáFjâHjãIjäGjåMjæUjçYjè‰Çjé‰Êjê‰Ëjë‰Ìjì‰Îjí‰Ïjî‰Ðjï‰ÑjðrnjñrŸjòr]jórfjôrojõr~jörj÷r„jør‹jùrjúrjûr’jücjýc2jþc°k@–ŒkA–ŽkB–‘kC–’kD–“kE–•kF––kG–škH–›kI–kJ–žkK–ŸkL– kM–¡kN–¢kO–£kP–¤kQ–¥kR–¦kS–¨kT–©kU–ªkV–«kW–¬kX–­kY–®kZ–¯k[–±k\–²k]–´k^–µk_–·k`–¸ka–ºkb–»kc–¿kd–Âke–Ãkf–Èkg–Êkh–Ëki–Ðkj–Ñkk–Ókl–Ôkm–Ökn–×ko–Økp–Ùkq–Úkr–Ûks–Ükt–Ýku–Þkv–ßkw–ákx–âky–ãkz–äk{–åk|–æk}–çk~–ëk€–ìk–ík‚–îkƒ–ðk„–ñk…–òk†–ôk‡–õkˆ–øk‰–úkŠ–ûk‹–ükŒ–ýk–ÿkŽ—k—k—k‘— k’— k“— k”—k•—k–—k——k˜—k™—kš—k›—kœ—k—kž—kŸ—k — k¡d?k¢dØk£€k¤kêk¥kók¦kýk§kõk¨kùk©lkªlk«lk¬l k­lk®lk¯lk°lk±l!k²l)k³l$k´l*kµl2k¶e5k·eUk¸ekk¹rMkºrRk»rVk¼r0k½†bk¾Rk¿€ŸkÀ€œkÁ€“k€¼kÃg kÄ€½kÅ€±kÆ€«kÇ€­kÈ€´kÉ€·kÊ€çkË€èkÌ€ékÍ€êk΀ÛkÏ€ÂkЀÄkÑ€ÙkÒ€ÍkÓ€×kÔgkÕ€ÝkÖ€ëk×€ñkØ€ôkÙ€íkÚ kÛkÜ€òkÝ€ükÞgkßkàŒZká6kâkã,käkå2kæHkçLkèSkétkêYkëZkìqkí`kîikï|kð}kñmkògkóXMkôZµkõˆkö‚k÷‘kønÕkù£kúªkûÌküg&kýÊkþ»l@—!lA—"lB—#lC—$lD—%lE—&lF—'lG—(lH—)lI—+lJ—,lK—.lL—/lM—1lN—3lO—4lP—5lQ—6lR—7lS—:lT—;lU—læb=lçbClèbHlébIlêy;lëy@lìyFlíyIlîy[lïy\lðySlñyZlòyblóyWlôy`lõyolöygl÷yzløy…lùyŠlúyšlûy§lüy³lý_Ñlþ_Ðm@—žmA—ŸmB—¡mC—¢mD—¤mE—¥mF—¦mG—§mH—¨mI—©mJ—ªmK—¬mL—®mM—°mN—±mO—³mP—µmQ—¶mR—·mS—¸mT—¹mU—ºmV—»mW—¼mX—½mY—¾mZ—¿m[—Àm\—Ám]—Âm^—Ãm_—Äm`—Åma—Æmb—Çmc—Èmd—Éme—Êmf—Ëmg—Ìmh—Ími—Îmj—Ïmk—Ðml—Ñmm—Òmn—Ómo—Ômp—Õmq—Ömr—×ms—Ømt—Ùmu—Úmv—Ûmw—Ümx—Ýmy—Þmz—ßm{—àm|—ám}—âm~—ãm€—äm—åm‚—èmƒ—îm„—ïm…—ðm†—ñm‡—òmˆ—ôm‰—÷mŠ—øm‹—ùmŒ—úm—ûmŽ—üm—ým—þm‘—ÿm’˜m“˜m”˜m•˜m–˜m—˜m˜˜m™˜mš˜m›˜ mœ˜ m˜ mž˜ mŸ˜ m ˜m¡`np˜?nq˜@nr˜Ans˜Bnt˜Cnu˜Dnv˜Enw˜Fnx˜Gny˜Hnz˜In{˜Jn|˜Kn}˜Ln~˜Mn€˜Nn˜On‚˜Pnƒ˜Qn„˜Rn…˜Sn†˜Tn‡˜Unˆ˜Vn‰˜WnŠ˜Xn‹˜YnŒ˜Zn˜[nŽ˜\n˜]n˜^n‘˜_n’˜`n“˜an”˜bn•˜cn–˜dn—˜en˜˜fn™˜gnš˜hn›˜inœ˜jn˜knž˜lnŸ˜mn ˜nn¡wbn¢wen£wn¤wn¥w}n¦w€n§wŒn¨w‘n©wŸnªw n«w°n¬wµn­w½n®u:n¯u@n°uNn±uKn²uHn³u[n´urnµuyn¶uƒn·Xn¸an¹_nºŠHn»hn¼tn½qn¾yn¿nÀ~nÁvÍnÂvånÈ2nÄ”…nÅ”†nÆ”‡nÇ”‹nÈ”ŠnÉ”ŒnÊ”nË”nÌ”nÍ””nΔ—nÏ”•nДšnÑ”›nÒ”œnÓ”£nÔ”¤nÕ”«nÖ”ªn×”­nØ”¬nÙ”¯nÚ”°nÛ”²nÜ”´nÝ”¶nÞ”·nß”¸nà”¹nᔺn┼n㔽n䔿nå”Änæ”Ènç”Énè”Êné”Ënê”Ìnë”Ínì”Îní”Ðnî”Ñnï”Ònð”Õnñ”Önò”×nó”Ùnô”Ønõ”Ûnö”Þn÷”ßnø”ànù”ânú”änû”ånü”çný”ènþ”êo@˜ooA˜poB˜qoC˜roD˜soE˜toF˜‹oG˜ŽoH˜’oI˜•oJ˜™oK˜£oL˜¨oM˜©oN˜ªoO˜«oP˜¬oQ˜­oR˜®oS˜¯oT˜°oU˜±oV˜²oW˜³oX˜´oY˜µoZ˜¶o[˜·o\˜¸o]˜¹o^˜ºo_˜»o`˜¼oa˜½ob˜¾oc˜¿od˜Àoe˜Áof˜Âog˜Ãoh˜Äoi˜Åoj˜Æok˜Çol˜Èom˜Éon˜Êoo˜Ëop˜Ìoq˜Íor˜Ïos˜Ðot˜Ôou˜Öov˜×ow˜Ûox˜Üoy˜Ýoz˜ào{˜áo|˜âo}˜ão~˜äo€˜åo˜æo‚˜éoƒ˜êo„˜ëo…˜ìo†˜ío‡˜îoˆ˜ïo‰˜ðoŠ˜ño‹˜òoŒ˜óo˜ôoŽ˜õo˜öo˜÷o‘˜øo’˜ùo“˜úo”˜ûo•˜üo–˜ýo—˜þo˜˜ÿo™™oš™o›™oœ™o™ož™oŸ™o ™o¡”éo¢”ëo£”îo¤”ïo¥”óo¦”ôo§”õo¨”÷o©”ùoª”üo«”ýo¬”ÿo­•o®•o¯•o°•o±• o²• o³• o´•oµ•o¶•o·•o¸•o¹•oº•o»•o¼•o½•o¾•o¿•oÀ•"oÁ•*o•+oÕ)oÄ•,oÅ•1oÆ•2oÇ•4oÈ•6oÉ•7oÊ•8oË•oÍ•?oΕBoÏ•5oЕDoÑ•EoÒ•FoÓ•IoÔ•LoÕ•NoÖ•OoוRoØ•SoÙ•ToÚ•VoÛ•WoÜ•XoÝ•YoÞ•[oß•^oà•_oá•]oâ•aoã•boä•doå•eoæ•foç•goè•hoé•ioê•joë•koì•loí•ooî•qoï•roð•soñ•:oòwçoówìoô–ÉoõyÕoöyío÷yãoøyëoùzoú]Goûzoüzoýzoþzp@™pA™ pB™ pC™ pD™ pE™pF™pG™pH™pI™pJ™pK™pL™pM™pN™pO™pP™pQ™pR™pS™pT™pU™pV™ pW™!pX™"pY™#pZ™$p[™%p\™&p]™'p^™(p_™)p`™*pa™+pb™,pc™-pd™/pe™0pf™1pg™2ph™3pi™4pj™5pk™6pl™7pm™8pn™9po™:pp™;pq™pt™?pu™@pv™Apw™Bpx™Cpy™Dpz™Ep{™Fp|™Gp}™Hp~™Ip€™Jp™Kp‚™Lpƒ™Mp„™Np…™Op†™Pp‡™Qpˆ™Rp‰™SpŠ™Vp‹™WpŒ™Xp™YpŽ™Zp™[p™\p‘™]p’™^p“™_p”™`p•™ap–™bp—™dp˜™fp™™spš™xp›™ypœ™{p™~pž™‚pŸ™ƒp ™‰p¡z9p¢z7p£zQp¤žÏp¥™¥p¦zpp§vˆp¨vŽp©v“pªv™p«v¤p¬tÞp­tàp®u,p¯ž p°ž"p±ž(p²ž)p³ž*p´ž+pµž,p¶ž2p·ž1p¸ž6p¹ž8pºž7p»ž9p¼ž:p½ž>p¾žAp¿žBpÀžDpÁžFpžGpÞHpÄžIpÅžKpÆžLpÇžNpÈžQpÉžUpÊžWpËžZpÌž[pÍž\pΞ^pÏžcpОfpÑžgpÒžhpÓžipÔžjpÕžkpÖžlpמqpØžmpÙžspÚu’pÛu”pÜu–pÝu pÞupßu¬pàu£páu³pâu´pãu¸päuÄpåu±pæu°pçuÃpèuÂpéuÖpêuÍpëuãpìuèpíuæpîuäpïuëpðuçpñvpòuñpóuüpôuÿpõvpövp÷vpøv pùvpúv pûv%püvpývpþvq@™ŒqA™ŽqB™šqC™›qD™œqE™qF™žqG™ŸqH™ qI™¡qJ™¢qK™£qL™¤qM™¦qN™§qO™©qP™ªqQ™«qR™¬qS™­qT™®qU™¯qV™°qW™±qX™²qY™³qZ™´q[™µq\™¶q]™·q^™¸q_™¹q`™ºqa™»qb™¼qc™½qd™¾qe™¿qf™Àqg™Áqh™Âqi™Ãqj™Äqk™Åql™Æqm™Çqn™Èqo™Éqp™Êqq™Ëqr™Ìqs™Íqt™Îqu™Ïqv™Ðqw™Ñqx™Òqy™Óqz™Ôq{™Õq|™Öq}™×q~™Øq€™Ùq™Úq‚™Ûqƒ™Üq„™Ýq…™Þq†™ßq‡™àqˆ™áq‰™âqŠ™ãq‹™äqŒ™åq™æqŽ™çq™èq™éq‘™êq’™ëq“™ìq”™íq•™îq–™ïq—™ðq˜™ñq™™òqš™óq›™ôqœ™õq™öqž™÷qŸ™øq ™ùq¡vq¢vq¬v3q­vMq®v^q¯vTq°v\q±vVq²vkq³voq´Êqµzæq¶zxq·zyq¸z€q¹z†qºzˆq»z•q¼z¦q½z q¾z¬q¿z¨qÀz­qÁz³qˆdqÈiqĈrqň}qƈqLj‚qȈ¢qɈÆqʈ·qˈ¼q̈Éq͈âqΈÎqψãqЈåqшñqÒ‰qÓˆüqÔˆèqÕˆþqÖˆðq׉!q؉qÙ‰qÚ‰qÛ‰ q܉4q݉+qÞ‰6q߉Aqà‰fqá‰{qâu‹qã€åqäv²qåv´qæwÜqç€qè€qé€qê€që€ qì€"qí€%qî€&qï€'qð€)qñ€(qò€1qó€ qô€5qõ€Cqö€Fq÷€Mqø€Rqù€iqú€qqû‰ƒqü˜xqý˜€qþ˜ƒr@™úrA™ûrB™ürC™ýrD™þrE™ÿrFšrGšrHšrIšrJšrKšrLšrMšrNšrOš rPš rQš rRš rSš rTšrUšrVšrWšrXšrYšrZšr[šr\šr]šr^šr_šr`šrašrbšrcšrdšrešrfš rgš!rhš"riš#rjš$rkš%rlš&rmš'rnš(roš)rpš*rqš+rrš,rsš-rtš.ruš/rvš0rwš1rxš2ryš3rzš4r{š5r|š6r}š7r~š8r€š9rš:r‚š;rƒšr†š?r‡š@rˆšAr‰šBrŠšCr‹šDrŒšEršFrŽšGršHršIr‘šJr’šKr“šLr”šMr•šNr–šOr—šPr˜šQr™šRrššSr›šTrœšUršVržšWrŸšXr šYr¡˜‰r¢˜Œr£˜r¤˜r¥˜”r¦˜šr§˜›r¨˜žr©˜Ÿrª˜¡r«˜¢r¬˜¥r­˜¦r®†Mr¯†Tr°†lr±†nr²†r³†zr´†|rµ†{r¶†¨r·†r¸†‹r¹†¬rº†r»†§r¼†£r½†ªr¾†“r¿†©rÀ†¶rÁ†Är†µrÆÎrưrņºrƆ±rdž¯rȆÉrɆÏrʆ´rˆér̆ñr͆òrΆírφórІÐrчrÒ†ÞrÓ†ôrÔ†ßrÕ†ØrÖ†Ñrׇr؇rÙ†ørÚ‡rÛ‡ r܇ r݇ rÞ‡#r߇;rà‡rá‡%râ‡.rã‡rä‡>rå‡Hræ‡4rç‡1rè‡)ré‡7rê‡?r뇂rì‡"rí‡}rî‡~rï‡{rð‡`rñ‡prò‡Lró‡nrô‡‹rõ‡Srö‡cr÷‡|rø‡drù‡Yrú‡erû‡“rü‡¯rý‡¨rþ‡Òs@šZsAš[sBš\sCš]sDš^sEš_sFš`sGšasHšbsIšcsJšdsKšesLšfsMšgsNšhsOšisPšjsQšksRšrsSšƒsTš‰sUšsVšŽsWš”sXš•sYš™sZš¦s[š©s\šªs]š«s^š¬s_š­s`š®saš¯sbš²scš³sdš´sešµsfš¹sgš»shš½siš¾sjš¿skšÃslšÄsmšÆsnšÇsošÈspšÉsqšÊsršÍssšÎstšÏsušÐsvšÒswšÔsxšÕsyšÖszš×s{šÙs|šÚs}šÛs~šÜs€šÝsšÞs‚šàsƒšâs„šãs…šäs†šås‡šçsˆšès‰šésŠšês‹šìsŒšîsšðsŽšñsšòsšós‘šôs’šõs“šös”š÷s•šøs–šús—šüs˜šýs™šþsššÿs››sœ›s›sž›sŸ›s ›s¡‡Æs¢‡ˆs£‡…s¤‡­s¥‡—s¦‡ƒs§‡«s¨‡ås©‡¬sª‡µs«‡³s¬‡Ës­‡Ós®‡½s¯‡Ñs°‡Às±‡Ês²‡Ûs³‡ês´‡àsµ‡îs¶ˆs·ˆs¸‡þs¹ˆ sºˆs»ˆ!s¼ˆ9s½ˆs×{sØ{XsÙ{ZsÚ{EsÛ{usÜ{LsÝ{]sÞ{`sß{nsà{{sá{bsâ{rsã{qsä{så{¦sæ{§sç{¸sè{¬sé{sê{¨së{…sì{ªsí{œsî{¢sï{«sð{´sñ{Ñsò{Ásó{Ìsô{Ýsõ{Úsö{ås÷{æsø{êsù| sú{þsû{üsü|sý|sþ| t@›tA› tB› tC› tD› tE› tF›tG›tH›tI›tJ›tK›tL›tM›tN›tO›tP›tQ›tR›tS›tT›tU› tV›!tW›"tX›$tY›%tZ›&t[›'t\›(t]›)t^›*t_›+t`›,ta›-tb›.tc›0td›1te›3tf›4tg›5th›6ti›7tj›8tk›9tl›:tm›=tn›>to›?tp›@tq›Ftr›Jts›Ktt›Ltu›Ntv›Ptw›Rtx›Sty›Utz›Vt{›Wt|›Xt}›Yt~›Zt€›[t›\t‚›]tƒ›^t„›_t…›`t†›at‡›btˆ›ct‰›dtŠ›et‹›ftŒ›gt›htŽ›it›jt›kt‘›lt’›mt“›nt”›ot•›pt–›qt—›rt˜›st™›ttš›ut››vtœ›wt›xtž›ytŸ›zt ›{t¡|t¢|*t£|&t¤|8t¥|At¦|@t§þt¨‚t©‚tª‚t«ìt¬ˆDt­‚!t®‚"t¯‚#t°‚-t±‚/t²‚(t³‚+t´‚8tµ‚;t¶‚3t·‚4t¸‚>t¹‚Dtº‚It»‚Kt¼‚Ot½‚Zt¾‚_t¿‚htÀˆ~tÁˆ…tˆˆtÈØtĈßtʼn^tÆtÇŸtȧtɯtʰt˲tÌ||tÍeItÎ|‘tÏ|tÐ|œtÑ|žtÒ|¢tÓ|²tÔ|¼tÕ|½tÖ|Át×|ÇtØ|ÌtÙ|ÍtÚ|ÈtÛ|ÅtÜ|×tÝ|ètÞ‚ntßf¨tà¿táÎtâÕtãåtäátåætæétçîtèóté|øtê}wtë}¦tì}®tí~Gtî~›ttðž´tñstò„tó”tô‘tõ±tögt÷mtøŒGtùŒItú‘Jtû‘Ptü‘Ntý‘Otþ‘du@›|uA›}uB›~uC›uD›€uE›uF›‚uG›ƒuH›„uI›…uJ›†uK›‡uL›ˆuM›‰uN›ŠuO›‹uP›ŒuQ›uR›ŽuS›uT›uU›‘uV›’uW›“uX›”uY›•uZ›–u[›—u\›˜u]›™u^›šu_››u`›œua›ub›žuc›Ÿud› ue›¡uf›¢ug›£uh›¤ui›¥uj›¦uk›§ul›¨um›©un›ªuo›«up›¬uq›­ur›®us›¯ut›°uu›±uv›²uw›³ux›´uy›µuz›¶u{›·u|›¸u}›¹u~›ºu€›»u›¼u‚›½uƒ›¾u„›¿u…›Àu†›Áu‡›Âuˆ›Ãu‰›ÄuŠ›Åu‹›ÆuŒ›Çu›ÈuŽ›Éu›Êu›Ëu‘›Ìu’›Íu“›Îu”›Ïu•›Ðu–›Ñu—›Òu˜›Óu™›Ôuš›Õu››Öuœ›×u›Øuž›ÙuŸ›Úu ›Ûu¡‘bu¢‘au£‘pu¤‘iu¥‘ou¦‘}u§‘~u¨‘ru©‘tuª‘yu«‘Œu¬‘…u­‘u®‘u¯‘‘u°‘¢u±‘£u²‘ªu³‘­u´‘®uµ‘¯u¶‘µu·‘´u¸‘ºu¹ŒUuºž~u»¸u¼ëu½Žu¾ŽYu¿ŽiuÀµuÁ¿u¼uúuÄÄuÅÖuÆ×uÇÚuÈÞuÉÎuÊÏuËÛuÌÆuÍìuÎ÷uÏøuÐãuÑùuÒûuÓäuÔŽ uÕýuÖŽu׎uØŽuÙŽ,uÚŽ.uÛŽ#uÜŽ/uÝŽ:uÞŽ@uߎ9uàŽ5uáŽ=uâŽ1uãŽIuäŽAuåŽBuæŽQuçŽRuèŽJuéŽpuêŽvuëŽ|uìŽouíŽtuuïŽuðŽ”uñŽuòŽœuóŽžuôŒxuõŒ‚uöŒŠu÷Œ…uøŒ˜uùŒ”uúe›uû‰Öuü‰Þuý‰Úuþ‰Üv@›ÜvA›ÝvB›ÞvC›ßvD›àvE›ávF›âvG›ãvH›ävI›åvJ›ævK›çvL›èvM›évN›êvO›ëvP›ìvQ›ívR›îvS›ïvT›ðvU›ñvV›òvW›óvX›ôvY›õvZ›öv[›÷v\›øv]›ùv^›úv_›ûv`›üva›ývb›þvc›ÿvdœveœvfœvgœvhœviœvjœvkœvlœvmœ vnœ voœ vpœ vqœ vrœvsœvtœvuœvvœvwœvxœvyœvzœv{œv|œv}œv~œv€œvœv‚œvƒœv„œv…œ v†œ!v‡œ"vˆœ#v‰œ$vŠœ%v‹œ&vŒœ'vœ(vŽœ)vœ*vœ+v‘œ,v’œ-v“œ.v”œ/v•œ0v–œ1v—œ2v˜œ3v™œ4všœ5v›œ6vœœ7vœ8vžœ9vŸœ:v œ;v¡‰åv¢‰ëv£‰ïv¤Š>v¥‹&v¦—Sv§–év¨–óv©–ïvª—v«—v¬—v­—v®—v¯—*v°—-v±—0v²—>v³Ÿ€v´ŸƒvµŸ…v¶Ÿ†v·Ÿ‡v¸Ÿˆv¹Ÿ‰vºŸŠv»ŸŒv¼žþv½Ÿ v¾Ÿ v¿–¹vÀ–¼vÁ–½v–ÎvÖÒvÄw¿vÅ–àvÆ’ŽvÇ’®vÈ’ÈvÉ“>vÊ“jvË“ÊvÌ“vÍ”>vΔkvÏœvМ‚vÑœ…vÒœ†vÓœ‡vÔœˆvÕz#vÖœ‹vלŽvØœvÙœ‘vÚœ’vÛœ”vÜœ•vÝœšvÞœ›vßœžvàœŸvᜠv✡v㜢v䜣v圥v朦v眧v蜨v霩vꜫv뜭v윮v휰vvvðœ³vñœ´vòœµvóœ¶vôœ·võœºvöœ»v÷œ¼vøœ½vùœÄvúœÅvûœÆvüœÇvýœÊvþœËw@œwCœ?wDœ@wEœAwFœBwGœCwHœDwIœEwJœFwKœGwLœHwMœIwNœJwOœKwPœLwQœMwRœNwSœOwTœPwUœQwVœRwWœSwXœTwYœUwZœVw[œWw\œXw]œYw^œZw_œ[w`œ\waœ]wbœ^wcœ_wdœ`weœawfœbwgœcwhœdwiœewjœfwkœgwlœhwmœiwnœjwoœkwpœlwqœmwrœnwsœowtœpwuœqwvœrwwœswxœtwyœuwzœvw{œww|œxw}œyw~œzw€œ{wœ}w‚œ~wƒœ€w„œƒw…œ„w†œ‰w‡œŠwˆœŒw‰œwŠœ“w‹œ–wŒœ—wœ˜wŽœ™wœwœªw‘œ¬w’œ¯w“œ¹w”œ¾w•œ¿w–œÀw—œÁw˜œÂw™œÈwšœÉw›œÑwœœÒwœÚwžœÛwŸœàw œáw¡œÌw¢œÍw£œÎw¤œÏw¥œÐw¦œÓw§œÔw¨œÕw©œ×wªœØw«œÙw¬œÜw­œÝw®œßw¯œâw°—|w±—…w²—‘w³—’w´—”wµ—¯w¶—«w·—£w¸—²w¹—´wºš±w»š°w¼š·w½žXw¾š¶w¿šºwÀš¼wÁšÁwšÀwÚÅwÄšÂwÅšËwÆšÌwÇšÑwÈ›EwÉ›CwÊ›GwË›IwÌ›HwÍ›MwΛQwϘèwЙ wÑ™.wÒ™UwÓ™TwÔšßwÕšáwÖšæwךïwØšëwÙšûwÚšíwÛšùwÜ›wÝ›wÞ›wß›wà›#wáž½wâž¾wã~;wäž‚w垇w枈wçž‹wèž’wé“Öwêžw랟wìžÛwížÜwîžÝwïžàwðžßwñžâwòžéwóžçwôžåwõžêwöžïw÷Ÿ"wøŸ,wùŸ/wúŸ9wûŸ7wüŸ=wýŸ>wþŸDx@œãxAœäxBœåxCœæxDœçxEœèxFœéxGœêxHœëxIœìxJœíxKœîxLœïxMœðxNœñxOœòxPœóxQœôxRœõxSœöxTœ÷xUœøxVœùxWœúxXœûxYœüxZœýx[œþx\œÿx]x^x_x`xaxbxcxdxexf xg xh xi xj xkxlxmxnxoxpxqxrxsxtxuxvxwxxxyxzx{x|x} x~!x€"x#x‚$xƒ%x„&x…'x†(x‡)xˆ*x‰+xŠ,x‹-xŒ.x/xŽ0x1x2x‘3x’4x“5x”6x•7x–8x—9x˜:x™;xšx?xž@xŸAx Bx¡â4x¢â5x£â6x¤â7x¥â8x¦â9x§â:x¨â;x©âx¬â?x­â@x®âAx¯âBx°âCx±âDx²âEx³âFx´âGxµâHx¶âIx·âJx¸âKx¹âLxºâMx»âNx¼âOx½âPx¾âQx¿âRxÀâSxÁâTxÂâUxÃâVxÄâWxÅâXxÆâYxÇâZxÈâ[xÉâ\xÊâ]xËâ^xÌâ_xÍâ`xÎâaxÏâbxÐâcxÑâdxÒâexÓâfxÔâgxÕâhxÖâix×âjxØâkxÙâlxÚâmxÛânxÜâoxÝâpxÞâqxßârxàâsxáâtxââuxãâvxäâwxåâxxæâyxçâzxèâ{xéâ|xêâ}xëâ~xìâxíâ€xîâxïâ‚xðâƒxñâ„xòâ…xóâ†xôâ‡xõâˆxöâ‰x÷âŠxøâ‹xùâŒxúâxûâŽxüâxýâxþâ‘y@CyADyBEyCFyDGyEHyFIyGJyHKyILyJMyKNyLOyMPyNQyORyPSyQTyRUySVyTWyUXyVYyWZyX[yY\yZ]y[^y\_y]`y^ay_by`cyadybeycfydgyehyfiygjyhkyilyjmyknyloympynqyorypsyqtyruysvytwyuxyvyywzyx{yy|yz}y{~y|y}€y~y€‚yƒy‚„yƒ…y„†y…‡y†ˆy‡‰yˆŠy‰‹yŠŒy‹yŒŽyyŽy‘y’y‘“y’”y“•y”–y•—y–˜y—™y˜šy™›yšœy›yœžyŸyž yŸ¡y ¢y¡â’y¢â“y£â”y¤â•y¥â–y¦â—y§â˜y¨â™y©âšyªâ›y«âœy¬ây­âžy®âŸy¯â y°â¡y±â¢y²â£y³â¤y´â¥yµâ¦y¶â§y·â¨y¸â©y¹âªyºâ«y»â¬y¼â­y½â®y¾â¯y¿â°yÀâ±yÁâ²yÂâ³yÃâ´yÄâµyÅâ¶yÆâ·yÇâ¸yÈâ¹yÉâºyÊâ»yËâ¼yÌâ½yÍâ¾yÎâ¿yÏâÀyÐâÁyÑâÂyÒâÃyÓâÄyÔâÅyÕâÆyÖâÇy×âÈyØâÉyÙâÊyÚâËyÛâÌyÜâÍyÝâÎyÞâÏyßâÐyàâÑyáâÒyââÓyãâÔyäâÕyåâÖyæâ×yçâØyèâÙyéâÚyêâÛyëâÜyìâÝyíâÞyîâßyïâàyðâáyñââyòâãyóâäyôâåyõâæyöâçy÷âèyøâéyùâêyúâëyûâìyüâíyýâîyþâïz@£zA¤zB¥zC¦zD§zE¨zF©zGªzH«zI¬zJ­zK®zL¯zM°zN±zO²zP³zQ´zRµzS¶zT·zU¸zV¹zWºzX»zY¼zZ½z[¾z\¿z]Àz^Áz_Âz`ÃzaÄzbÅzcÆzdÇzeÈzfÉzgÊzhËziÌzjÍzkÎzlÏzmÐznÑzoÒzpÓzqÔzrÕzsÖzt×zuØzvÙzwÚzxÛzyÜzzÝz{Þz|ßz}àz~áz€âzãz‚äzƒåz„æz…çz†èz‡ézˆêz‰ëzŠìz‹ízŒîzïzŽðzñzòz‘óz’ôz“õz”öz•÷z–øz—ùz˜úz™ûzšüz›ýzœþzÿzžžzŸžz žz¡âðz¢âñz£âòz¤âóz¥âôz¦âõz§âöz¨â÷z©âøzªâùz«âúz¬âûz­âüz®âýz¯âþz°âÿz±ãz²ãz³ãz´ãzµãz¶ãz·ãz¸ãz¹ãzºã z»ã z¼ã z½ã z¾ã z¿ãzÀãzÁãzÂãzÃãzÄãzÅãzÆãzÇãzÈãzÉãzÊãzËãzÌãzÍãzÎãzÏãzÐãzÑã zÒã!zÓã"zÔã#zÕã$zÖã%z×ã&zØã'zÙã(zÚã)zÛã*zÜã+zÝã,zÞã-zßã.zàã/záã0zâã1zãã2zäã3zåã4zæã5zçã6zèã7zéã8zêã9zëã:zìã;zíãzðã?zñã@zòãAzóãBzôãCzõãDzöãEz÷ãFzøãGzùãHzúãIzûãJzüãKzýãLzþãM{@ž{Až{Bž{Cž{Dž{Ež{Fž {Gž {Hž {Iž {Jž {Kž{Lž{Mž{Nž{Ož{Pž{Qž{Rž{Sž{Tž{Už{Vž{Wž{Xž{Yž{Zž{[ž{\ž${]ž'{^ž.{_ž0{`ž4{až;{bž<{cž@{džM{ežP{fžR{gžS{hžT{ižV{jžY{kž]{lž_{mž`{nža{ožb{pže{qžn{ržo{sžr{tžt{užu{vžv{wžw{xžx{yžy{zžz{{ž{{|ž|{}ž}{~ž€{€ž{žƒ{‚ž„{ƒž…{„ž†{…ž‰{†žŠ{‡žŒ{ˆž{‰žŽ{Šž{‹ž{Œž‘{ž”{Žž•{ž–{ž—{‘ž˜{’ž™{“žš{”ž›{•žœ{–žž{—ž {˜ž¡{™ž¢{šž£{›ž¤{œž¥{ž§{žž¨{Ÿž©{ žª{¡ãN{¢ãO{£ãP{¤ãQ{¥ãR{¦ãS{§ãT{¨ãU{©ãV{ªãW{«ãX{¬ãY{­ãZ{®ã[{¯ã\{°ã]{±ã^{²ã_{³ã`{´ãa{µãb{¶ãc{·ãd{¸ãe{¹ãf{ºãg{»ãh{¼ãi{½ãj{¾ãk{¿ãl{Àãm{Áãn{Âão{Ããp{Äãq{Åãr{Æãs{Çãt{Èãu{Éãv{Êãw{Ëãx{Ìãy{Íãz{Îã{{Ïã|{Ðã}{Ñã~{Òã{Óã€{Ôã{Õã‚{Öãƒ{×ã„{Øã…{Ùã†{Úã‡{Ûãˆ{Üã‰{ÝãŠ{Þã‹{ßãŒ{àã{áãŽ{âã{ãã{äã‘{åã’{æã“{çã”{èã•{éã–{êã—{ëã˜{ìã™{íãš{îã›{ïãœ{ðã{ñãž{òãŸ{óã {ôã¡{õã¢{öã£{÷ã¤{øã¥{ùã¦{úã§{ûã¨{üã©{ýãª{þã«|@ž«|Až¬|Bž­|Cž®|Dž¯|Ež°|Fž±|Gž²|Hž³|Ižµ|Jž¶|Kž·|Lž¹|Mžº|Nž¼|Ož¿|PžÀ|QžÁ|RžÂ|SžÃ|TžÅ|UžÆ|VžÇ|WžÈ|XžÊ|YžË|ZžÌ|[žÐ|\žÒ|]žÓ|^žÕ|_žÖ|`ž×|ažÙ|bžÚ|cžÞ|džá|ežã|fžä|gžæ|hžè|ižë|jžì|kží|lžî|mžð|nžñ|ožò|pžó|qžô|ržõ|sžö|tž÷|užø|vžú|wžý|xžÿ|yŸ|zŸ|{Ÿ||Ÿ|}Ÿ|~Ÿ|€Ÿ|Ÿ|‚Ÿ|ƒŸ |„Ÿ |…Ÿ |†Ÿ|‡Ÿ|ˆŸ|‰Ÿ|ŠŸ|‹Ÿ|ŒŸ|Ÿ|ŽŸ|Ÿ|Ÿ|‘Ÿ|’Ÿ|“Ÿ!|”Ÿ#|•Ÿ$|–Ÿ%|—Ÿ&|˜Ÿ'|™Ÿ(|šŸ)|›Ÿ*|œŸ+|Ÿ-|žŸ.|ŸŸ0| Ÿ1|¡ã¬|¢ã­|£ã®|¤ã¯|¥ã°|¦ã±|§ã²|¨ã³|©ã´|ªãµ|«ã¶|¬ã·|­ã¸|®ã¹|¯ãº|°ã»|±ã¼|²ã½|³ã¾|´ã¿|µãÀ|¶ãÁ|·ãÂ|¸ãÃ|¹ãÄ|ºãÅ|»ãÆ|¼ãÇ|½ãÈ|¾ãÉ|¿ãÊ|ÀãË|ÁãÌ|ÂãÍ|ÃãÎ|ÄãÏ|ÅãÐ|ÆãÑ|ÇãÒ|ÈãÓ|ÉãÔ|ÊãÕ|ËãÖ|Ìã×|ÍãØ|ÎãÙ|ÏãÚ|ÐãÛ|ÑãÜ|ÒãÝ|ÓãÞ|Ôãß|Õãà|Öãá|×ãâ|Øãã|Ùãä|Úãå|Ûãæ|Üãç|Ýãè|Þãé|ßãê|àãë|áãì|âãí|ããî|äãï|åãð|æãñ|çãò|èãó|éãô|êãõ|ëãö|ìã÷|íãø|îãù|ïãú|ðãû|ñãü|òãý|óãþ|ôãÿ|õä|öä|÷ä|øä|ùä|úä|ûä|üä|ýä|þä }@Ÿ2}AŸ3}BŸ4}CŸ5}DŸ6}EŸ8}FŸ:}GŸ<}HŸ?}IŸ@}JŸA}KŸB}LŸC}MŸE}NŸF}OŸG}PŸH}QŸI}RŸJ}SŸK}TŸL}UŸM}VŸN}WŸO}XŸR}YŸS}ZŸT}[ŸU}\ŸV}]ŸW}^ŸX}_ŸY}`ŸZ}aŸ[}bŸ\}cŸ]}dŸ^}eŸ_}fŸ`}gŸa}hŸb}iŸc}jŸd}kŸe}lŸf}mŸg}nŸh}oŸi}pŸj}qŸk}rŸl}sŸm}tŸn}uŸo}vŸp}wŸq}xŸr}yŸs}zŸt}{Ÿu}|Ÿv}}Ÿw}~Ÿx}€Ÿy}Ÿz}‚Ÿ{}ƒŸ|}„Ÿ}}…Ÿ~}†Ÿ}‡Ÿ‚}ˆŸ}‰ŸŽ}ŠŸ}‹Ÿ}ŒŸ‘}Ÿ’}ŽŸ“}Ÿ”}Ÿ•}‘Ÿ–}’Ÿ—}“Ÿ˜}”Ÿœ}•Ÿ}–Ÿž}—Ÿ¡}˜Ÿ¢}™Ÿ£}šŸ¤}›Ÿ¥}œù,}ùy}žù•}Ÿùç} ùñ}¡ä }¢ä }£ä }¤ä }¥ä}¦ä}§ä}¨ä}©ä}ªä}«ä}¬ä}­ä}®ä}¯ä}°ä}±ä}²ä}³ä}´ä}µä}¶ä}·ä }¸ä!}¹ä"}ºä#}»ä$}¼ä%}½ä&}¾ä'}¿ä(}Àä)}Áä*}Âä+}Ãä,}Ää-}Åä.}Æä/}Çä0}Èä1}Éä2}Êä3}Ëä4}Ìä5}Íä6}Îä7}Ïä8}Ðä9}Ñä:}Òä;}Óä<}Ôä=}Õä>}Öä?}×ä@}ØäA}ÙäB}ÚäC}ÛäD}ÜäE}ÝäF}ÞäG}ßäH}àäI}áäJ}âäK}ãäL}ääM}åäN}æäO}çäP}èäQ}éäR}êäS}ëäT}ìäU}íäV}îäW}ïäX}ðäY}ñäZ}òä[}óä\}ôä]}õä^}öä_}÷ä`}øäa}ùäb}úäc}ûäd}üäe}ýäf}þäg~@ú ~Aú ~Bú~Cú~Dú~Eú~Fú~Gú~Hú~Iú ~Jú!~Kú#~Lú$~Mú'~Nú(~Oú)~Pè~Qè~Rè~Sè~Tè~Uè~Vè~Wè~Xè~Yè~Zè~[è ~\è!~]è"~^è#~_è$~`è%~aè&~bè'~cè(~dè)~eè*~fè+~gè,~hè-~iè.~jè/~kè0~lè1~mè2~nè3~oè4~pè5~qè6~rè7~sè8~tè9~uè:~vè;~wè<~xè=~yè>~zè?~{è@~|èA~}èB~~èC~€èD~èE~‚èF~ƒèG~„èH~…èI~†èJ~‡èK~ˆèL~‰èM~ŠèN~‹èO~ŒèP~èQ~ŽèR~èS~èT~‘èU~’èV~“èW~”èX~•èY~–èZ~—è[~˜è\~™è]~šè^~›è_~œè`~èa~žèb~Ÿèc~ èd~¡äh~¢äi~£äj~¤äk~¥äl~¦äm~§än~¨äo~©äp~ªäq~«är~¬äs~­ät~®äu~¯äv~°äw~±äx~²äy~³äz~´ä{~µä|~¶ä}~·ä~~¸ä~¹ä€~ºä~»ä‚~¼äƒ~½ä„~¾ä…~¿ä†~Àä‡~Áäˆ~Âä‰~ÃäŠ~Ää‹~ÅäŒ~Æä~ÇäŽ~Èä~Éä~Êä‘~Ëä’~Ìä“~Íä”~Îä•~Ïä–~Ðä—~Ñä˜~Òä™~Óäš~Ôä›~Õäœ~Öä~×äž~ØäŸ~Ùä ~Úä¡~Ûä¢~Üä£~Ýä¤~Þä¥~ßä¦~àä§~áä¨~âä©~ãäª~ää«~åä¬~æä­~çä®~èä¯~éä°~êä±~ëä²~ìä³~íä´~îäµ~ïä¶~ðä·~ñä¸~òä¹~óäº~ôä»~õä¼~öä½~÷ä¾~øä¿~ùäÀ~úäÁ~ûäÂ~üäÃ~ýäÄ~þäÅscreen-5.0.2/utf8encodings/180000664000175000017500000015311615224432722014410 0ustar alexalexScreenI2UTF85ŽBIG 5!@0!Aÿ !B0!C0!Dÿ!E "!Fÿ!Gÿ!Hÿ!Iÿ!Jþ0!K &!L %!MþP!Nÿd!OþR!P·!QþT!RþU!SþV!TþW!Uÿ\!V !Wþ1!X !Yþ3!Zÿý![þ4!\þO!]ÿ!^ÿ !_þ5!`þ6!aÿ[!bÿ]!cþ7!dþ8!e0!f0!gþ9!hþ:!i0!j0!kþ;!lþ!q0!r0 !sþ?!tþ@!u0 !v0 !wþA!xþB!y0!z0!{þC!|þD!}þY!~þZ!¡þ[!¢þ\!£þ]!¤þ^!¥ !¦ !§ !¨ !©0!ª0!« 5!¬ 2!­ÿ!®ÿ!¯ÿ !° ;!±§!²0!³%Ë!´%Ï!µ%³!¶%²!·%Î!¸&!¹&!º%Ç!»%Æ!¼%¡!½% !¾%½!¿%¼!À2£!Á!! >!Ãÿý!Äÿ?!Åÿý!ÆþI!ÇþJ!ÈþM!ÉþN!ÊþK!ËþL!Ìþ_!Íþ`!Îþa!Ïÿ !Ðÿ !Ñ×!Ò÷!Ó±!Ô"!Õÿ!Öÿ!×ÿ!Ø"f!Ù"g!Ú"`!Û"!Ü"R!Ý"a!Þþb!ßþc!àþd!áþe!âþf!ã"%Çr¯%Ès„%És‰%ÊtÜ%Ëtæ%Ìu%Íu%Îu(%Ïu)%Ðu0%Ñu1%Òu2%Óu3%Ôu‹%Õv}%Öv®%×v¿%Øvî%ÙwÛ%Úwâ%Ûwó%Üy:%Ýy¾%Þzt%ßzË%àN%áN%âNR%ãNS%äNi%åN™%æN¤%çN¦%èN¥%éNÿ%êO %ëO%ìO %íO%îO %ïO%ðO%ñO%òNò%óNö%ôNû%õNð%öNó%÷Ný%øO%ùO %úQI%ûQG%üQF%ýQH%þQh&@Qq&AQ&BQ°&CR&DR&ER&FR&GR&HR£&IS&JS!&KS &LSp&MSq&NT &OT&PT &QT &RT&ST&TT &UT&VT&WT &XT&YT&ZT&[T&\T&]Và&^VÞ&_VÝ&`W3&aW0&bW(&cW-&dW,&eW/&fW)&gY&hY&iY7&jY8&kY„&lYx&mYƒ&nY}&oYy&pY‚&qY&r[W&s[X&t[‡&u[ˆ&v[…&w[‰&x[ú&y\&z\y&{]Þ&|^&}^v&~^t&¡_&¢_&£_Ù&¤_Ö&¥b&¦b &§b &¨b&©bc&ªb[&«bX&¬e6&­eé&®eè&¯eì&°eí&±fò&²fó&³g &´g=&µg4&¶g1&·g5&¸k!&¹kd&ºk{&»l&¼l]&½lW&¾lY&¿l_&Àl`&ÁlP&ÂlU&Ãla&Äl[&ÅlM&ÆlN&Çpp&Èr_&Ér]&Êv~&Ëzù&Ì|s&Í|ø&Î6&ÏŠ&н&Ñ€&Ò€&Ó€ &Ô€&Õ€3&Ö€&×€‰&Ø€‹&Ù€Œ&Úã&Ûê&Üó&Ýü&Þ‚ &ß‚&à‚&á‚n&â‚r&ã‚~&ä†k&åˆ@&æˆL&çˆc&è‰&é–!&êN2&ëN¨&ìOM&íOO&îOG&ïOW&ðO^&ñO4&òO[&óOU&ôO0&õOP&öOQ&÷O=&øO:&ùO8&úOC&ûOT&üO<&ýOF&þOc'@O\'AO`'BO/'CON'DO6'EOY'FO]'GOH'HOZ'IQL'JQK'KQM'LQu'MQ¶'NQ·'OR%'PR$'QR)'RR*'SR('TR«'UR©'VRª'WR¬'XS#'YSs'ZSu'[T'\T-']T'^T>'_T&'`TN'aT''bTF'cTC'dT3'eTH'fTB'gT'hT)'iTJ'jT9'kT;'lT8'mT.'nT5'oT6'pT 'qT<'rT@'sT1'tT+'uT'vT,'wVê'xVð'yVä'zVë'{WJ'|WQ'}W@'~WM'¡WG'¢WN'£W>'¤WP'¥WO'¦W;'§Xï'¨Y>'©Y'ªY’'«Y¨'¬Yž'­Y£'®Y™'¯Y–'°Y'±Y¤'²Y“'³YŠ'´Y¥'µ[]'¶[\'·[Z'¸[['¹[Œ'º[‹'»['¼\,'½\@'¾\A'¿\?'À\>'Á\'Â\‘'Ã\”'Ä\Œ'Å]ë'Æ^ 'Ç^'È^‡'É^Š'Ê^÷'Ë_'Ì_'Í_d'Î_b'Ï_w'Ð_y'Ñ_Ø'Ò_Ì'Ó_×'Ô_Í'Õ_ñ'Ö_ë'×_ø'Ø_ê'Ùb'Úb'Ûb„'Üb—'Ýb–'Þb€'ßbv'àb‰'ábm'âbŠ'ãb|'äb~'åby'æbs'çb’'èbo'éb˜'êbn'ëb•'ìb“'íb‘'îb†'ïe9'ðe;'ñe8'òeñ'ófô'ôg_'õgN'ögO'÷gP'øgQ'ùg\'úgV'ûg^'ügI'ýgF'þg`(@gS(AgW(Bke(CkÏ(DlB(El^(Fl™(Gl(Hlˆ(Il‰(Jl…(Kl›(Llj(Mlz(Nl(Olp(PlŒ(Qlh(Rl–(Sl’(Tl}(Ulƒ(Vlr(Wl~(Xlt(Yl†(Zlv([l(\l”(]l˜(^l‚(_pv(`p|(ap}(bpx(crb(dra(er`(frÄ(grÂ(hs–(iu,(ju+(ku7(lu8(mv‚(nvï(owã(pyÁ(qyÀ(ry¿(szv(t|û(uU(v€–(w€“(x€(y€˜(z€›({€š(|€²(}‚o(~‚’(¡‚‹(¢‚(£‰‹(¤‰Ò(¥Š(¦Œ7(§ŒF(¨ŒU(©Œ(ªd(«p(¬³(­Ž«(®ŽÊ(¯›(°°(±Â(²Æ(³Å(´Ä(µ]á(¶‘(·¢(¸ª(¹¦(º£(»‘I(¼‘Æ(½‘Ì(¾–2(¿–.(À–1(Á–*(–,(ÃN&(ÄNV(ÅNs(ÆN‹(ÇN›(ÈNž(ÉN«(ÊN¬(ËOo(ÌO(ÍO(ÎOs(ÏO(ÐOl(ÑO›(ÒO‹(ÓO†(ÔOƒ(ÕOp(ÖOu(×Oˆ(ØOi(ÙO{(ÚO–(ÛO~(ÜO(ÝO‘(ÞOz(ßQT(àQR(áQU(âQi(ãQw(äQv(åQx(æQ½(çQý(èR;(éR8(êR7(ëR:(ìR0(íR.(îR6(ïRA(ðR¾(ñR»(òSR(óST(ôSS(õSQ(öSf(÷Sw(øSx(ùSy(úSÖ(ûSÔ(üS×(ýTs(þTu)@T–)ATx)BT•)CT€)DT{)ETw)FT„)GT’)HT†)IT|)JT)KTq)LTv)MTŒ)NTš)OTb)PTh)QT‹)RT})STŽ)TVú)UWƒ)VWw)WWj)XWi)YWa)ZWf)[Wd)\W|)]Y)^YI)_YG)`YH)aYD)bYT)cY¾)dY»)eYÔ)fY¹)gY®)hYÑ)iYÆ)jYÐ)kYÍ)lYË)mYÓ)nYÊ)oY¯)pY³)qYÒ)rYÅ)s[_)t[d)u[c)v[—)w[š)x[˜)y[œ)z[™){[›)|\)}\H)~\E)¡\F)¢\·)£\¡)¤\¸)¥\©)¦\«)§\±)¨\³)©^)ª^)«^)¬^)­^)®^)¯^x)°^š)±^—)²^œ)³^•)´^–)µ^ö)¶_&)·_')¸_))¹_€)º_)»_)¼_|)½_Ý)¾_à)¿_ý)À_õ)Á_ÿ)Â`)Ã`)Ä`/)Å`5)Æ`)Ç`*)È`)É`!)Ê`')Ë`))Ì`+)Í`)Îb)Ïb)Ðb?)Ñb>)Òb@)Ób)ÔbÉ)ÕbÌ)ÖbÄ)×b¿)ØbÂ)Ùb¹)ÚbÒ)ÛbÛ)Üb«)ÝbÓ)ÞbÔ)ßbË)àbÈ)áb¨)âb½)ãb¼)äbÐ)åbÙ)æbÇ)çbÍ)èbµ)ébÚ)êb±)ëbØ)ìbÖ)íb×)îbÆ)ïb¬)ðbÎ)ñe>)òe§)óe¼)ôeú)õf)öf)÷f )øf)ùf)úf)ûf)üf)ýf)þf *@f*Ag *Bg *Cgm*Dg‹*Eg•*Fgq*Ggœ*Hgs*Igw*Jg‡*Kg*Lg—*Mgo*Ngp*Og*Pg‰*Qg~*Rg*Sgu*Tgš*Ug“*Vg|*Wgj*Xgr*Yk#*Zkf*[kg*\k*]l*^l*_lã*`lè*aló*bl±*clÌ*dlå*el³*fl½*gl¾*hl¼*ilâ*jl«*klÕ*llÓ*ml¸*nlÄ*ol¹*plÁ*ql®*rl×*slÅ*tlñ*ul¿*vl»*wlá*xlÛ*ylÊ*zl¬*{lï*|lÜ*}lÖ*~là*¡p•*¢pŽ*£p’*¤pŠ*¥p™*¦r,*§r-*¨r8*©rH*ªrg*«ri*¬rÀ*­rÎ*®rÙ*¯r×*°rÐ*±s©*²s¨*³sŸ*´s«*µs¥*¶u=*·u*¸u™*¹uš*ºv„*»vÂ*¼vò*½vô*¾wå*¿wý*Ày>*Áy@*ÂyA*ÃyÉ*ÄyÈ*Åzz*Æzy*Çzú*È|þ*ÉT*ÊŒ*Ë‹*Ì€*Í€º*΀¥*Ï€¢*Ѐ±*Ñ€¡*Ò€«*Ó€©*Ô€´*Õ€ª*Ö€¯*×å*Øþ*Ù‚ *Ú‚³*Û‚*Ü‚™*Ý‚­*Þ‚½*ß‚Ÿ*à‚¹*Ⴑ*€*ã‚¥*䂯*傸*æ‚£*ç‚°*肾*é‚·*ê†N*ë†q*ìR*íˆh*îŽË*ïÎ*ðÔ*ñÑ*òµ*ó¸*ô±*õ¶*ö‘Ç*÷‘Ñ*ø•w*ù•€*ú–*û–@*ü–?*ý–;*þ–D+@–B+A–¹+B–è+C—R+D—^+ENŸ+FN­+GN®+HOá+IOµ+JO¯+KO¿+LOà+MOÑ+NOÏ+OOÝ+POÃ+QO¶+ROØ+SOß+TOÊ+UO×+VO®+WOÐ+XOÄ+YOÂ+ZOÚ+[OÎ+\OÞ+]O·+^QW+_Q’+`Q‘+aQ +bRN+cRC+dRJ+eRM+fRL+gRK+hRG+iRÇ+jRÉ+kRÃ+lRÁ+mS +nSW+oS{+pSš+qSÛ+rT¬+sTÀ+tT¨+uTÎ+vTÉ+wT¸+xT¦+yT³+zTÇ+{TÂ+|T½+}Tª+~TÁ+¡TÄ+¢TÈ+£T¯+¤T«+¥T±+¦T»+§T©+¨T§+©T¿+ªVÿ+«W‚+¬W‹+­W +®W£+¯W¢+°WÎ+±W®+²W“+³YU+´YQ+µYO+¶YN+·YP+¸YÜ+¹YØ+ºYÿ+»Yã+¼Yè+½Z+¾Yå+¿Yê+ÀYÚ+ÁYæ+ÂZ+ÃYû+Ä[i+Å[£+Æ[¦+Ç[¤+È[¢+É[¥+Ê\+Ë\N+Ì\O+Í\M+Î\K+Ï\Ù+Ð\Ò+Ñ]÷+Ò^+Ó^%+Ô^+Õ^}+Ö^ +×^¦+Ø^ú+Ù_+Ú_-+Û_e+Ü_ˆ+Ý_…+Þ_Š+ß_‹+à_‡+á_Œ+â_‰+ã`+ä`+å` +æ`%+ç`+è`(+é`M+ê`p+ë`h+ì`b+í`F+î`C+ï`l+ð`k+ñ`j+ò`d+óbA+ôbÜ+õc+öc +÷bü+øbí+ùc+úbî+ûbý+üc+ýbñ+þb÷,@bï,Abì,Bbþ,Cbô,Dc,Ec,Fe?,GeE,He«,Ie½,Jeâ,Kf%,Lf-,Mf ,Nf',Of/,Pf,Qf(,Rf1,Sf$,Tf÷,Ugÿ,VgÓ,Wgñ,XgÔ,YgÐ,Zgì,[g¶,\g¯,]gõ,^gé,_gï,`gÄ,agÑ,bg´,cgÚ,dgå,eg¸,fgÏ,ggÞ,hgó,ig°,jgÙ,kgâ,lgÝ,mgÒ,nkj,okƒ,pk†,qkµ,rkÒ,sk×,tl,ulÉ,vm ,wm2,xm*,ymA,zm%,{m ,|m1,}m,~m,¡m;,¢m=,£m>,¤m6,¥m,¦lõ,§m9,¨m',©m8,ªm),«m.,¬m5,­m,®m+,¯p«,°pº,±p³,²p¬,³p¯,´p­,µp¸,¶p®,·p¤,¸r0,¹rr,ºro,»rt,¼ré,½rà,¾rá,¿s·,ÀsÊ,Ás»,Âs²,ÃsÍ,ÄsÀ,Ås³,Æu,Çu-,ÈuO,ÉuL,ÊuN,ËuK,Ìu«,Íu¤,Îu¥,Ïu¢,Ðu£,Ñvx,Òv†,Óv‡,Ôvˆ,ÕvÈ,ÖvÆ,×vÃ,ØvÅ,Ùw,Úvù,Ûvø,Üw ,Ýw ,Þvþ,ßvü,àw,áwÜ,âx,ãx,äx ,åx ,æyF,çyI,èyH,éyG,êy¹,ëyº,ìyÑ,íyÒ,îyË,ïz,ðz,ñzÿ,òzý,ó|},ô},õ},ö},÷} ,ø},ù},ú},û8,üŽ,ý¿,þ€-@€-A€ -B€-C€6-D€Ö-E€å-F€Ú-G€Ã-H€Ä-I€Ì-J€á-K€Û-L€Î-M€Þ-N€ä-O€Ý-Pô-Q‚"-R‚ç-Sƒ-Tƒ-U‚ã-V‚Û-W‚æ-Xƒ-Y‚å-Zƒ-[ƒ -\‚Ò-]‚×-^‚ñ-_ƒ-`‚Ü-a‚Ô-b‚Ñ-c‚Þ-d‚Ó-e‚ß-f‚ï-gƒ-h†P-i†y-j†{-k†z-lˆM-mˆk-n‰-o‰Ô-pŠ-qŠ-rŠ-sŒž-tŒ -ut-vs-w´-xŽÍ-yŽÌ-zð-{æ-|â-}ê-~å-¡í-¢ë-£ä-¤è-¥Ê-¦Î-§Á-¨Ã-©‘K-ª‘J-«‘Í-¬•‚-­–P-®–K-¯–L-°–M-±—b-²—i-³—Ë-´—í-µ—ó-¶˜-·˜¨-¸˜Û-¹˜ß-º™–-»™™-¼NX-½N³-¾P -¿P -ÀP#-ÁOï-ÂP&-ÃP%-ÄOø-ÅP)-ÆP-ÇP-ÈP<-ÉP-ÊP-ËP-ÌP-ÍOú-ÎP-ÏP-ÐP(-ÑOñ-ÒP!-ÓP -ÔP-ÕP-ÖOó-×Oî-ØP--ÙP*-ÚOþ-ÛP+-ÜP -ÝQ|-ÞQ¤-ßQ¥-àQ¢-áQÍ-âQÌ-ãQÆ-äQË-åRV-æR\-çRT-èR[-éR]-êS*-ëS-ìSŸ-íS-îSß-ïTè-ðU-ñU-òU7-óTü-ôTå-õTò-öU-÷Tú-øU-ùTé-úTí-ûTá-üU -ýTî-þTê.@Tæ.AU'.BU.CTý.DU.EW.FW.GWÂ.HWÔ.IWË.JWÃ.KX .LY.MYW.NYX.OYZ.PZ.QZ.RZ.SZ.TZ.UZ.VYì.WZ .XZ#.YZ).ZZ%.[Z .\Z .][k.^\X._[°.`[³.a[¶.b[´.c[®.d[µ.e[¹.f[¸.g\.h\Q.i\U.j\P.k\í.l\ý.m\û.n\ê.o\è.p\ð.q\ö.r].s\ô.t]î.u^-.v^+.w^«.x^­.y^§.z_1.{_’.|_‘.}_.~`Y.¡`c.¢`e.£`P.¤`U.¥`m.¦`i.§`o.¨`„.©`Ÿ.ª`š.«`.¬`”.­`Œ.®`….¯`–.°bG.±bó.²c.³bÿ.´cN.µc>.¶c/.·cU.¸cB.¹cF.ºcO.»cI.¼c:.½cP.¾c=.¿c*.Àc+.Ác(.ÂcM.ÃcL.ÄeH.ÅeI.Æe™.ÇeÁ.ÈeÅ.ÉfB.ÊfI.ËfO.ÌfC.ÍfR.ÎfL.ÏfE.ÐfA.Ñfø.Òg.Óg.Ôg.Õh!.Öh8.×hH.ØhF.ÙhS.Úh9.ÛhB.ÜhT.Ýh).Þh³.ßh.àhL.áhQ.âh=.ãgô.ähP.åh@.æh<.çhC.èh*.éhE.êh.ëh.ìhA.íkŠ.îk‰.ïk·.ðl#.ñl'.òl(.ól&.ôl$.õlð.ömj.÷m•.ømˆ.ùm‡.úmf.ûmx.ümw.ýmY.þm“/@ml/Am‰/Bmn/CmZ/Dmt/Emi/FmŒ/GmŠ/Hmy/Im…/Jme/Km”/LpÊ/MpØ/Npä/OpÙ/PpÈ/QpÏ/Rr9/Sry/Trü/Urù/Vrý/Wrø/Xr÷/Ys†/Zsí/[t /\sî/]sà/^sê/_sÞ/`uT/au]/bu\/cuZ/duY/eu¾/fuÅ/guÇ/hu²/iu³/ju½/ku¼/lu¹/muÂ/nu¸/ov‹/pv°/qvÊ/rvÍ/svÎ/tw)/uw/vw /ww(/xwé/yx0/zx'/{x8/|x/}x4/~x7/¡x%/¢x-/£x /¤x/¥x2/¦yU/§yP/¨y`/©y_/ªyV/«y^/¬y]/­yW/®yZ/¯yä/°yã/±yç/²yß/³yæ/´yé/µyØ/¶z„/·zˆ/¸zÙ/¹{/º{/»|‰/¼}!/½}/¾} /¿} /À} /Á}"/Â}/Ã}/Ä}/Å}/Æ}/Ç} /È}/É}/Ê:/Ë_/Ì”/ÍÅ/ÎÁ/Ï€/Ѐ/Ñ€/Ò€/Ó€/Ô€=/Õ€?/Ö€ñ/×/Ø€ð/Ù/Ú€í/Û€ô/Ü/Ý€ø/Þ€ó/ß/à€ý/á /â€ü/ã€ï/äí/åì/æ‚/ç‚/è‚*/é‚+/ê‚(/ë‚,/ì‚»/íƒ+/îƒR/ïƒT/ðƒJ/ñƒ8/òƒP/óƒI/ôƒ5/õƒ4/öƒO/÷ƒ2/øƒ9/ùƒ6/úƒ/ûƒ@/üƒ1/ýƒ(/þƒC0@†T0A†Š0B†ª0C†“0D†¤0E†©0F†Œ0G†£0H†œ0Iˆp0Jˆw0Kˆ0Lˆ‚0Mˆ}0Nˆy0OŠ0PŠ0QŠ0RŠ 0SŠ0TŠ 0UŠ0VŠ0WŠ0XŠ0YŠ0ZŒH0[Œz0\Œy0]Œ¡0^Œ¢0_w0`ެ0aŽÒ0bŽÔ0cŽÏ0d±0e0f0g÷0h0iú0jô0k0lý0m0nø0o•0pá0qÝ0râ0s‘R0t‘M0u‘L0v‘Ø0w‘Ý0x‘×0y‘Ü0z‘Ù0{•ƒ0|–b0}–c0~–a0¡–[0¢–]0£–d0¤–X0¥–^0¦–»0§˜â0¨™¬0©š¨0ªšØ0«›%0¬›20­›<0®N~0¯Pz0°P}0±P\0²PG0³PC0´PL0µPZ0¶PI0·Pe0¸Pv0¹PN0ºPU0»Pu0¼Pt0½Pw0¾PO0¿P0ÀPo0ÁPm0ÂQ\0ÃQ•0ÄQð0ÅRj0ÆRo0ÇRÒ0ÈRÙ0ÉRØ0ÊRÕ0ËS0ÌS0ÍS0ÎS?0ÏS@0ÐS>0ÑSÃ0Òfü0ÓUF0ÔUj0ÕUf0ÖUD0×U^0ØUa0ÙUC0ÚUJ0ÛU10ÜUV0ÝUO0ÞUU0ßU/0àUd0áU80âU.0ãU\0äU,0åUc0æU30çUA0èUW0éW0êW 0ëW 0ìWß0íX0îX 0ïX0ðWà0ñWä0òWú0óX0ôX50õW÷0öWù0÷Y 0øYb0ùZ60úZA0ûZI0üZf0ýZj0þZ@1@Z<1AZb1BZZ1CZF1DZJ1E[p1F[Ç1G[Å1H[Ä1I[Â1J[¿1K[Æ1L\ 1M\1N\1O\`1P\\1Q\]1R]1S]1T]1U]1V]1W]"1X]1Y])1Z]1[]1\]$1]]'1^]1_]â1`^81a^61b^31c^71d^·1e^¸1f^¶1g^µ1h^¾1i_51j_71k_W1l_l1m_i1n_k1o_—1p_™1q_ž1r_˜1s_¡1t_ 1u_œ1v`1w`£1x`‰1y` 1z`¨1{`Ë1|`´1}`æ1~`½1¡`Å1¢`»1£`µ1¤`Ü1¥`¼1¦`Ø1§`Õ1¨`Æ1©`ß1ª`¸1«`Ú1¬`Ç1­b1®b1¯bH1°c 1±c§1²cr1³c–1´c¢1µc¥1¶cw1·cg1¸c˜1¹cª1ºcq1»c©1¼c‰1½cƒ1¾c›1¿ck1Àc¨1Ác„1Âcˆ1Ãc™1Äc¡1Åc¬1Æc’1Çc1Èc€1Éc{1Êci1Ëch1Ìcz1Íe]1ÎeV1ÏeQ1ÐeY1ÑeW1ÒU_1ÓeO1ÔeX1ÕeU1ÖeT1×eœ1Øe›1Ùe¬1ÚeÏ1ÛeË1ÜeÌ1ÝeÎ1Þf]1ßfZ1àfd1áfh1âff1ãf^1äfù1åR×1æg1çh1èh¯1éh¢1êh“1ëhµ1ìh1íhv1îh±1ïh§1ðh—1ñh°1òhƒ1óhÄ1ôh­1õh†1öh…1÷h”1øh1ùh¨1úhŸ1ûh¡1üh‚1ýk21þkº2@kë2Akì2Bl+2CmŽ2Dm¼2Emó2FmÙ2Gm²2Hmá2ImÌ2Jmä2Kmû2Lmú2Mn2NmÇ2OmË2Pm¯2QmÑ2Rm®2SmÞ2Tmù2Um¸2Vm÷2Wmõ2XmÅ2YmÒ2Zn2[mµ2\mÚ2]më2^mØ2_mê2`mñ2amî2bmè2cmÆ2dmÄ2emª2fmì2gm¿2hmæ2ipù2jq 2kq 2lpý2mpï2nr=2or}2pr2qs2rs2ss2ts2us2vs‡2wt2xt 2yt2zt2{sþ2|t 2}tà2~tö2¡t÷2¢u2£u"2¤ue2¥uf2¦ub2§up2¨u2©uÔ2ªuÕ2«uµ2¬uÊ2­uÍ2®vŽ2¯vÔ2°vÒ2±vÛ2²w72³w>2´w<2µw62¶w82·w:2¸xk2¹xC2ºxN2»ye2¼yh2½ym2¾yû2¿z’2Àz•2Á{ 2Â{(2Ã{2Ä{,2Å{&2Æ{2Ç{2È{.2É|’2Ê|—2Ë|•2Ì}F2Í}C2Î}q2Ï}.2Ð}92Ñ}<2Ò}@2Ó}02Ô}32Õ}D2Ö}/2×}B2Ø}22Ù}12Ú=2Ûž2Üš2ÝÌ2ÞÎ2ßÒ2à€2á€J2â€F2ã/2ä2å#2æ+2ç)2è02é$2ê‚2ë‚52ì‚72í‚62î‚922ðƒž2ñƒ˜2òƒx2óƒ¢2ôƒ–2õƒ½2öƒ«2÷ƒ’2øƒŠ2ùƒ“2úƒ‰2ûƒ 2üƒw2ýƒ{2þƒ|3@ƒ†3Aƒ§3B†U3C_j3D†Ç3E†À3F†¶3G†Ä3H†µ3I†Æ3J†Ë3K†±3L†¯3M†É3NˆS3Oˆž3Pˆˆ3Qˆ«3Rˆ’3Sˆ–3Tˆ3Uˆ‹3V‰“3W‰3XŠ*3YŠ3ZŠ#3[Š%3\Š13]Š-3^Š3_Š3`Š"3aŒI3bŒZ3cŒ©3dŒ¬3eŒ«3fŒ¨3gŒª3hŒ§3ig3jf3k¾3lº3mŽÛ3nŽß3o3p 3q3r3s#3t3u3v3w3x3y 3z3{"3|3}3~3¡è3¢í3£ý3¤‘W3¥‘Î3¦‘õ3§‘æ3¨‘ã3©‘ç3ª‘í3«‘é3¬•‰3­–j3®–u3¯–s3°–x3±–p3²–t3³–v3´–w3µ–l3¶–À3·–ê3¸–é3¹zà3ºzß3»˜3¼˜3½›Z3¾œå3¿žu3Àž3Áž¥3ž»3ÃP¢3ÄP3ÅP…3ÆP™3ÇP‘3ÈP€3ÉP–3ÊP˜3ËPš3Ìg3ÍQñ3ÎRr3ÏRt3ÐRu3ÑRi3ÒRÞ3ÓRÝ3ÔRÛ3ÕSZ3ÖS¥3×U{3ØU€3ÙU§3ÚU|3ÛUŠ3ÜU3ÝU˜3ÞU‚3ßUœ3àUª3áU”3âU‡3ãU‹3äUƒ3åU³3æU®3çUŸ3èU>3éU²3êUš3ëU»3ìU¬3íU±3îU~3ïU‰3ðU«3ñU™3òW 3óX/3ôX*3õX43öX$3÷X03øX13ùX!3úX3ûX 3üXù3ýXú3þY`4@Zw4AZš4BZ4CZ’4DZ›4EZ§4F[s4G[q4H[Ò4I[Ì4J[Ó4K[Ð4L\ 4M\ 4N\14O]L4P]P4Q]44R]G4S]ý4T^E4U^=4V^@4W^C4X^~4Y^Ê4Z^Á4[^Â4\^Ä4]_<4^_m4__©4`_ª4a_¨4b`Ñ4c`á4d`²4e`¶4f`à4ga4ha#4i`ú4ja4k`ð4l`û4m`ô4nah4o`ñ4pa4q`ö4ra 4sa4ta4ub4vbI4wc£4xcŒ4ycÏ4zcÀ4{cé4|cÉ4}cÆ4~cÍ4¡cÒ4¢cã4£cÐ4¤cá4¥cÖ4¦cí4§cî4¨cv4©cô4ªcê4«cÛ4¬dR4­cÚ4®cù4¯e^4°ef4±eb4²ec4³e‘4´e4µe¯4¶fn4·fp4¸ft4¹fv4ºfo4»f‘4¼fz4½f~4¾fw4¿fþ4Àfÿ4Ág4Âg4Ãhú4ÄhÕ4Åhà4ÆhØ4Çh×4Èi4Éhß4Êhõ4Ëhî4Ìhç4Íhù4ÎhÒ4Ïhò4Ðhã4ÑhË4ÒhÍ4Ói 4Ôi4Õi4ÖhÉ4×hÚ4Øin4Ùhû4Úk>4Ûk:4Ük=4Ýk˜4Þk–4ßk¼4àkï4ál.4âl/4ãl,4än/4ån84ænT4çn!4èn24éng4ênJ4ën 4ìn%4ín#4în4ïn[4ðnX4ñn$4ònV4ónn4ôn-4õn&4öno4÷n44ønM4ùn:4ún,4ûnC4ün4ýn>4þnË5@n‰5An5BnN5Cnc5DnD5Enr5Fni5Gn_5Hq5Iq5Jq&5Kq05Lq!5Mq65Nqn5Oq5PrL5Qr„5Rr€5Ss65Ts%5Us45Vs)5Wt:5Xt*5Yt35Zt"5[t%5\t55]t65^t45_t/5`t5at&5bt(5cu%5du&5euk5fuj5guâ5huÛ5iuã5juÙ5kuØ5luÞ5muà5nv{5ov|5pv–5qv“5rv´5svÜ5twO5uwí5vx]5wxl5xxo5yz 5zz5{z 5|z5}z5~z˜5¡z—5¢z–5£zå5¤zã5¥{I5¦{V5§{F5¨{P5©{R5ª{T5«{M5¬{K5­{O5®{Q5¯|Ÿ5°|¥5±}^5²}P5³}h5´}U5µ}+5¶}n5·}r5¸}a5¹}f5º}b5»}p5¼}s5½U„5¾Ô5¿Õ5À€ 5Á€R5€…5ÃU5ÄT5ÅK5ÆQ5ÇN5È95ÉF5Ê>5ËL5ÌS5Ít5΂5Ï‚5Ѓé5Ñ„5Òƒø5Ó„ 5Ôƒà5ÕƒÅ5Ö„ 5׃Á5؃ï5Ùƒñ5Úƒô5Û„W5Ü„ 5݃ð5Þ„ 5߃Ì5àƒý5áƒò5âƒÊ5ã„85ä„5å„5æƒÜ5ç„5èƒÔ5éƒß5ê†[5ë†ß5ì†Ù5í†í5î†Ô5ï†Û5ð†ä5ñ†Ð5ò†Þ5óˆW5ôˆÁ5õˆÂ5öˆ±5÷‰ƒ5ø‰–5ùŠ;5úŠ`5ûŠU5üŠ^5ýŠ<5þŠA6@ŠT6AŠ[6BŠP6CŠF6DŠ46EŠ:6FŠ66GŠV6HŒa6IŒ‚6JŒ¯6KŒ¼6LŒ³6MŒ½6NŒÁ6OŒ»6PŒÀ6QŒ´6RŒ·6SŒ¶6TŒ¿6UŒ¸6VŠ6W…6X6YÎ6ZÝ6[Ë6\Ú6]Ñ6^Ì6_Û6`Æ6aŽû6bŽø6cŽü6dœ6e.6f56g16h86i26j66k‘6lõ6m‘ 6nþ6o‘c6p‘e6q‘Ï6r’6s’6t’#6u’ 6v’6w’ 6x’6y’6z’6{•”6|•6}•‹6~•‘6¡•“6¢•’6£•Ž6¤–Š6¥–Ž6¦–‹6§–}6¨–…6©–†6ª–6«–r6¬–„6­–Á6®–Å6¯–Ä6°–Æ6±–Ç6²–ï6³–ò6´—Ì6µ˜6¶˜6·˜6¸˜ç6¹˜ê6º˜ï6»˜é6¼˜ò6½˜í6¾™®6¿™­6ÀžÃ6ÁžÍ6žÑ6ÃN‚6ÄP­6ÅPµ6ÆP²6ÇP³6ÈPÅ6ÉP¾6ÊP¬6ËP·6ÌP»6ÍP¯6ÎPÇ6ÏR6ÐRw6ÑR}6ÒRß6ÓRæ6ÔRä6ÕRâ6ÖRã6×S/6ØUß6ÙUè6ÚUÓ6ÛUæ6ÜUÎ6ÝUÜ6ÞUÇ6ßUÑ6àUã6áUä6âUï6ãUÚ6äUá6åUÅ6æUÆ6çUå6èUÉ6éW6êW6ëX^6ìXQ6íXX6îXW6ïXZ6ðXT6ñXk6òXL6óXm6ôXJ6õXb6öXR6÷XK6øYg6ùZÁ6úZÉ6ûZÌ6üZ¾6ýZ½6þZ¼7@Z³7AZÂ7BZ²7C]i7D]o7E^L7F^y7G^É7H^È7I_7J_Y7K_¬7L_®7Ma7Na7OaH7Pa7Q`ó7Ra7S`ù7Ta7Ua7VaN7WaL7XaD7YaM7Za>7[a47\a'7]a 7^a7_a77`b!7ab"7bd7cd>7dd7ed*7fd-7gd=7hd,7id7jd7kd7ld 7md67nd7od7pd7qel7reŸ7se°7tf—7uf‰7vf‡7wfˆ7xf–7yf„7zf˜7{f7|g7}i”7~im7¡iZ7¢iw7£i`7¤iT7¥iu7¦i07§i‚7¨iJ7©ih7ªik7«i^7¬iS7­iy7®i†7¯i]7°ic7±i[7²kG7³kr7´kÀ7µk¿7¶kÓ7·ký7¸n¢7¹n¯7ºnÓ7»n¶7¼nÂ7½n7¾n7¿nÇ7ÀnÅ7Án¥7Ân˜7Ãn¼7Änº7Ån«7ÆnÑ7Çn–7Ènœ7ÉnÄ7ÊnÔ7Ënª7Ìn§7Ín´7ÎqN7ÏqY7Ðqi7Ñqd7ÒqI7Óqg7Ôq\7Õql7Öqf7×qL7Øqe7Ùq^7ÚqF7Ûqh7ÜqV7Ýr:7ÞrR7ßs77àsE7ás?7âs>7ãto7ätZ7åtU7æt_7çt^7ètA7ét?7êtY7ët[7ìt\7íuv7îux7ïv7ðuð7ñv7òuò7óuñ7ôuú7õuÿ7öuô7÷uó7øvÞ7ùvß7úw[7ûwk7üwf7ýw^7þwc8@wy8Awj8Bwl8Cw\8Dwe8Ewh8Fwb8Gwî8HxŽ8Ix°8Jx—8Kx˜8LxŒ8Mx‰8Nx|8Ox‘8Px“8Qx8Ryz8Sy8Ty8U„,8Vy½8Wz8Xz8Yz 8Zz8[z8\z8]zŸ8^z 8_{w8`{À8a{`8b{n8c{g8d|±8e|³8f|µ8g}“8h}y8i}‘8j}8k}8l}[8mn8ni8oj8pr8q©8r¨8s¤8t€V8u€X8v€†8w€„8xq8yp8zx8{e8|n8}s8~k8¡y8¢z8£f8¤‚8¥‚G8¦„‚8§„w8¨„=8©„18ª„u8«„f8¬„k8­„I8®„l8¯„[8°„<8±„58²„a8³„c8´„i8µ„m8¶„F8·†^8¸†\8¹†_8º†ù8»‡8¼‡8½‡8¾‡8¿†þ8À†û8Á‡8‡8Ç8ć 8ňY8ƈß8LjÔ8ȈÙ8ɈÜ8ʈØ8ˈÝ8̈á8͈Ê8ΈÕ8ψÒ8Љœ8щã8ÒŠk8ÓŠr8ÔŠs8ÕŠf8ÖŠi8׊p8ØŠ‡8ÙŠ|8ÚŠc8ÛŠ 8ÜŠq8ÝŠ…8ÞŠm8ߊb8àŠn8áŠl8âŠy8ãŠ{8äŠ>8åŠh8æŒb8猊8茉8éŒÊ8êŒÇ8ëŒÈ8ìŒÄ8팲8îŒÃ8ïŒÂ8ðŒÅ8ñá8òß8óè8ôï8õó8öú8÷ê8øä8ùæ8ú޲8û8ü 8ýŽþ8þ 9@Ÿ9A²9BK9CJ9DS9EB9FT9G<9HU9IP9JG9KO9LN9MM9NQ9O>9PA9Q‘9R‘9S‘l9T‘j9U‘i9V‘É9W’79X’W9Y’89Z’=9[’@9\’>9]’[9^’K9_’d9`’Q9a’49b’I9c’M9d’E9e’99f’?9g’Z9h•˜9i–˜9j–”9k–•9l–Í9m–Ë9n–É9o–Ê9p–÷9q–û9r–ù9s–ö9t—V9u—t9v—v9w˜9x˜9y˜9z˜ 9{˜9|˜ 9}˜ü9~˜ô9¡˜ý9¢˜þ9£™³9¤™±9¥™´9¦šá9§œé9¨ž‚9©Ÿ9ªŸ9«Ÿ 9¬Pç9­Pî9®På9¯PÖ9°Pí9±PÚ9²PÕ9³PÏ9´PÑ9µPñ9¶PÎ9·Pé9¸Qb9¹Qó9ºRƒ9»R‚9¼S19½S­9¾Uþ9¿V9ÀV9ÁV9ÂUý9ÃV9ÄV9ÅV 9ÆV 9ÇV9ÈU÷9ÉV9ÊV9ËV9ÌV9ÍUö9ÎW9ÏW9ÐXu9ÑX~9ÒXƒ9ÓX“9ÔXŠ9ÕXy9ÖX…9×X}9ØXý9ÙY%9ÚY"9ÛY$9ÜYj9ÝYi9ÞZá9ßZæ9àZé9áZ×9âZÖ9ãZØ9äZã9å[u9æ[Þ9ç[ç9è[á9é[å9ê[æ9ë[è9ì[â9í[ä9î[ß9ï\ 9ð\b9ñ]„9ò]‡9ó^[9ô^c9õ^U9ö^W9÷^T9ø^Ó9ù^Ö9ú_ 9û_F9ü_p9ý_¹9þaG:@a?:AaK:Baw:Cab:Dac:Ea_:FaZ:GaX:Hau:Ib*:Jd‡:KdX:LdT:Md¤:Ndx:Od_:Pdz:QdQ:Rdg:Sd4:Tdm:Ud{:Ver:We¡:Xe×:YeÖ:Zf¢:[f¨:\f:]iœ:^i¨:_i•:`iÁ:ai®:biÓ:ciË:di›:ei·:fi»:gi«:hi´:iiÐ:jiÍ:ki­:liÌ:mi¦:niÃ:oi£:pkI:qkL:rl3:so3:to:unþ:vo:wnô:xo):yo>:zo :{o,:|o:}o:~o":¡nÿ:¢nï:£o:¤o1:¥o8:¦o2:§o#:¨o:©o+:ªo/:«oˆ:¬o*:­nì:®o:¯nò:°nÌ:±n÷:²q”:³q™:´q}:µqŠ:¶q„:·q’:¸r>:¹r’:ºr–:»sD:¼sP:½td:¾tc:¿tj:Àtp:Átm:Âu:Ãu‘:Äv':Åv :Æv :Çv :Èv:Évá:Êvã:Ëw„:Ìw}:Íw:Îwa:ÏxÁ:ÐxŸ:Ñx§:Òx³:Óx©:Ôx£:ÕyŽ:Öy:×y:Øz.:Ùz1:Úzª:Ûz©:Üzí:Ýzï:Þ{¡:ß{•:à{‹:á{u:â{—:ã{:ä{”:å{:æ{¸:ç{‡:è{„:é|¹:ê|½:ë|¾:ì}»:í}°:î}œ:ï}½:ð}¾:ñ} :ò}Ê:ó}´:ô}²:õ}±:ö}º:÷}¢:ø}¿:ù}µ:ú}¸:û}­:ü}Ò:ý}Ç:þ}¬;@p;Aà;Bá;Cß;D€^;E€Z;F€‡;GP;H€;I;Jˆ;KŠ;L;M‚;Nç;Oú;P‚;Q‚;R‚;S‚K;T„É;U„¿;V„Æ;W„Ä;X„™;Y„ž;Z„²;[„œ;\„Ë;]„¸;^„À;_„Ó;`„;a„¼;b„Ñ;c„Ê;d‡?;e‡;f‡;;g‡";h‡%;i‡4;j‡;k‡U;l‡7;m‡);nˆó;o‰;pˆô;qˆù;rˆø;sˆý;tˆè;u‰;vˆï;wЦ;xŠŒ;yŠž;zŠ£;{Š;|Š¡;}Š“;~Ф;¡Šª;¢Š¥;£Š¨;¤Š˜;¥Š‘;¦Šš;§Š§;¨Œj;©Œ;ªŒŒ;«ŒÓ;¬ŒÑ;­ŒÒ;®k;¯™;°•;±ü;²;³;´;µ;¶£;·`;¸X;¹\;ºc;»Y;¼^;½b;¾];¿[;À‘;Á‘;‘;Ñu;Ä‘x;Å‘w;Æ‘t;Ç’x;È’€;É’…;Ê’˜;Ë’–;Ì’{;Í’“;Î’œ;Ï’¨;Ð’|;Ñ’‘;Ò•¡;Ó•¨;Ô•©;Õ•£;Ö•¥;ו¤;Ø–™;Ù–œ;Ú–›;Û–Ì;Ü–Ò;Ý—;Þ—|;ß—…;à—ö;á˜;â˜;㘯;䘱;å™;æ™;ç™ ;è™ ;é™Á;ꚯ;ëš°;ìšæ;í›A;î›B;ïœô;ðœö;ñœó;òž¼;óŸ;;ôŸJ;õQ;öQ;÷Pû;øPõ;ùPù;úQ;ûQ;üQ ;ýQ;þQÜ<@R‡@%>Ai>Bn>Ch>Dm>Ew>F‘0>G‘->H‘'>I‘1>J‘‡>K‘‰>L‘‹>M‘ƒ>N’Å>O’»>P’·>Q’ê>R’¬>S’ä>T’Á>U’³>V’¼>W’Ò>X’Ç>Y’ð>Z’²>[•­>\•±>]—>^—>_—>`— >a—`>b—>c—‹>d—>e˜!>f˜+>g˜>h˜³>i™ >j™>k™>l™>m™Ý>n™Ð>o™ß>p™Û>q™Ñ>r™Õ>s™Ò>t™Ù>uš·>všî>wšï>x›'>y›E>z›D>{›w>|›o>}>~ >¡>¢ž©>£ž¾>¤žÎ>¥X¨>¦ŸR>§Q>¨Q>©Q>ªQ>«Q>¬Q€>­Qª>®QÝ>¯R‘>°R“>±Ró>²VY>³Vk>´Vy>µVi>¶Vd>·Vx>¸Vj>¹Vh>ºVe>»Vq>¼Vo>½Vl>¾Vb>¿Vv>ÀXÁ>ÁX¾>ÂXÇ>ÃXÅ>ÄYn>Å[>Æ[4>Ç[x>È[ð>É\>Ê_J>Ëa²>Ìa‘>Ía©>ÎaŠ>ÏaÍ>Ða¶>Ña¾>ÒaÊ>ÓaÈ>Ôb0>ÕdÅ>ÖdÁ>×dË>Ød»>Ùd¼>ÚdÚ>ÛdÄ>ÜdÇ>ÝdÂ>ÞdÍ>ßd¿>àdÒ>ádÔ>âd¾>ãet>äfÆ>åfÉ>æf¹>çfÄ>èfÇ>éf¸>êj=>ëj8>ìj:>íjY>îjk>ïjX>ðj9>ñjD>òjb>ója>ôjK>õjG>öj5>÷j_>øjH>ùkY>úkw>ûl>üoÂ>ýo±>þo¡?@oÃ?Ao¤?BoÁ?Co§?Do³?EoÀ?Fo¹?Go¶?Ho¦?Io ?Jo´?Kq¾?LqÉ?MqÐ?NqÒ?OqÈ?PqÕ?Qq¹?RqÎ?SqÙ?TqÜ?UqÃ?VqÄ?Wsh?Xtœ?Yt£?Zt˜?[tŸ?\tž?]tâ?^u ?_u ?`v4?av8?bv:?cvç?dvå?ew ?fwž?gwŸ?hw¥?ixè?jxÚ?kxì?lxç?my¦?nzM?ozN?pzF?qzL?rzK?szº?t{Ù?u|?v{É?w{ä?x{Û?y{á?z{é?{{æ?||Õ?}|Ö?~~ ?¡~?¢~?£~?¤~#?¥~?¦~?§~ ?¨~?©y?ª²?«ð?¬ñ?­î?®€(?¯³?°©?±¨?²û?³‚?´‚X?µ‚Y?¶…J?·…Y?¸…H?¹…h?º…i?»…C?¼…I?½…m?¾…j?¿…^?À‡ƒ?Á‡Ÿ?‡ž?Ç¢?ć?ňa?Ɖ*?lj2?ȉ%?ɉ+?ʉ!?ˉª?̉¦?ÍŠæ?Ίú?ÏŠë?Њñ?Ñ‹?ÒŠÜ?ÓŠç?ÔŠî?ÕŠþ?Ö‹?׋?ØŠ÷?ÙŠí?ÚŠó?ÛŠö?ÜŠü?ÝŒk?ÞŒm?ߌ“?àŒô?áŽD?âŽ1?ãŽ4?äŽB?åŽ9?æŽ5?ç;?è/?é8?ê3?ë¨?ì¦?íu?ît?ïx?ðr?ñ|?òz?ó‘4?ô‘’?õ“ ?ö“6?÷’ø?ø“3?ù“/?ú“"?û’ü?ü“+?ý“?þ“@@“@A“&@B“!@C“@D“.@E“@F•»@G–§@H–¨@I–ª@J–Õ@K—@L—@M—@N— @O—@P—@Q—[@R—\@S—f@T—˜@U˜0@V˜8@W˜;@X˜7@Y˜-@Z˜9@[˜$@\™@]™(@^™@_™@`™!@a™@b™í@c™â@d™ñ@eš¸@fš¼@gšû@hší@i›(@j›‘@k@l#@m&@n(@o@p@qžØ@ržÔ@sŸ@tŸœ@uQ*@vQ@wQ!@xQ2@yRõ@zVŽ@{V€@|V@}V…@~V‡@¡V@¢XÕ@£XÓ@¤XÑ@¥XÎ@¦[0@§[*@¨[$@©[z@ª\7@«\h@¬]¼@­]º@®]½@¯]¸@°^k@±_L@²_½@³aÉ@´aÂ@µaÇ@¶aæ@·aË@¸b2@¹b4@ºdÎ@»dÊ@¼dØ@½dà@¾dð@¿dæ@Àdì@Ádñ@Âdâ@Ãdí@Äe‚@Åeƒ@ÆfÙ@ÇfÖ@Èj€@Éj”@Êj„@Ëj¢@Ìjœ@ÍjÛ@Îj£@Ïj~@Ðj—@Ñj@Òj @Ók\@Ôk®@ÕkÚ@Öl@×oØ@Øoñ@Ùoß@Úoà@ÛoÛ@Üoä@Ýoë@Þoï@ßo€@àoì@áoá@âoé@ãoÕ@äoî@åoð@æqç@çqß@èqî@éqæ@êqå@ëqí@ìqì@íqô@îqà@ïr5@ðrF@ñsp@òsr@ót©@ôt°@õt¦@öt¨@÷vF@øvB@ùvL@úvê@ûw³@üwª@ýw°@þw¬A@w§AAw­ABwïACx÷ADxúAExôAFxïAGyAHy§AIyªAJzWAKz¿AL|AM| AN{þAO{÷AP| AQ{àAR|àAS|ÜAT|ÞAU|âAV|ßAW|ÙAX|ÝAY~.AZ~>A[~FA\~7A]~2A^~CA_~+A`~=Aa~1Ab~EAc~AAd~4Ae~9Af~HAg~5Ah~?Ai~/AjDAkóAlüAm€qAn€rAo€pAp€oAq€sArÆAsÃAtºAuÂAvÀAw¿Ax½AyÉAz¾A{èA|‚ A}‚qA~…ªA¡…„A¢…~A£…œA¤…‘A¥…”A¦…¯A§…›A¨…‡A©…¨Aª…ŠA«†gA¬‡ÀA­‡ÑA®‡³A¯‡ÒA°‡ÆA±‡«A²‡»A³‡ºA´‡ÈAµ‡ËA¶‰;A·‰6A¸‰DA¹‰8Aº‰=A»‰¬A¼‹A½‹A¾‹A¿‹AÀ‹ AÁ‹ A‹AËAÄ‹AÅŒAAÆŒ?AÇŒsAÈŒúAÉŒýAÊŒüAËŒøAÌŒûAͨAÎŽIAÏŽKAÐŽHAÑŽJAÒDAÓ>AÔBAÕEAÖ?A×AØ}AÙ„AÚAÛ‚AÜ€AÝ‘9AÞ‘£Aß‘žAà‘œAá“MAâ“‚Aã“(Aä“uAå“JAæ“eAç“KAè“Aé“~Aê“lAë“[Aì“pAí“ZAî“TAï•ÊAð•ËAñ•ÌAò•ÈAó•ÆAô–±Aõ–¸Aö–ÖA÷—Aø—Aù— Aú—ÓAû˜FAü˜¶Aý™5AþšB@™ÿBA›®BB›«BC›ªBD›­BE;BF?BGž‹BHžÏBIžÞBJžÜBKžÝBLžÛBMŸ>BNŸKBOSâBPV•BQV®BRXÙBSXØBT[8BU_]BVaãBWb3BXdôBYdòBZdþB[eB\dúB]dûB^d÷B_e·B`fÜBag&Bbj³Bcj¬BdjÃBej»Bfj¸BgjÂBhj®Bij¯Bjk_BkkxBlk¯Bmp Bnp BooþBppBqoúBrpBspBtqûBuqüBvqþBwqøBxswBysuBzt§B{t¿B|uB}vVB~vXB¡vRB¢w½B£w¿B¤w»B¥w¼B¦yB§y®B¨zaB©zbBªz`B«zÄB¬zÅB­|+B®|'B¯|*B°|B±|#B²|!B³|çB´~TBµ~UB¶~^B·~ZB¸~aB¹~RBº~YB»HB¼ùB½ûB¾€wB¿€vBÀÍBÁÏB‚ BÃ…ÏBÄ…©BÅ…ÍBÆ…ÐBÇ…ÉBÈ…°BÉ…ºBÊ…¹BË…¦ḂïB͇ìB·òBχàBЉ†Bщ²BÒ‰ôBÓ‹(BÔ‹9BÕ‹,BÖ‹+B׌PBØBÙŽYBÚŽcBÛŽfBÜŽdBÝŽ_BÞŽUBߎÀBàIBáMBâ‡BãƒBäˆBå‘«B摬Bç‘ÐBè“”B铊Bê“–Bë“¢B쓳Bí“®BBï“°Bð“˜Bñ“šBò“—Bó•ÔBô•ÖBõ•ÐBö•ÕB÷–âBø–ÜBù–ÙBú–ÛBû–ÞBü—$Bý—£Bþ—¦C@—­CA—ùCB˜MCC˜OCD˜LCE˜NCF˜SCG˜ºCH™>CI™?CJ™=CK™.CL™¥CMšCNšÁCO›CP›CQ›OCR›NCS›MCT›ÊCU›ÉCV›ýCW›ÈCX›ÀCYQCZ]C[`C\žàC]ŸC^Ÿ,C_Q3C`V¥CaXÞCbXßCcXâCd[õCeŸCf^ìCgaòCha÷CiaöCjaõCkeCleCmfàCnfÝCojåCpjÝCqjÚCrjÓCspCtpCup(CvpCwpCxpCypCzrC{r C|rXC}r¢C~sxC¡szC¢t½C£tÊC¤tãC¥u‡C¦u†C§v_C¨vaC©wÇCªyC«y±C¬zkC­ziC®|>C¯|?C°|8C±|=C²|7C³|@C´~kCµ~mC¶~yC·~iC¸~jC¹…Cº~sC»¶C¼¹C½¸C¾ØC¿…éCÀ…ÝCÁ…êCÂ…ÕCÃ…äCÄ…åCÅ…÷CƇûCLjCȈ CɇùCʇþCˉ`C̉_C͉VCΉ^CÏ‹ACЋ\CÑ‹XCÒ‹ICÓ‹ZCÔ‹NCÕ‹OCÖ‹FC׋YCØCÙ CÚŽ|CÛŽrCÜŽ‡CÝŽvCÞŽlCߎzCàŽtCáTCâNCã­CäŠCå‹C摱Cç‘®Cè“áCé“ÑCê“ßCë“ÃCì“ÈCí“ÜCî“ÝCï“ÖCð“âCñ“ÍCò“ØCó“äCô“×Cõ“èCö•ÜC÷–´Cø–ãCù—*Cú—'Cû—aCü—ÜCý—ûCþ˜^D@˜XDA˜[DB˜¼DC™EDD™IDEšDFšDG› DH›èDI›çDJ›ÖDK›ÛDL‰DMaDNrDOjDPlDQž’DRž—DSž“DTž´DURøDVV¨DWV·DXV¶DYV´DZV¼D[XäD\[@D][CD^[}D_[öD`]ÉDaaøDbaúDceDdeDeeDffæDgg'DhjìDip>Djp0Dkp2DlrDms{DntÏDovbDpveDqy&Dry*Dsy,Dty+DuzÇDvzöDw|LDx|CDy|MDz|ïD{|ðD|®D}~}D~~|D¡~‚D¢LD£€D¤ÚD¥‚fD¦…ûD§…ùD¨†D©…úDª†D«† D¬†D­† D®ˆD¯ˆD°‰dD±‰ºD²‰øD³‹pD´‹lDµ‹fD¶‹oD·‹_D¸‹kD¹Dº D»Ž‰D¼ŽD½Ž…D¾Ž‚D¿‘´DÀ‘ËDÁ”D”DÓýDÄ•áDÅ—0DƘÄDÇ™RDÈ™QDÉ™¨DÊš+DËš0DÌš7DÍš5DΜDÏœ DОyDÑžµDÒžèDÓŸ/DÔŸ_DÕŸcDÖŸaD×Q7DØQ8DÙVÁDÚVÀDÛVÂDÜYDÝ\lDÞ]ÍDßaüDàaþDáeDâeDãe•DäféDåjûDækDçjúDèk²DépLDêrDër§DìtÖDítÔDîviDïwÓDð|PDñ~Dò~ŒDó¼Dô†Dõ†-Dö†D÷ˆ#Døˆ"Dùˆ!DúˆDû‰jDü‰lDý‰½Dþ‹tE@‹wEA‹}EBECŽŠEDŽEEŽ‹EF_EG¯EH‘ºEI”.EJ”3EK”5EL”:EM”8EN”2EO”+EP•âEQ—8ER—9ES—2ET—ÿEU˜gEV˜eEW™WEXšEEYšCEZš@E[š>E\šÏE]›TE^›QE_œ-E`œ%Ea¯Eb´EcÂEd¸EežEfžïEgŸEhŸ\EiŸfEjŸgEkQE¶—ÃE·—ÁE¸˜kE¹™UEºšUE»šME¼šÒE½›E¾œIE¿œ1EÀœ>EÁœ;EÂÓEÃ×EÄŸ4EÅŸlEÆŸjEÇŸ”EÈVÌEÉ]ÖEÊbEËe#EÌe+EÍe*EÎfìEÏkEÐtÚEÑzÊEÒ|dEÓ|cEÔ|eEÕ~“EÖ~–E×~”EØâEÙ†8EÚ†?EÛˆ1EÜ‹ŠEÝEÞEß”cEà”`Eá”dEâ—hEã˜oEä™\EåšZEæš[EçšWEèšÓEéšÔEêšÑEëœTEìœWEíœVEîåEEðžôEñVÑEòXéEóe,Eôp^EõvqEövrE÷w×EøPEùˆEúˆ6Eûˆ9EüˆbEý‹“Eþ‹’F@‹–FA‚wFBFC‘ÀFD”jFE—BFF—HFG—DFH—ÆFI˜pFJš_FK›"FL›XFMœ_FNùFOúFPž|FQž}FRŸFSŸwFTŸrFU^óFVkFWpcFX|lFY|nFZˆ;F[‰ÀF\Ž¡F]‘ÁF^”rF_”pF`˜qFa™^FbšÖFc›#FdžÌFepdFfwÚFg‹šFh”wFi—ÉFjšbFkšeFl~œFm‹œFnŽªFo‘ÅFp”}Fq”~Fr”|FsœwFtœxFuž÷FvŒTFw”FxžFyr(FzšjF{›1F|žF}žF~|rF¡0þF¢0F£0žF¤0F¥0AF¦0BF§0CF¨0DF©0EFª0FF«0GF¬0HF­0IF®0JF¯0KF°0LF±0MF²0NF³0OF´0PFµ0QF¶0RF·0SF¸0TF¹0UFº0VF»0WF¼0XF½0YF¾0ZF¿0[FÀ0\FÁ0]FÂ0^FÃ0_FÄ0`FÅ0aFÆ0bFÇ0cFÈ0dFÉ0eFÊ0fFË0gFÌ0hFÍ0iFÎ0jFÏ0kFÐ0lFÑ0mFÒ0nFÓ0oFÔ0pFÕ0qFÖ0rF×0sFØ0tFÙ0uFÚ0vFÛ0wFÜ0xFÝ0yFÞ0zFß0{Fà0|Fá0}Fâ0~Fã0Fä0€Få0Fæ0‚Fç0ƒFè0„Fé0…Fê0†Fë0‡Fì0ˆFí0‰Fî0ŠFï0‹Fð0ŒFñ0Fò0ŽFó0Fô0Fõ0‘Fö0’F÷0“Fø0¡Fù0¢Fú0£Fû0¤Fü0¥Fý0¦Fþ0§G@0¨GA0©GB0ªGC0«GD0¬GE0­GF0®GG0¯GH0°GI0±GJ0²GK0³GL0´GM0µGN0¶GO0·GP0¸GQ0¹GR0ºGS0»GT0¼GU0½GV0¾GW0¿GX0ÀGY0ÁGZ0ÂG[0ÃG\0ÄG]0ÅG^0ÆG_0ÇG`0ÈGa0ÉGb0ÊGc0ËGd0ÌGe0ÍGf0ÎGg0ÏGh0ÐGi0ÑGj0ÒGk0ÓGl0ÔGm0ÕGn0ÖGo0×Gp0ØGq0ÙGr0ÚGs0ÛGt0ÜGu0ÝGv0ÞGw0ßGx0àGy0áGz0âG{0ãG|0äG}0åG~0æG¡0çG¢0èG£0éG¤0êG¥0ëG¦0ìG§0íG¨0îG©0ïGª0ðG«0ñG¬0òG­0óG®0ôG¯0õG°0öG±G²G³G´GµG¶G·G¸G¹GºG»#G¼$G½%G¾&G¿'GÀ(GÁ)GÂ*GÃ+GÄ,GÅ-GÆ.GÇ/GÈ0GÉ1GÊ2GË3GÌ4GÍ5GÎQGÏ6GÐ7GÑ8GÒ9GÓ:GÔ;GÕGØ?GÙ@GÚAGÛBGÜCGÝDGÞEGßFGàGGáHGâIGãJGäKGåLGæMGçNGèOGé$`Gê$aGë$bGì$cGí$dGî$eGï$fGð$gGñ$hGò$iGó$tGô$uGõ$vGö$wG÷$xGø$yGù$zGú${Gû$|Gü$}I@NBIAN\IBQõICSIDS‚IENIFN IGNGIHNIIV×IJú IK\nIL_sIMNINQ‡IONIPN.IQN“IRNÂISNÉITNÈIUQ˜IVRüIWSlIXS¹IYW IZYI[Y,I\\I]]ÿI^eáI_k³I`kÌIalIbr?IcN1IdNIðg9Iñg8Iòg;Ióg:Iôg?IõgJaOgJbORJcO_JdOAJeOXJfO-JgO3JhO?JiOaJjQJkQ¹JlRJmRJnR!JoR­JpR®JqS JrScJsSrJtSŽJuSJvT0JwT7JxT*JyTTJzTEJ{TJ|TJ}T%J~TJ¡T=J¢TOJ£TAJ¤T(J¥T$J¦TGJ§VîJ¨VçJ©VåJªWAJ«WEJ¬WLJ­WIJ®WKJ¯WRJ°YJ±Y@J²Y¦J³Y˜J´Y JµY—J¶YŽJ·Y¢J¸YJ¹YJºY§J»Y¡J¼[ŽJ½[’J¾\(J¿\*JÀ\JÁ\JÂ\ˆJÃ\‹JÄ\‰JÅ\’JÆ\ŠJÇ\†JÈ\“JÉ\•JÊ]àJË^ JÌ^JÍ^‹JÎ^‰JÏ^ŒJÐ^ˆJÑ^JÒ_JÓ_JÔ_xJÕ_vJÖ_ÒJ×_ÑJØ_ÐJÙ_íJÚ_èJÛ_îJÜ_óJÝ_áJÞ_äJß_ãJà_úJá_ïJâ_÷Jã_ûJä`Jå_ôJæb:JçbƒJèbŒJébŽJêbJëb”Jìb‡JíbqJîb{JïbzJðbpJñbJòbˆJóbwJôb}JõbrJöbtJ÷e7JøeðJùeôJúeóJûeòJüeõJýgEJþgGK@gYKAgUKBgLKCgHKDg]KEgMKFgZKGgKKHkÐKIlKJlKKlxKLlgKMlkKNl„KOl‹KPlKQlqKRloKSliKTlšKUlmKVl‡KWl•KXlœKYlfKZlsK[leK\l{K]lŽK^ptK_pzK`rcKar¿Kbr½KcrÃKdrÆKerÁKfrºKgrÅKhs•Kis—Kjs“Kks”Kls’Kmu:Knu9Kou”Kpu•KqvKry=Ks€4Kt€•Ku€™Kv€Kw€’Kx€œKy‚Kz‚K{‚…K|‚ŽK}‚‘K~‚“K¡‚ŠK¢‚ƒK£‚„K¤ŒxK¥ÉK¦¿K§ŸK¨¡K©¥KªžK«§K¬ K­–0K®–(K¯–/K°–-K±N3K²O˜K³O|K´O…KµO}K¶O€K·O‡K¸OvK¹OtKºO‰K»O„K¼OwK½OLK¾O—K¿OjKÀOšKÁOyKÂOKÃOxKÄOKÅOœKÆO”KÇOžKÈO’KÉO‚KÊO•KËOkKÌOnKÍQžKÎQ¼KÏQ¾KÐR5KÑR2KÒR3KÓRFKÔR1KÕR¼KÖS K×S KØSMsuŒMtu˜Muv¯MvvóMwvñMxvðMyvõMzwøM{wüM|wùM}wûM~wúM¡w÷M¢yBM£y?M¤yÅM¥zxM¦z{M§zûM¨|uM©|ýMª€5M«€M¬€®M­€£M®€¸M¯€µM°€­M±‚ M²‚ M³‚ÀM´‚«Mµ‚šM¶‚˜M·‚›M¸‚µM¹‚§Mº‚®M»‚¼M¼‚žM½‚ºM¾‚´M¿‚¨MÀ‚¡MÁ‚©M‚ÂM¤MÄ‚ÃMÅ‚¶MÆ‚¢MdžpMȆoMɆmMʆnMËŒVMÌÒMÍËMÎÓMÏÍMÐÖMÑÕMÒ×MÓ²MÔ´MÕ¯MÖ³M×°MØ–9MÙ–=MÚ–Sh€9Si€úSj€òSk€ùSl€õSmSn€ûSoSp‚Sq‚/Sr‚%Ssƒ3Stƒ-SuƒDSvƒSwƒQSxƒ%SyƒVSzƒ?S{ƒAS|ƒ&S}ƒS~ƒ"S¡ƒBS¢ƒNS£ƒS¤ƒ*S¥ƒS¦ƒTåZMTæZ9TçZLTèZpTéZiTêZGTëZQTìZVTíZBTîZ\Tï[rTð[nTñ[ÁTò[ÀTó\YTô]Tõ] Tö]T÷]Tø] Tù] Tú](Tû] Tü]&Tý]%Tþ]U@]0UA]UB]#UC]UD].UE^>UF^4UG^±UH^´UI^¹UJ^²UK^³UL_6UM_8UN_›UO_–UP_ŸUQ`ŠUR`US`†UT`¾UU`°UV`ºUW`ÓUX`ÔUY`ÏUZ`äU[`ÙU\`ÝU]`ÈU^`±U_`ÛU``·Ua`ÊUb`¿Uc`ÃUd`ÍUe`ÀUfc2UgceUhcŠUic‚Ujc}Ukc½UlcžUmc­UncUoc—Upc«UqcŽUrcoUsc‡UtcUucnUvc¯UwcuUxcœUycmUzc®U{c|U|c¤U}c;U~cŸU¡cxU¢c…U£cU¤c‘U¥cU¦cpU§eSU¨eÍU©feUªfaU«f[U¬fYU­f\U®fbU¯gU°hyU±h‡U²hU³hœU´hmUµhnU¶h®U·h«U¸iVU¹hoUºh£U»h¬U¼h©U½huU¾htU¿h²UÀhUÁhwUÂh’UÃh|UÄhkUÅhrUÆhªUÇh€UÈhqUÉh~UÊh›UËh–UÌh‹UÍh UÎh‰UÏh¤UÐhxUÑh{UÒh‘UÓhŒUÔhŠUÕh}UÖk6U×k3UØk7UÙk8UÚk‘UÛkUÜkUÝkŽUÞkŒUßl*UàmÀUám«Uâm´Uãm³UäntUåm¬UæméUçmâUèm·UémöUêmÔUënUìmÈUímàUîmßUïmÖUðm¾UñmåUòmÜUómÝUômÛUõmôUömÊU÷m½UømíUùmðUúmºUûmÕUümÂUýmÏUþmÉV@mÐVAmòVBmÓVCmýVDm×VEmÍVFmãVGm»VHpúVIq VJp÷VKqVLpôVMq VNpðVOqVPpóVQqVRpüVSpÿVTqVUqVVqVWpøVXpöVYq VZqV[qV\r~V]r{V^r|V_rV`sVasVbsVcsVdsVes VfsVgrÿVhsVisVjsˆVksöVlsøVmsõVntVotVpsýVqtVrtVssúVtsüVusÿVvt Vwt VxsôVytVzudV{ucV|uÎV}uÒV~uÏV¡uËV¢uÌV£uÑV¤uÐV¥vV¦v‰V§vÓV¨w9V©w/Vªw-V«w1V¬w2V­w4V®w3V¯w=V°w%V±w;V²w5V³xHV´xRVµxIV¶xMV·xJV¸xLV¹x&VºxEV»xPV¼ydV½ygV¾yiV¿yjVÀycVÁykVÂyaVÃy»VÄyúVÅyøVÆyöVÇy÷VÈzVÉz”VÊzVË{5VÌ{GVÍ{4VÎ{%VÏ{0VÐ{"VÑ{$VÒ{3VÓ{VÔ{*VÕ{VÖ{1V×{+VØ{-VÙ{/VÚ{2VÛ{8VÜ{VÝ{#VÞ|”Vß|˜Và|–Vá|£Vâ}5Vã}=Vä}8Vå}6Væ}:Vç}EVè},Vé})Vê}AVë}GVì}>Ví}?Vî}JVï};Vð}(VñcVò•VóœVôVõ›VöÊV÷ËVøÍVùÐVúÑVûÇVüÏVýÉVþ€W@€WA€WB€GWC€CWD€HWEWF%WGWHWI-WJWK,WLWM!WNWO'WPWQ"WR‚WS‚8WT‚3WU‚:WV‚4WW‚2WX‚tWYƒWZƒ£W[ƒ¨W\ƒW]ƒzW^ƒsW_ƒ¤W`ƒtWaƒWbƒWcƒ•Wdƒ™WeƒuWfƒ”Wgƒ©Whƒ}WiƒƒWjƒŒWkƒWlƒ›WmƒªWnƒ‹Woƒ~Wpƒ¥Wqƒ¯WrƒˆWsƒ—Wtƒ°WuƒWvƒ¦Wwƒ‡Wxƒ®WyƒvWzƒšW{†YW|†VW}†¿W~†·W¡†ÂW¢†ÁW£†ÅW¤†ºW¥†°W¦†ÈW§†¹W¨†³W©†¸Wª†ÌW«†´W¬†»W­†¼W®†ÃW¯†½W°†¾W±ˆRW²ˆ‰W³ˆ•W´ˆ¨Wµˆ¢W¶ˆªW·ˆšW¸ˆ‘W¹ˆ¡WºˆŸW»ˆ˜W¼ˆ§W½ˆ™W¾ˆ›W¿ˆ—WÀˆ¤WÁˆ¬WˆŒWÈ“WĈŽWʼn‚WƉÖWljÙWȉÕWÉŠ0WÊŠ'WËŠ,WÌŠWÍŒ9WÎŒ;WÏŒ\WÐŒ]WÑŒ}WÒŒ¥WÓ}WÔ{WÕyWÖ¼W×ÂWعWÙ¿WÚÁWÛŽØWÜŽÞWÝŽÝWÞŽÜWߎ×WàŽàWáŽáWâ$Wã WäWåWæ Wç!WèïWéêWêðWëôWìòWíóWîÔWïëWðìWñéWò‘VWó‘XWô‘ZWõ‘SWö‘UW÷‘ìWø‘ôWù‘ñWú‘óWû‘øWü‘äWý‘ùWþ‘êX@‘ëXA‘÷XB‘èXC‘îXD•zXE•†XF•ˆXG–|XH–mXI–kXJ–qXK–oXL–¿XM—jXN˜XO˜åXP™—XQP›XRP•XSP”XTPžXUP‹XVP£XWPƒXXPŒXYPŽXZPX[PhX\PœX]P’X^P‚X_P‡X`Q_XaQÔXbSXcSXdS¤XeS§XfU‘XgU¨XhU¥XiU­XjUwXkVEXlU¢XmU“XnUˆXoUXpUµXqUXrU£XsU’XtU¤XuU}XvUŒXwU¦XxUXyU•XzU¡X{UŽX|W X}X)X~X7X¡XX¢XX£X'X¤X#X¥X(X¦WõX§XHX¨X%X©XXªXX«X3X¬X?X­X6X®X.X¯X9X°X8X±X-X²X,X³X;X´YaXµZ¯X¶Z”X·ZŸX¸ZzX¹Z¢XºZžX»ZxX¼Z¦X½Z|X¾Z¥X¿Z¬XÀZ•XÁZ®XÂZ7XÃZ„XÄZŠXÅZ—XÆZƒXÇZ‹XÈZ©XÉZ{XÊZ}XËZŒXÌZœXÍZXÎZ“XÏZXÐ[êXÑ[ÍXÒ[ËXÓ[ÔXÔ[ÑXÕ[ÊXÖ[ÎX×\ XØ\0XÙ]7XÚ]CXÛ]kXÜ]AXÝ]KXÞ]?Xß]5Xà]QXá]NXâ]UXã]3Xä]:Xå]RXæ]=Xç]1Xè]YXé]BXê]9Xë]IXì]8Xí]Zý?Zþe[@f[A¢[B [C¡[D×[E€Q[F€O[G€P[H€þ[I€Ô[JC[KJ[LR[MO[NG[O=[PM[Q:[Ræ[Sî[T÷[Uø[Vù[W‚[X‚<[Y‚=[Z‚?[[‚u[\ƒ;[]ƒÏ[^ƒù[_„#[`ƒÀ[aƒè[b„[cƒç[dƒä[eƒü[fƒö[g„[hƒÆ[iƒÈ[jƒë[kƒã[lƒ¿[m„[nƒÝ[oƒå[pƒØ[qƒÿ[rƒá[sƒË[tƒÎ[uƒÖ[vƒõ[wƒÉ[x„ [y„[zƒÞ[{„[|„[}ƒÂ[~ƒó[¡ƒÕ[¢ƒú[£ƒÇ[¤ƒÑ[¥ƒê[¦„[§ƒÃ[¨ƒì[©ƒî[ªƒÄ[«ƒû[¬ƒ×[­ƒâ[®„[¯ƒÛ[°ƒþ[±†Ø[²†â[³†æ[´†Ó[µ†ã[¶†Ú[·†ê[¸†Ý[¹†ë[º†Ü[»†ì[¼†é[½†×[¾†è[¿†Ñ[ÀˆH[ÁˆV[ˆU[Ⱥ[Ĉ×[ň¹[ƈ¸[LjÀ[Ȉ¾[Ɉ¶[ʈ¼[ˈ·[̈½[͈²[Ή[ψÉ[Љ•[щ˜[Ò‰—[Ó‰Ý[Ô‰Ú[Õ‰Û[ÖŠN[׊M[ØŠ9[ÙŠY[ÚŠ@[ÛŠW[ÜŠX[ÝŠD[ÞŠE[ߊR[àŠH[áŠQ[âŠJ[ãŠL[äŠO[åŒ_[æŒ[猀[茺[錾[ꌰ[댹[쌵[í„[î€[ï‰[ðØ[ñÓ[òÍ[óÇ[ôÖ[õÜ[öÏ[÷Õ[øÙ[ùÈ[ú×[ûÅ[üŽï[ýŽ÷[þŽú\@Žù\AŽæ\BŽî\CŽå\DŽõ\EŽç\FŽè\GŽö\HŽë\IŽñ\JŽì\KŽô\LŽé\M-\N4\O/\P‘\Q‘,\R‘\Sÿ\Tü\U‘\Vù\Wû\X‘\Y‘\Z‘\[‘\\‘\]‘a\^‘d\_‘_\`‘b\a‘`\b’\c’ \d’%\e’\f’\g’&\h’\i’ \j’\k’\l‘ÿ\m‘ý\n’\o’\p’'\q’\r’\s’$\t’\u’\v’\w’\x•{\y•\z•Œ\{•\|–‡\}–~\~–ˆ\¡–‰\¢–ƒ\£–€\¤–Â\¥–È\¦–Ã\§–ñ\¨–ð\©—l\ª—p\«—n\¬˜\­˜©\®˜ë\¯œæ\°žù\±Nƒ\²N„\³N¶\´P½\µP¿\¶PÆ\·P®\¸PÄ\¹PÊ\ºP´\»PÈ\¼PÂ\½P°\¾PÁ\¿Pº\ÀP±\ÁPË\ÂPÉ\ÃP¶\ÄP¸\ÅQ×\ÆRz\ÇRx\ÈR{\ÉR|\ÊUÃ\ËUÛ\ÌUÌ\ÍUÐ\ÎUË\ÏUÊ\ÐUÝ\ÑUÀ\ÒUÔ\ÓUÄ\ÔUé\ÕU¿\ÖUÒ\×U\ØUÏ\ÙUÕ\ÚUâ\ÛUÖ\ÜUÈ\ÝUò\ÞUÍ\ßUÙ\àUÂ\áW\âXS\ãXh\äXd\åXO\æXM\çXI\èXo\éXU\êXN\ëX]\ìXY\íXe\îX[\ïX=\ðXc\ñXq\òXü\óZÇ\ôZÄ\õZË\öZº\÷Z¸\øZ±\ùZµ\úZ°\ûZ¿\üZÈ\ýZ»\þZÆ]@Z·]AZÀ]BZÊ]CZ´]DZ¶]EZÍ]FZ¹]GZ]H[Ö]I[Ø]J[Ù]K\]L\3]M]q]N]c]O]J]P]e]Q]r]R]l]S]^]T]h]U]g]V]b]W]ð]X^O]Y^N]Z^J][^M]\^K]]^Å]^^Ì]_^Æ]`^Ë]a^Ç]b_@]c_¯]d_­]e`÷]faI]gaJ]ha+]iaE]ja6]ka2]la.]maF]na/]oaO]pa)]qa@]rb ]s‘h]tb#]ub%]vb$]wcÅ]xcñ]ycë]zd]{d]|d ]}d ]~d$]¡d3]¢dC]£d]¤d]¥d]¦d9]§d7]¨d"]©d#]ªd ]«d&]¬d0]­d(]®dA]¯d5]°d/]±d ]²d]³d@]´d%]µd']¶d ]·cç]¸d]¹d.]ºd!]»d]¼eo]½e’]¾eÓ]¿f†]ÀfŒ]Áf•]Âf]Ãf‹]ÄfŠ]Åf™]Æf”]Çfx]Èg ]Éif]Êi_]Ëi8]ÌiN]Íib]Îiq]Ïi?]ÐiE]Ñij]Òi9]ÓiB]ÔiW]ÕiY]Öiz]×iH]ØiI]Ùi5]Úil]Ûi3]Üi=]Ýie]Þhð]ßix]ài4]áii]âi@]ãio]äiD]åiv]æiX]çiA]èit]éiL]êi;]ëiK]ìi7]íi\]îiO]ïiQ]ði2]ñiR]òi/]ói{]ôi<]õkF]ökE]÷kC]økB]ùkH]úkA]ûk›]üú ]ýkû]þkü^@kù^Ak÷^Bkø^Cn›^DnÖ^EnÈ^Fn^GnÀ^HnŸ^In“^Jn”^Kn ^Ln±^Mn¹^NnÆ^OnÒ^Pn½^QnÁ^Rnž^SnÉ^Tn·^Un°^VnÍ^Wn¦^XnÏ^Yn²^Zn¾^[nÃ^\nÜ^]nØ^^n™^_n’^`nŽ^an^bn¤^cn¡^dn¿^en³^fnÐ^gnÊ^hn—^in®^jn£^kqG^lqT^mqR^nqc^oq`^pqA^qq]^rqb^sqr^tqx^uqj^vqa^wqB^xqX^yqC^zqK^{qp^|q_^}qP^~qS^¡qD^¢qM^£qZ^¤rO^¥r^¦rŒ^§r‘^¨r^©rŽ^ªs<^«sB^¬s;^­s:^®s@^¯sJ^°sI^±tD^²tJ^³tK^´tR^µtQ^¶tW^·t@^¸tO^¹tP^ºtN^»tB^¼tF^½tM^¾tT^¿tá^Àtÿ^Átþ^Âtý^Ãu^Äuy^Åuw^Æiƒ^Çuï^Èv^Év^Êu÷^Ëuþ^Ìuü^Íuù^Îuø^Ïv^Ðuû^Ñuö^Òuí^Óuõ^Ôuý^Õv™^Övµ^×vÝ^ØwU^Ùw_^Úw`^ÛwR^ÜwV^ÝwZ^Þwi^ßwg^àwT^áwY^âwm^ãwà^äx‡^åxš^æx”^çx^èx„^éx•^êx…^ëx†^ìx¡^íxƒ^îxy^ïx™^ðx€^ñx–^òx{^óy|^ôy‚^õy}^öyy^÷z^øz^ùz^úz^ûz^üz^ýz"^þz_@z_Az_Bz£_Cz¢_Dzž_Ezë_F{f_G{d_H{m_I{t_J{i_K{r_L{e_M{s_N{q_O{p_P{a_Q{x_R{v_S{c_T|²_U|´_V|¯_W}ˆ_X}†_Y}€_Z}_[}_\}…_]}z_^}Ž__}{_`}ƒ_a}|_b}Œ_c}”_d}„_e}}_f}’_gm_hk_ig_jh_kl_l¦_m¥_n§_oÛ_pÜ_q€!_rd_s`_tw_u\_vi_w[_xb_yr_zg!_{^_|v_}g_~o_¡D_¢a_£‚_¤‚I_¥‚D_¦‚@_§‚B_¨‚E_©„ñ_ª„?_«„V_¬„v_­„y_®„_¯„_°„e_±„Q_²„@_³„†_´„g_µ„0_¶„M_·„}_¸„Z_¹„Y_º„t_»„s_¼„]_½…_¾„^_¿„7_À„:_Á„4_„z_ÄC_Ä„x_Å„2_Æ„E_Ç„)_ȃÙ_É„K_Ê„/_Ë„B_Ì„-_Í„__΄p_Ï„9_ЄN_Ñ„L_Ò„R_Ó„o_Ô„Å_Õ„Ž_Ö„;_ׄG_Ø„6_Ù„3_Ú„h_Û„~_Ü„D_Ý„+_Þ„`_ß„T_à„n_á„P_⇠_ã‡_ä†÷_å‡ _æ†ú_ç†Ö_è†õ_é‡M_ê†ø_ë‡_ì‡ _í‡_î†ö_ï‡ _ð‡_ñˆÖ_òˆË_óˆÍ_ôˆÎ_õˆÞ_öˆÛ_÷ˆÚ_øˆÌ_ùˆÐ_ú‰…_û‰›_ü‰ß_ý‰å_þ‰ä`@‰á`A‰à`B‰â`C‰Ü`D‰æ`EŠv`FІ`GŠ`HŠa`IŠ?`JŠw`KŠ‚`LŠ„`MŠu`NŠƒ`OŠ`PŠt`QŠz`RŒ<`SŒK`TŒJ`UŒe`VŒd`WŒf`XŒ†`YŒ„`ZŒ…`[ŒÌ`\h`]i`^‘`_Œ``Ž`a`b`c“`d”`e`f’`gð`hà`iì`jñ`kî`lÐ`mé`nã`oâ`pç`qò`rë`sô`t`uŽÿ`v`w`x`y`z`{`| `}R`~?`¡D`¢I`£=`¤‘`¥‘ `¦‘`§‘`¨‘`©‘`ª‘ `«‘`¬‘n`­‘o`®’H`¯’R`°’0`±’:`²’f`³’3`´’e`µ’^`¶’ƒ`·’.`¸’J`¹’F`º’m`»’l`¼’O`½’``¾’g`¿’o`À’6`Á’a`Â’p`Ã’1`Ä’T`Å’c`Æ’P`Ç’r`È’N`É’S`Ê’L`Ë’V`Ì’2`Í•Ÿ`Εœ`Ï•ž`Е›`Ñ–’`Ò–“`Ó–‘`Ô–—`Õ–Î`Ö–ú`×–ý`Ø–ø`Ù–õ`Ú—s`Û—w`Ü—x`Ý—r`Þ˜`ߘ `à˜`ᘬ`â˜ö`ã˜ù`䙯`噲`æ™°`癵`èš­`éš«`ê›[`ëœê`ìœí`íœç``ïžý`ðPæ`ñPÔ`òP×`óPè`ôPó`õPÛ`öPê`÷PÝ`øPä`ùPÓ`úPì`ûPð`üPï`ýPã`þPàa@QØaAR€aBRaCRéaDRëaES0aFS¬aGV'aHVaIV aJVaKUüaLVaMVaNVaOVaPVaQUúaRVaSVaTUÿaUUùaVX‰aWX|aXXaYX˜aZX†a[Xa\Xa]Xta^X‹a_Xza`X‡aaX‘abXŽacXvadX‚aeXˆafX{agX”ahXaiXþajYkakZÜalZîamZåanZÕaoZêapZÚaqZíarZëasZóatZâauZàavZÛawZìaxZÞayZÝazZÙa{Zèa|Zßa}[wa~[àa¡[ãa¢\ca£]‚a¤]€a¥]}a¦]†a§]za¨]a©]waª]Ša«]‰a¬]ˆa­]~a®]|a¯]a°]ya±]a²^Xa³^Ya´^Saµ^Øa¶^Ña·^×a¸^Îa¹^Üaº^Õa»^Ùa¼^Òa½^Ôa¾_Da¿_CaÀ_oaÁ_¶aÂa,aÃa(aÄaAaÅa^aÆaqaÇasaÈaRaÉaSaÊaraËalaÌa€aÍataÎaTaÏazaÐa[aÑaeaÒa;aÓajaÔaaaÕaVaÖb)a×b'aØb+aÙd+aÚdMaÛd[aÜd]aÝdtaÞdvaßdraàdsaád}aâduaãdfaäd¦aådNaæd‚açd^aèd\aédKaêdSaëd`aìdPaídaîd?aïdlaðdkañdYaòdeaódwaôesaõe aöf¡a÷f aøfŸaùgaúgaûg"aüi±aýi¶aþiÉb@i bAiÎbBi–bCi°bDi¬bEi¼bFi‘bGi™bHiŽbIi§bJibKi©bLi¾bMi¯bNi¿bOiÄbPi½bQi¤bRiÔbSi¹bTiÊbUišbViÏbWi³bXi“bYiªbZi¡b[ižb\iÙb]i—b^ib_iÂb`iµbai¥bbiÆbckJbdkMbekKbfkžbgkŸbhk bikÃbjkÄbkkþblnÎbmnõbnnñboobpo%bqnøbro7bsnûbto.buo bvoNbwobxobyo'bzob{o;b|ob}níb~o b¡o6b¢osb£nùb¤nîb¥o-b¦o@b§o0b¨ocã‡Fcä‡ cå‡2cæ‡*cç‡-cè‡dÞ›?dß›`dà›adá›_dâœñdãœòdäœõdåž§dæPÿdçQdèQ0déPødêQdëQdìPödíPþdîQ dïQ dðPýdñQ dòR‹dóRŒdôRñdõRïdöVHd÷VBdøVLdùV5dúVAdûVJdüVIdýVFdþVXe@VZeAV@eBV3eCV=eDV,eEV>eFV8eGV*eHV:eIWeJX«eKXeLX±eMX eNX£eOX¯ePX¬eQX¥eRX¡eSXÿeTZÿeUZôeVZýeWZ÷eXZöeY[eZZøe[[e\Zùe][e^[e_[e`[ea\geb]™ec]—ed]Ÿee]’ef]¢eg]“eh]•ei] ej]œek]¡el]šem]žen^ieo^]ep^`eq^\er}óes^Ûet^Þeu^áev_Iew_²exa‹eyaƒezaye{a±e|a°e}a¢e~a‰e¡a›e¢a“e£a¯e¤a­e¥aŸe¦a’e§aªe¨a¡e©aeªafe«a³e¬b-e­dne®dpe¯d–e°d e±d…e²d—e³dœe´deµd‹e¶dŠe·dŒe¸d£e¹dŸeºdhe»d±e¼d˜e½eve¾eze¿eyeÀe{eÁe²eÂe³eÃfµeÄf°eÅf©eÆf²eÇf·eÈfªeÉf¯eÊjeËjeÌjeÍiåeÎiøeÏjeÐiñeÑiäeÒj eÓiÿeÔiìeÕiâeÖje×jeØiþeÙj'eÚiòeÛiîeÜjeÝi÷eÞiçeßj@eàjeáiæeâiûeãj eäiüeåiëeæj eçjeèjeéj%eêjeëiöeìj&eíjeîiôeïjeðkQeñk¥eòk£eók¢eôk¦eõleöle÷kÿeøleùoAeúo&eûo~eüo‡eýoÆeþo’f@ofAo‰fBoŒfCobfDoOfEo…fFoZfGo–fHovfIolfJo‚fKoUfLorfMoRfNoPfOoWfPo”fQo“fRo]fSofToafUokfVo}fWogfXofYoSfZo‹f[oif\of]o•f^ocf_owf`ojfao{fbq²fcq¯fdq›feq°ffq fgqšfhq©fiqµfjqfkq¥flqžfmq¤fnq¡foqªfpqœfqq§frq³fsr˜ftršfusXfvsRfws^fxs_fys`fzs]f{s[f|saf}sZf~sYf¡sbf¢t‡f£t‰f¤tŠf¥t†f¦tf§t}f¨t…f©tˆfªt|f«tyf¬uf­uf®u~f¯v%f°vf±vf²vf³vf´v#fµvf¶v(f·vf¸vœf¹vfºvžf»v›f¼wf½wf¾w‰f¿wˆfÀxÍfÁx»fÂxÏfÃxÌfÄxÑfÅxÎfÆxÔfÇxÈfÈxÃfÉxÄfÊxÉfËyšfÌy¡fÍy fÎyœfÏy¢fÐy›fÑkvfÒz9fÓz²fÔz´fÕz³fÖ{·f×{ËfØ{¾fÙ{¬fÚ{ÎfÛ{¯fÜ{¹fÝ{ÊfÞ{µfß|Åfà|Èfá|Ìfâ|Ëfã}÷fä}Ûfå}êfæ}çfç}×fè}áfé~fê}úfë}æfì}öfí}ñfî}ðfï}îfð}ßfñvfò¬fó°fô­fõíföëf÷êføìfùæfúèfû€dfü€gfý£fþŸg@žgA•gB¢gC™gD—gE‚gF‚OgG‚SgH‚RgI‚PgJ‚NgK‚QgL…$gM…;gN…gO…gP…)gQ…gR… gS… gT…gU… gV…'gW…gX„ûgY…+gZ„úg[…g\… g]„ôg^…*g_„òg`…ga„÷gb„ëgc„ógd„üge…gf„êgg„égh…gi„þgj…(gk…gl….gm…gn„ýgo…gp„ögq…1gr…&gs„çgt„ègu„ðgv„ïgw„ùgx…gy… gz…0g{… g|…g}…/g~†bg¡‡Vg¢‡cg£‡dg¤‡wg¥‡ág¦‡sg§‡Xg¨‡Tg©‡[gª‡Rg«‡ag¬‡Zg­‡Qg®‡^g¯‡mg°‡jg±‡Pg²‡Ng³‡_g´‡]gµ‡og¶‡lg·‡zg¸‡ng¹‡\gº‡eg»‡Og¼‡{g½‡ug¾‡bg¿‡ggÀ‡igÁˆZg‰gÉ gĉgʼn gƉgljgȉgɉgʉgˉg̉g͉ gΉ¢gω¤gЉ£gщígÒ‰ðgÓ‰ìgÔŠÏgÕŠÆgÖŠ¸g׊ÓgØŠÑgÙŠÔgÚŠÕgÛŠ»gÜŠ×gÝŠ¾gÞŠÀgߊÅgàŠØgáŠÃg⊺g㊽gäŠÙgåŒ>gæŒMgçŒgèŒågéŒßgêŒÙgëŒègìŒÚgíŒÝgîŒçgï gðœgñ¡gò›góŽ gôŽ#gõŽ%göŽ$g÷Ž.gøŽgùŽgúŽgûŽgüŽgýŽ&gþŽ'h@ŽhAŽhBŽhCŽhDŽhEŽhFŽhG,hH$hIhJhK hL#hMhNhOshPphQohRghSkhT‘/hU‘+hV‘)hW‘*hX‘2hY‘&hZ‘.h[‘…h\‘†h]‘Šh^‘h_‘‚h`‘„ha‘€hb’Ðhc’Ãhd’Ähe’Àhf’Ùhg’¶hh’Ïhi’ñhj’ßhk’Øhl’éhm’×hn’Ýho’Ìhp’ïhq’Âhr’èhs’Êht’Èhu’Îhv’æhw’Íhx’Õhy’Éhz’àh{’Þh|’çh}’Ñh~’Óh¡’µh¢’áh£’Æh¤’´h¥•|h¦•¬h§•«h¨•®h©•°hª–¤h«–¢h¬–Óh­—h®—h¯—h°—Zh±—Šh²—Žh³—ˆh´—Ðhµ—Ïh¶˜h·˜h¸˜&h¹˜)hº˜(h»˜ h¼˜h½˜'h¾˜²h¿™hÀ˜úhÁ™h™hÙhÄ™hÅ™hÆ™ÜhÇ™ÍhÈ™ÏhÉ™ÓhÊ™ÔhË™ÎhÌ™ÉhÍ™ÖhΙØhÏ™ËhЙ×hÑ™ÌhÒš³hÓšìhÔšëhÕšóhÖšòhךñhØ›FhÙ›ChÚ›ghÛ›thÜ›qhÝ›fhÞ›vhß›uhà›phá›hhâ›dhã›lhäœühåœúhæœýhçœÿhèœ÷héhêhëœùhìœûhíhîhïhðžƒhñžÓhòŸhóŸhôQhõQhöQh÷QhøQhùQÞhúS4hûSáhüVphýV`hþVni@VsiAVfiBVciCVmiDVriEV^iFVwiGWiHWiIXÈiJX½iKXÉiLX¿iMXºiNXÂiOX¼iPXÆiQ[iR[iS[iT[!iU[iV[iW[iX[iY[(iZ[i[[ i\[i][ïi^]¬i_]±i`]©ia]§ib]µic]°id]®ie]ªif]¨ig]²ih]­ii]¯ij]´ik^gil^him^fin^oio^éip^çiq^æir^èis^åit_Kiu_¼ivaiwa¨ixa–iyaÅiza´i{aÆi|aÁi}aÌi~aºi¡a¿i¢a¸i£aŒi¤d×i¥dÖi¦dÐi§dÏi¨dÉi©d½iªd‰i«dÃi¬dÛi­dói®dÙi¯e3i°ei±e|i²e¢i³fÈi´f¾iµfÀi¶fÊi·fËi¸fÏi¹f½iºf»i»fºi¼fÌi½g#i¾j4i¿jfiÀjIiÁjgiÂj2iÃjhiÄj>iÅj]iÆjmiÇjviÈj[iÉjQiÊj(iËjZiÌj;iÍj?iÎjAiÏjjiÐjdiÑjPiÒjOiÓjTiÔjoiÕjiiÖj`i×jkJ…[kK…qkL…NkM…nkN…ukO…UkP…gkQ…`kR…ŒkS…fkT…]kU…TkV…ekW…lkX†ckY†ekZ†dk[‡›k\‡k]‡—k^‡“k_‡’k`‡ˆka‡kb‡–kc‡˜kd‡yke‡‡kf‡£kg‡…kh‡ki‡‘kj‡kk‡„kl‡”km‡œkn‡ško‡‰kp‰kq‰&kr‰0ks‰-kt‰.ku‰'kv‰1kw‰"kx‰)ky‰#kz‰/k{‰,k|‰k}‰ñk~Šàk¡Šâk¢Šòk£Šôk¤Šõk¥ŠÝk¦‹k§Šäk¨Šßk©ŠðkªŠÈk«ŠÞk¬Šák­Šèk®Šÿk¯Šïk°Šûk±Œ‘k²Œ’k³Œk´ŒõkµŒîk¶Œñk·Œðk¸Œók¹lkºnk»¥k¼§k½Ž3k¾Ž>k¿Ž8kÀŽ@kÁŽEkÂŽ6kÃŽnu‰Anv‰Rnw‰7nx‰Bny‰­nz‰¯n{‰®n|‰òn}‰ón~‹n¡‹n¢‹n£‹n¤‹n¥‹ n¦‹"n§‹n¨‹n©‹nª‹n«‹ n¬‹n­‹n®‹n¯‹n°‹n±ŒOn²Œpn³Œrn´ŒqnµŒon¶Œ•n·Œ”n¸Œùn¹onºŽNn»ŽMn¼ŽSn½ŽPn¾ŽLn¿ŽGnÀCnÁ@nÂ…nÃ~nÄ‘8nÅ‘šnÆ‘¢nÇ‘›nÈ‘™nÉ‘ŸnÊ‘¡nË‘nÌ‘ nÍ“¡nΓƒnÏ“¯nГdnÑ“VnÒ“GnÓ“|nÔ“XnÕ“\nÖ“vnדInØ“PnÙ“QnÚ“`nÛ“mnÜ“nÝ“LnÞ“jnß“ynà“Wná“Unâ“Rnã“Onä“qnå“wnæ“{nç“anè“^né“cnê“gnë“€nì“Nní“Ynî•Çnï•Ànð•Énñ•Ãnò•Ånó•·nô–®nõ–°nö–¬n÷— nø—nù—nú—nû—nü—šný—¡nþ—œo@—žoA—oB—ÕoC—ÔoD—ñoE˜AoF˜DoG˜JoH˜IoI˜EoJ˜CoK™%oL™+oM™,oN™*oO™3oP™2oQ™/oR™-oS™1oT™0oU™˜oV™£oW™¡oXšoY™úoZ™ôo[™÷o\™ùo]™øo^™öo_™ûo`™ýoa™þob™üocšodš¾oešþofšýog›ohšüoi›Hoj›šok›¨ol›žom››on›¦oo›¡op›¥oq›¤or›†os›¢ot› ou›¯ov3owAoxgoy6oz.o{/o|1o}8o~0o¡Eo¢Bo£Co¤>o¥7o¦@o§=o¨õo©-oªžŠo«ž‰o¬žo­ž°o®žÈo¯žÚo°žûo±žÿo²Ÿ$o³Ÿ#o´Ÿ"oµŸTo¶Ÿ o·Q1o¸Q-o¹Q.oºV˜o»Vœo¼V—o½Všo¾Vo¿V™oÀYpoÁ[pä‹1på‹%pæ‹7pç‹&pè‹6pé‹.pê‹$pë‹;pì‹=pí‹:pîŒBpïŒupðŒ™pñŒ˜pòŒ—póŒþpôpõpöp÷Ž\pøŽbpùŽ`púŽWpûŽVpüŽ^pýŽepþŽgq@Ž[qAŽZqBŽaqCŽ]qDŽiqEŽTqFFqGGqHHqIKqJ‘(qK‘:qL‘;qM‘>qN‘¨qO‘¥qP‘§qQ‘¯qR‘ªqS“µqT“ŒqU“’qV“·qW“›qX“qY“‰qZ“§q[“Žq\“ªq]“žq^“¦q_“•q`“ˆqa“™qb“Ÿqc“qd“±qe“‘qf“²qg“¤qh“¨qi“´qj“£qk“¥ql•Òqm•Óqn•Ñqo–³qp–×qq–Úqr]Âqs–ßqt–Øqu–Ýqv—#qw—"qx—%qy—¬qz—®q{—¨q|—«q}—¤q~—ªq¡—¢q¢—¥q£—×q¤—Ùq¥—Öq¦—Øq§—úq¨˜Pq©˜Qqª˜Rq«˜¸q¬™Aq­™qü[?qý]Ãqþ^pr@_¿rAaûrBerCerDe rEe rFe rGerHe„rIeÞrJeÝrKfÞrLjçrMjàrNjÌrOjÑrPjÙrQjËrRjßrSjÜrTjÐrUjërVjÏrWjÍrXjÞrYk`rZk°r[l r\pr]p'r^p r_pr`p+rap!rbp"rcp#rdp)reprfp$rgprhp*rir rjr rkrrlrrmrrnr¥ror¦rpr¤rqr£rrr¡rstËrttÅrut·rvtÃrwurxv`rywÉrzwÊr{wÄr|wñr}yr~yr¡y!r¢yr£yr¤yr¥y°r¦zgr§zhr¨|3r©|w÷ˆ0wøˆ2wùˆ.wúˆ3wû‰vwü‰twý‰swþ‰þx@‹ŒxA‹ŽxB‹‹xC‹ˆxDŒExExFŽ˜xGdxHcxI‘¼xJ”bxK”UxL”]xM”WxN”^xO—ÄxP—ÅxQ˜xRšVxSšYxT›xU›xV› xWœRxXœXxYœPxZœJx[œMx\œKx]œUx^œYx_œLx`œNxaûxb÷xcïxdãxeëxføxgäxhöxiáxjîxkæxlòxmðxnâxoìxpôxqóxrèxsíxtžÂxužÐxvžòxwžóxxŸxyŸxzŸ8x{Ÿ7x|Ÿ6x}ŸCx~ŸOx¡Ÿqx¢Ÿpx£Ÿnx¤Ÿox¥VÓx¦VÍx§[Nx¨\mx©e-xªfíx«fîx¬kx­p_x®pax¯p]x°p`x±r#x²tÛx³tåx´wÕxµy8x¶y·x·y¶x¸|jx¹~—xº‰x»‚mx¼†Cx½ˆ8x¾ˆ7x¿ˆ5xÀˆKxÁ‹”x‹•xÃŽžxÄŽŸxÅŽ xÆŽxÇ‘¾xÈ‘½xÉ‘ÂxÊ”kxË”hxÌ”ixÍ–åxΗFxÏ—CxЗGxÑ—ÇxÒ—åxÓš^xÔšÕxÕ›YxÖœcxלgxØœfxÙœbxÚœ^xÛœ`xÜžxÝþxÞžxßžxàžxážxâžxãžxäž xåÿxæýxçžxèž xéŸxêŸFxëŸtxìŸuxíŸvxîVÔxïe.xðe¸xñkxòkxókxôkxõpbxör&x÷rªxøwØxùwÙxúy9xû|ixü|kxý|öxþ~šy@~˜yA~›yB~™yCàyDáyE†FyF†GyG†HyH‰yyI‰zyJ‰|yK‰{yL‰ÿyM‹˜yN‹™yOŽ¥yPޤyQŽ£yR”nyS”myT”oyU”qyV”syW—IyX˜ryY™_yZœhy[œny\œmy]ž y^ž y_žy`žyažybžycž¡ydžõyeŸ yfŸGygŸxyhŸ{yiŸzyjŸyykWylpfym|oynˆy§ˆ=y¨ˆ?y©‹žyªŒœy«Ž©y¬ŽÉy­—Ky®˜sy¯˜ty°˜Ìy±™ay²™«y³šdy´šfyµšgy¶›$y·žy¸žy¹ŸHyºby»ky¼r'y½†Ly¾Ž¨y¿”‚yÀ”€yÁ”yšiyÚhyÄ›.yÅžyÆr)ydžKyÈ‹ŸyÉ”ƒyÊœyyËž·yÌvuyÍškyΜzyÏžyÐpiyÑpjyÒž¤yÓŸ~yÔŸIyÕŸ˜screen-5.0.2/utf8encodings/040000664000175000017500000005735615224432722014414 0ustar alexalexScreenI2UTF8³JIS X 0212 (1990)"/Ø"0Ç"1¸"2Ù"3Ý"4¯"5Û"6Ú"7~"8„"9…"B¡"C¦"D¿"kº"lª"m©"n®"o!""p¤"q!&a†&bˆ&c‰&dŠ&eª&gŒ&iŽ&j«&l&q¬&r­&s®&t¯&uÊ&v&wÌ&xÂ&yÍ&zË&{°&|Î'B'C'D'E'F'G'H'I 'J 'K 'L 'M'N'rR'sS'tT'uU'vV'wW'xX'yY'zZ'{['|\'}^'~_)!Æ)")$&)&2)(A))?)+J),Ø)-R)/f)0Þ)Aæ)B)Cð)D')E1)F3)G8)HB)I@)JI)KK)Lø)MS)Nß)Og)Pþ*!Á*"À*#Ä*$Â*%*&Í*'*(*)Å**Ã*+*,*- *.Ç*/ *0*1É*2È*3Ë*4Ê*5*6*7*8*:*;*<"*= *>$*?Í*@Ì*AÏ*BÎ*CÏ*D0*E**F.*G(*H4*I6*J9*K=*L;*MC*NG*OE*PÑ*QÓ*RÒ*SÖ*TÔ*UÑ*VP*WL*XÕ*YT*ZX*[V*\Z*]\*^`*_^*`d*ab*bÚ*cÙ*dÜ*eÛ*fl*gÓ*hp*ij*jr*kn*lh*m×*nÛ*oÙ*pÕ*qt*rÝ*sx*tv*uy*v}*w{+!á+"à+#ä+$â+%+&Î+'+(+)å+*ã+++, +- +.ç+/ +0+1é+2è+3ë+4ê+5+6+7+8+9õ+:+;+=!+>%+?í+@ì+Aï+Bî+CÐ+E++F/+G)+H5+I7+J:+K>+L<+MD+NH+OF+Pñ+Qó+Rò+Sö+Tô+UÒ+VQ+WM+Xõ+YU+ZY+[W+\[+]]+^a+__+`e+ac+bú+cù+dü+eû+fm+gÔ+hq+ik+js+ko+li+mØ+nÜ+oÚ+pÖ+qu+rý+sÿ+tw+uz+v~+w|0!N0"N0#N0$N 0%N0&N0'N#0(N$0)N(0*N+0+N.0,N/0-N00.N50/N@00NA01ND02NG03NQ04NZ05N\06Nc07Nh08Ni09Nt0:Nu0;Ny0N–0?N—0@N0AN¯0BN¹0CNÃ0DNÐ0ENÚ0FNÛ0GNà0HNá0INâ0JNè0KNï0LNñ0MNó0NNõ0ONý0PNþ0QNÿ0RO0SO0TO0UO0VO 0WO 0XO0YO0ZO0[O0\O0]O.0^O10_O`0`O30aO50bO70cO90dO;0eO>0fO@0gOB0hOH0iOI0jOK0kOL0lOR0mOT0nOV0oOX0pO_0qOc0rOj0sOl0tOn0uOq0vOw0wOx0xOy0yOz0zO}0{O~0|O0}O‚0~O„1!O…1"O‰1#OŠ1$OŒ1%OŽ1&O1'O’1(O“1)O”1*O—1+O™1,Oš1-Ož1.OŸ1/O²10O·11O¹12O»13O¼14O½15O¾16OÀ17OÁ18OÅ19OÆ1:OÈ1;OÉ1OÍ1?OÏ1@OÒ1AOÜ1BOà1COâ1DOð1EOò1FOü1GOý1HOÿ1IP1JP1KP1LP1MP 1NP 1OP1PP1QP1RP1SP1TP1UP1VP1WP1XP"1YP'1ZP.1[P01\P21]P31^P51_P@1`PA1aPB1bPE1cPF1dPJ1ePL1fPN1gPQ1hPR1iPS1jPW1kPY1lP_1mP`1nPb1oPc1pPf1qPg1rPj1sPm1tPp1uPq1vP;1wP1xPƒ1yP„1zP†1{PŠ1|PŽ1}P1~P2!P’2"P“2#P”2$P–2%P›2&Pœ2'Pž2(PŸ2)P 2*P¡2+P¢2,Pª2-P¯2.P°2/P¹20Pº21P½22PÀ23PÃ24PÄ25PÇ26PÌ27PÎ28PÐ29PÓ2:PÔ2;PØ2Pß2?Pâ2@Pä2APæ2BPè2CPé2DPï2EPñ2FPö2GPú2HPþ2IQ2JQ2KQ2LQ2MQ 2NQ 2OQ 2PQ2QPò2RQ2SQ2TQ2UQ2VQ2WQ2XQ2YQ#2ZQ'2[Q(2\Q,2]Q-2^Q/2_Q12`Q32aQ42bQ52cQ82dQ92eQB2fQJ2gQO2hQS2iQU2jQW2kQX2lQ_2mQd2nQf2oQ~2pQƒ2qQ„2rQ‹2sQŽ2tQ˜2uQ2vQ¡2wQ£2xQ­2yQ¸2zQº2{Q¼2|Q¾2}Q¿2~QÂ3!QÈ3"QÏ3#QÑ3$QÒ3%QÓ3&QÕ3'QØ3(QÞ3)Qâ3*Qå3+Qî3,Qò3-Qó3.Qô3/Q÷30R31R32R33R34R35R36R37R38R"39R(3:R13;R23RE3?RI3@RU3ARW3BRX3CRZ3DR\3ER_3FR`3GRa3HRf3IRn3JRw3KRx3LRy3MR€3NR‚3OR…3PRŠ3QRŒ3RR“3SR•3TR–3UR—3VR˜3WRš3XRœ3YR¤3ZR¥3[R¦3\R§3]R¯3^R°3_R¶3`R·3aR¸3bRº3cR»3dR½3eRÀ3fRÄ3gRÆ3hRÈ3iRÌ3jRÏ3kRÑ3lRÔ3mRÖ3nRÛ3oRÜ3pRá3qRå3rRè3sRé3tRê3uRì3vRð3wRñ3xRô3yRö3zR÷3{S3|S3}S 3~S 4!S 4"S4#S4$S4%S4&S4'S4(S4)S%4*S'4+S(4,S)4-S+4.S,4/S-40S041S242S543S<44S=45S>46SB47SL48SK49SY4:S[4;Sa4Sl4?Sm4@Sr4ASy4BS~4CSƒ4DS‡4ESˆ4FSŽ4GS“4HS”4IS™4JS4KS¡4LS¤4MSª4NS«4OS¯4PS²4QS´4RSµ4SS·4TS¸4USº4VS½4WSÀ4XSÅ4YSÏ4ZSÒ4[SÓ4\SÕ4]SÚ4^SÝ4_SÞ4`Sà4aSæ4bSç4cSõ4dT4eT4fT4gT!4hT'4iT(4jT*4kT/4lT14mT44nT54oTC4pTD4qTG4rTM4sTO4tT^4uTb4vTd4wTf4xTg4yTi4zTk4{Tm4|Tn4}Tt4~T5!T5"Tƒ5#T…5$Tˆ5%T‰5&T5'T‘5(T•5)T–5*Tœ5+TŸ5,T¡5-T¦5.T§5/T©50Tª51T­52T®53T±54T·55T¹56Tº57T»58T¿59TÆ5:TÊ5;TÍ5Tê5?Tì5@Tï5ATö5BTü5CTþ5DTÿ5EU5FU5GU5HU5IU 5JU 5KU 5LU5MU5NU*5OU+5PU25QU55RU65SU;5TU<5UU=5VUA5WUG5XUI5YUJ5ZUM5[UP5\UQ5]UX5^UZ5_U[5`U^5aU`5bUa5cUd5dUf5eU5fU5gU‚5hU†5iUˆ5jUŽ5kU5lU‘5mU’5nU“5oU”5pU—5qU£5rU¤5sU­5tU²5uU¿5vUÁ5wUÃ5xUÆ5yUÉ5zUË5{UÌ5|UÎ5}UÑ5~UÒ6!UÓ6"U×6#UØ6$UÛ6%UÞ6&Uâ6'Ué6(Uö6)Uÿ6*V6+V6,V 6-V 6.V6/V60V61V62V63V64V,65V066V367V568V769V96:V;6;V<6V@6?VA6@VC6AVD6BVF6CVI6DVK6EVM6FVO6GVT6HV^6IV`6JVa6KVb6LVc6MVf6NVi6OVm6PVo6QVq6RVr6SVu6TV„6UV…6VVˆ6WV‹6XVŒ6YV•6ZV™6[Vš6\V6]Vž6^VŸ6_V¦6`V§6aV¨6bV©6cV«6dV¬6eV­6fV±6gV³6hV·6iV¾6jVÅ6kVÉ6lVÊ6mVË6nVÏ6oVÐ6pVÌ6qVÍ6rVÙ6sVÜ6tVÝ6uVß6vVá6wVä6xVå6yVæ6zVç6{Vè6|Vñ6}Vë6~Ví7!Vö7"V÷7#W7$W7%W7&W 7'W 7(W7)W7*W7+W7,W7-W 7.W"7/W#70W$71W%72W)73W*74W,75W.76W/77W378W479W=7:W>7;W?7WL7?WM7@WR7AWb7BWe7CWg7DWh7EWk7FWm7GWn7HWo7IWp7JWq7KWs7LWt7MWu7NWw7OWy7PWz7QW{7RW|7SW~7TW7UWƒ7VWŒ7WW”7XW—7YW™7ZWš7[Wœ7\W7]Wž7^WŸ7_W¡7`W•7aW§7bW¨7cW©7dW¬7eW¸7fW½7gWÇ7hWÈ7iWÌ7jWÏ7kWÕ7lWÝ7mWÞ7nWä7oWæ7pWç7qWé7rWí7sWð7tWõ7uWö7vWø7wWý7xWþ7yWÿ7zX7{X7|X7}X 7~Wá8!X 8"X 8#X8$X8%X8&X 8'X&8(X'8)X-8*X28+X98,X?8-XI8.XL8/XM80XO81XP82XU83X_84Xa85Xd86Xg87Xh88Xx89X|8:X8;X€8Xˆ8?X‰8@XŠ8AXŒ8BX8CX8DX8EX”8FX–8GX8HX 8IX¡8JX¢8KX¦8LX©8MX±8NX²8OXÄ8PX¼8QXÂ8RXÈ8SXÍ8TXÎ8UXÐ8VXÒ8WXÔ8XXÖ8YXÚ8ZXÝ8[Xá8\Xâ8]Xé8^Xó8_Y8`Y8aY 8bY 8cY8dY8eY8f†A8gY8hY!8iY#8jY$8kY(8lY/8mY08nY38oY58pY68qY?8rYC8sYF8tYR8uYS8vYY8wY[8xY]8yY^8zY_8{Ya8|Yc8}Yk8~Ym9!Yo9"Yr9#Yu9$Yv9%Yy9&Y{9'Y|9(Y‹9)YŒ9*YŽ9+Y’9,Y•9-Y—9.YŸ9/Y¤90Y§91Y­92Y®93Y¯94Y°95Y³96Y·97Yº98Y¼99YÁ9:YÃ9;YÄ9YÍ9?YÒ9@YÝ9AYÞ9BYß9CYã9DYä9EYç9FYî9GYï9HYñ9IYò9JYô9KY÷9LZ9MZ9NZ 9OZ 9PZ9QZ9RZ9SZ9TZ#9UZ$9VZ'9WZ(9XZ*9YZ-9ZZ09[ZD9\ZE9]ZG9^ZH9_ZL9`ZP9aZU9bZ^9cZc9dZe9eZg9fZm9gZw9hZz9iZ{9jZ~9kZ‹9lZ9mZ“9nZ–9oZ™9pZœ9qZž9rZŸ9sZ 9tZ¢9uZ§9vZ¬9wZ±9xZ²9yZ³9zZµ9{Z¸9|Zº9}Z»9~Z¿:!ZÄ:"ZÆ:#ZÈ:$ZÏ:%ZÚ:&ZÜ:'Zà:(Zå:)Zê:*Zî:+Zõ:,Zö:-Zý:.[:/[:0[:1[:2[4:3[:4[:5[:6[!:7[%:8[-:9[8::[A:;[K:<[L:=[R:>[V:?[^:@[h:A[n:B[o:C[|:D[}:E[~:F[:G[:H[„:I[†:J[Š:K[Ž:L[:M[‘:N[“:O[”:P[–:Q[¨:R[©:S[¬:T[­:U[¯:V[±:W[²:X[·:Y[º:Z[¼:[[À:\[Á:][Í:^[Ï:_[Ö:`[×:a[Ø:b[Ù:c[Ú:d[à:e[ï:f[ñ:g[ô:h[ý:i\ :j\:k\:l\:m\#:n\&:o\):p\+:q\,:r\.:s\0:t\2:u\5:v\6:w\Y:x\Z:y\\:z\b:{\c:|\g:}\h:~\i;!\m;"\p;#\t;$\u;%\z;&\{;'\|;(\};)\‡;*\ˆ;+\Š;,\;-\’;.\;/\Ÿ;0\ ;1\¢;2\£;3\¦;4\ª;5\²;6\´;7\µ;8\º;9\É;:\Ë;;\Ò;<\Ý;=\×;>\î;?\ñ;@\ò;A\ô;B];C];D] ;E];F]+;G]#;H]$;I]&;J]';K]1;L]4;M]9;N]=;O]?;P]B;Q]C;R]F;S]H;T]U;U]Q;V]Y;W]J;X]_;Y]`;Z]a;[]b;\]d;]]j;^]m;_]p;`]y;a]z;b]~;c];d];e]ƒ;f]ˆ;g]Š;h]’;i]“;j]”;k]•;l]™;m]›;n]Ÿ;o] ;p]§;q]«;r]°;s]´;t]¸;u]¹;v]Ã;w]Ç;x]Ë;y]Ð;z]Î;{]Ø;|]Ù;}]à;~]ä<2^K<3^P<4^I<5^Q<6^V<7^X<8^[<9^\<:^^<;^h<<^j<=^k<>^l_Ñ=?_Ò=@_Ó=A_Ô=B_Þ=C_á=D_â=E_è=F_é=G_ê=H_ì=I_í=J_î=K_ï=L_ò=M_ó=N_ö=O_ú=P_ü=Q`=R` =S` =T`=U`=V`=W`=X`=Y`=Z`$=[`-=\`3=]`5=^`@=_`G=``H=a`I=b`L=c`Q=d`T=e`V=f`W=g`]=h`a=i`g=j`q=k`~=l`=m`‚=n`†=o`ˆ=p`Š=q`Ž=r`‘=s`“=t`•=u`˜=v`=w`ž=x`¢=y`¤=z`¥={`¨=|`°=}`±=~`·>!`»>"`¾>#`Â>$`Ä>%`È>&`É>'`Ê>(`Ë>)`Î>*`Ï>+`Ô>,`Õ>-`Ù>.`Û>/`Ý>0`Þ>1`â>2`å>3`ò>4`õ>5`ø>6`ü>7`ý>8a>9a>:a >;a >=a>>a>?a>@a>Aa>Ba>Ca>Da>Ea>Fa">Ga*>Ha+>Ia0>Ja1>Ka5>La6>Ma7>Na9>OaA>PaE>QaF>RaI>Sa^>Ta`>Ual>Var>Wax>Xa{>Ya|>Za>[a€>\a>]aƒ>^a„>_a‹>`a>aa’>ba“>ca—>da˜>eaœ>fa>gaŸ>ha >ia¥>ja¨>kaª>la­>ma¸>na¹>oa¼>paÀ>qaÁ>raÂ>saÎ>taÏ>uaÕ>vaÜ>waÝ>xaÞ>yaß>zaá>{aâ>|aç>}aé>~aå?!aì?"aí?#aï?$b?%b?&b?'b?(b?)b?*b?+b ?,b"?-b#?.b'?/b)?0b+?1b9?2b=?3bB?4bC?5bD?6bF?7bL?8bP?9bQ?:bR?;bT?b\??bd?@bm?Abo?Bbs?Cbz?Db}?Eb?FbŽ?Gb?Hb?Ib¦?Jb¨?Kb³?Lb¶?Mb·?Nbº?Ob¾?Pb¿?QbÄ?RbÎ?SbÕ?TbÖ?UbÚ?Vbê?Wbò?Xbô?Ybü?Zbý?[c?\c?]c ?^c ?_c ?`c?ac?bc?cc?dc)?ec*?fc-?gc5?hc6?ic9?jccà@?cå@@cê@Acì@Bcò@Ccó@Dcõ@Ecø@Fcù@Gd @Hd @Id@Jd@Kd@Ld@Md@Nd @Od"@Pd$@Qd%@Rd)@Sd*@Td/@Ud0@Vd5@Wd=@Xd?@YdK@ZdO@[dQ@\dR@]dS@^dT@_dZ@`d[@ad\@bd]@cd_@dd`@eda@fdc@gdm@hds@idt@jd{@kd}@ld…@md‡@nd@od@pd‘@qd˜@rd™@sd›@td@udŸ@vd¡@wd£@xd¦@yd¨@zd¬@{d³@|d½@}d¾@~d¿A!dÄA"dÉA#dÊA$dËA%dÌA&dÎA'dÐA(dÑA)dÕA*d×A+däA,dåA-déA.dêA/díA0dðA1dõA2d÷A3dûA4dÿA5eA6eA7eA8e A9e A:eA;eAeA?eA@eAAeABe"ACe&ADe)AEe.AFe1AGe:AHefaB?fûB@fjBAfkBBflBCf~BDfsBEfuBFfBGfwBHfxBIfyBJf{BKf€BLf|BMf‹BNfŒBOfBPfBQf’BRf™BSfšBTf›BUfœBVfŸBWf BXf¤BYf­BZf±B[f²B\fµB]f»B^f¿B_fÀB`fÂBafÃBbfÈBcfÌBdfÎBefÏBffÔBgfÛBhfßBifèBjfëBkfìBlfîBmfúBngBogBpgBqgBrgBsgBtg Bug"Bvg3Bwg>BxgEBygGBzgHB{gLB|gTB}gUB~g]C!gfC"glC#gnC$gtC%gvC&g{C'gC(g„C)gŽC*gC+g‘C,g“C-g–C.g˜C/g™C0g›C1g°C2g±C3g²C4gµC5g»C6g¼C7g½C8gùC9gÀC:gÂC;gÃCgÉC?gÒC@g×CAgÙCBgÜCCgáCDgæCEgðCFgòCGgöCHg÷CIhRCJhCKhCLhCMhCNh(COh'CPh,CQh-CRh/CSh0CTh1CUh3CVh;CWh?CXhDCYhECZhJC[hLC\hUC]hWC^hXC_h[C`hkCahnCbhoCchpCdhqCehrCfhuCghyChhzCih{Cjh|Ckh‚Clh„Cmh†CnhˆCoh–Cph˜CqhšCrhœCsh¡Cth£Cuh¥Cvh©CwhªCxh®Cyh²Czh»C{hÅC|hÈC}hÌC~hÏD!hÐD"hÑD#hÓD$hÖD%hÙD&hÜD'hÝD(håD)hèD*hêD+hëD,hìD-híD.hðD/hñD0hõD1höD2hûD3hüD4hýD5iD6i D7i D8iD9iD:iD;iDi3D?i5D@i8DAi;DBiBDCiEDDiIDEiNDFiWDGi[DHicDIidDJieDKifDLihDMiiDNilDOipDPiqDQirDRizDSi{DTiDUi€DViDWi’DXi–DYi˜DZi¡D[i¥D\i¦D]i¨D^i«D_i­D`i¯Dai·Dbi¸DciºDdi¼DeiÅDfiÈDgiÑDhiÖDii×DjiâDkiåDliîDmiïDniñDoióDpiõDqiþDrjDsjDtjDujDvjDwjDxjDyjDzj D{j$D|j(D}j0D~j2E!j4E"j7E#j;E$j>E%j?E&jEE'jFE(jIE)jJE*jNE+jPE,jQE-jRE.jUE/jVE0j[E1jdE2jgE3jjE4jqE5jsE6j~E7jE8jƒE9j†E:j‡E;j‰Ej›E?jE@jžEAjŸEBj¥ECj«EDj¯EEj°EFj±EGj´EHj½EIj¾EJj¿EKjÆELjÉEMjÈENjÌEOjÐEPjÔEQjÕERjÖESjÜETjÝEUjäEVjçEWjìEXjðEYjñEZjòE[jüE\jýE]kE^kE_kE`kEak EbkEckEdkEekEfkEgkEhk$Eik(Ejk+Ekk,Elk/Emk5Enk6Eok;Epk?EqkFErkJEskMEtkREukVEvkXEwk]Exk`EykgEzkkE{knE|kpE}kuE~k}F!k~F"k‚F#k…F$k—F%k›F&kŸF'k F(k¢F)k£F*k¨F+k©F,k¬F-k­F.k®F/k°F0k¸F1k¹F2k½F3k¾F4kÃF5kÄF6kÉF7kÌF8kÖF9kÚF:káF;kãFkîF?kñF@k÷FAkùFBkÿFClFDlFElFFl FGl FHlFIlFJlFKlFLlFMl&FNl'FOl(FPl,FQl.FRl3FSl5FTl6FUl:FVl;FWl?FXlJFYlKFZlMF[lOF\lRF]lTF^lYF_l[F`l\FalkFblmFcloFdltFelvFflxFglyFhl{Fil…Fjl†Fkl‡Fll‰Fml”Fnl•Fol—Fpl˜FqlœFrlŸFsl°Ftl²Ful´FvlÂFwlÆFxlÍFylÏFzlÐF{lÑF|lÒF}lÔF~lÖG!lÚG"lÜG#làG$lçG%léG&lëG'lìG(lîG)lòG*lôG+mG,mG-m G.mG/mG0mG1mG2mG3m&G4m'G5m(G6lgG7m.G8m/G9m1G:m9G;mm^G?m_G@maGAmeGBmgGCmoGDmpGEm|GFm‚GGm‡GHm‘GIm’GJm”GKm–GLm—GMm˜GNmªGOm¬GPm´GQm·GRm¹GSm½GTm¿GUmÄGVmÈGWmÊGXmÎGYmÏGZmÖG[mÛG\mÝG]mßG^màG_mâG`måGaméGbmïGcmðGdmôGemöGfmüGgnGhnGinGjn"Gkn'Gln2Gmn6Gnn9Gon;GpnnùH?nûH@nýHAoHBoHCo HDo HEo HFoHGoHHoHIoHJo&HKo)HLo*HMo/HNo0HOo3HPo6HQo;HRopUI?p]I@p^IApNIBpdICpeIDplIEpnIFpuIGpvIHp~IIpIJp…IKp†ILp”IMp•INp–IOp—IPp˜IQp›IRp¤ISp«ITp°IUp±IVp´IWp·IXpÊIYpÑIZpÓI[pÔI\pÕI]pÖI^pØI_pÜI`päIapúIbqIcqIdqIeqIfqIgq Ihq IiqIjqIkq Ilq+Imq-Inq/Ioq0Ipq1Iqq8IrqAIsqEItqFIuqGIvqJIwqKIxqPIyqRIzqWI{qZI|q\I}q^I~q`J!qhJ"qyJ#q€J$q…J%q‡J&qŒJ'q’J(qšJ)q›J*q J+q¢J,q¯J-q°J.q²J/q³J0qºJ1q¿J2qÀJ3qÁJ4qÄJ5qËJ6qÌJ7qÓJ8qÖJ9qÙJ:qÚJ;qÜJrJ?rJ@rJAr JBrJCrJDrJErJFrJGr$JHr+JIr/JJr4JKr8JLr9JMrAJNrBJOrCJPrEJQrNJRrOJSrPJTrSJUrUJVrVJWrZJXr\JYr^JZr`J[rcJ\rhJ]rkJ^rnJ_roJ`rqJarwJbrxJcr{Jdr|JerJfr„Jgr‰JhrJirŽJjr“Jkr›Jlr¨Jmr­Jnr®Jor±Jpr´Jqr¾JrrÁJsrÇJtrÉJurÌJvrÕJwrÖJxrØJyrßJzråJ{róJ|rôJ}rúJ~rûK!rþK"sK#sK$sK%sK&s K's K(sK)sK*sK+sK,sK-s"K.s$K/s'K0s(K1s,K2s1K3s2K4s5K5s:K6s;K7s=K8sCK9sMK:sPK;sRKs]K?s^K@s_KAs`KBsfKCsgKDsiKEskKFslKGsnKHsoKIsqKJswKKsyKLs|KMs€KNsKOsƒKPs…KQs†KRsŽKSsKTs“KUs•KVs—KWs˜KXsœKYsžKZsŸK[s K\s¢K]s¥K^s¦K_sªK`s«Kas­KbsµKcs·Kds¹Kes¼Kfs½Kgs¿KhsÅKisÆKjsÉKksËKlsÌKmsÏKnsÒKosÓKpsÖKqsÙKrsÝKssáKtsãKusæKvsçKwséKxsôKysõKzs÷K{sùK|súK}sûK~sýL!sÿL"tL#tL$tL%tL&t L'tL(tL)tL*t$L+t&L,t(L-t)L.t*L/t+L0t,L1t-L2t.L3t/L4t0L5t1L6t9L7t@L8tCL9tDL:tFL;tGLtQL?tRL@tWLAt]LBtbLCtfLDtgLEthLFtkLGtmLHtnLItqLJtrLKt€LLtLMt…LNt†LOt‡LPt‰LQtLRtLSt‘LTt’LUt˜LVt™LWtšLXtœLYtŸLZt L[t¡L\t£L]t¦L^t¨L_t©L`tªLat«Lbt®Lct¯Ldt±Let²LftµLgt¹Lht»Lit¿LjtÈLktÉLltÌLmtÐLntÓLotØLptÚLqtÛLrtÞLstßLttäLutèLvtêLwtëLxtïLytôLztúL{tûL|tüL}tÿL~uM!uM"uM#uM$u M%u!M&u$M'u'M(u)M)u*M*u/M+u6M,u9M-u=M.u>M/u?M0u@M1uCM2uGM3uHM4uNM5uPM6uRM7uWM8u^M9u_M:uaM;uoMuzM?u{M@u|MAu}MBu~MCuMDu…MEuMFu’MGu“MHu•MIu™MJuœMKu¢MLu¤MMu´MNuºMOu¿MPuÀMQuÁMRuÄMSuÆMTuÌMUuÎMVuÏMWu×MXuÜMYußMZuàM[uáM\uäM]uçM^uìM_uîM`uïMauñMbuùMcvMdvMevMfvMgvMhvMiv Mjv MkvMlvMmvMnvMovMpvMqvMrvMsvMtvMuv#Mvv%Mwv&Mxv)Myv-Mzv2M{v3M|v5M}v8M~v9N!v:N"vv N?v¢N@v£NAv¤NBv¥NCv¦NDv§NEv¨NFvªNGv­NHv½NIvÁNJvÅNKvÉNLvËNMvÌNNvÎNOvÔNPvÙNQvàNRvæNSvèNTvìNUvðNVvñNWvöNXvùNYvüNZwN[wN\w N]wN^wN_wN`wNawNbwNcwNdwNew"Nfw(Ngw-Nhw.Niw/Njw4Nkw5Nlw6Nmw9Nnw=Now>NpwBNqwENrwFNswJNtwMNuwNNvwONwwRNxwVNywWNzw\N{w^N|w_N}w`N~wbO!wdO"wgO#wjO$wlO%wpO&wrO'wsO(wtO)wzO*w}O+w€O,w„O-wŒO.wO/w”O0w•O1w–O2wšO3wŸO4w¢O5w§O6wªO7w®O8w¯O9w±O:wµO;w¾OwÑO?wÒO@wÕOAwÙOBwÞOCwßODwàOEwäOFwæOGwêOHwìOIwðOJwñOKwôOLwøOMwûONxOOxOPx OQx ORxOSxOTxOUx!OVx"OWx#OXx-OYx.OZx0O[x5O\x7O]xCO^xDO_xGO`xHOaxLObxNOcxROdx\Oex^Ofx`OgxaOhxcOixdOjxhOkxjOlxnOmxzOnx~OoxŠOpxOqx”Orx˜Osx¡OtxOuxžOvxŸOwx¤Oxx¨Oyx¬Ozx­O{x°O|x±O}x²O~x³P!x»P"x½P#x¿P$xÇP%xÈP&xÉP'xÌP(xÎP)xÒP*xÓP+xÕP,xÖP-xäP.xÛP/xßP0xàP1xáP2xæP3xêP4xòP5xóP6yP7xöP8x÷P9xúP:xûP;xÿPyP?yP@yPAyPByPCy PDy%PEy'PFy)PGy-PHy1PIy4PJy5PKy;PLy=PMy?PNyDPOyEPPyFPQyJPRyKPSyOPTyQPUyTPVyXPWy[PXy\PYygPZyiP[ykP\yrP]yyP^y{P_y|P`y~Pay‹PbyŒPcy‘Pdy“Pey”Pfy•Pgy–Phy˜Piy›PjyœPky¡Ply¨Pmy©Pny«Poy¯Ppy±Pqy´Pry¸Psy»PtyÂPuyÄPvyÇPwyÈPxyÊPyyÏPzyÔP{yÖP|yÚP}yÝP~yÞQ!yàQ"yâQ#yåQ$yêQ%yëQ&yíQ'yñQ(yøQ)yüQ*zQ+zQ,zQ-z Q.z Q/z Q0zQ1zQ2zQ3zQ4z!Q5z'Q6z+Q7z-Q8z/Q9z0Q:z4Q;z5Qz:Q?zDQ@zEQAzGQBzHQCzLQDzUQEzVQFzYQGz\QHz]QIz_QJz`QKzeQLzgQMzjQNzmQOzuQPzxQQz~QRz€QSz‚QTz…QUz†QVzŠQWz‹QXzQYz‘QZz”Q[zžQ\z Q]z£Q^z¬Q_z³Q`zµQaz¹Qbz»Qcz¼QdzÆQezÉQfzÌQgzÎQhzÑQizÛQjzèQkzéQlzëQmzìQnzñQozôQpzûQqzýQrzþQs{Qt{Qu{Qv{#Qw{'Qx{)Qy{*Qz{+Q{{-Q|{.Q}{/Q~{0R!{1R"{4R#{=R${?R%{@R&{AR'{GR({NR){UR*{`R+{dR,{fR-{iR.{jR/{mR0{oR1{rR2{sR3{wR4{„R5{‰R6{ŽR7{R8{‘R9{–R:{›R;{žR<{ R={¥R>{¬R?{¯R@{°RA{²RB{µRC{¶RD{ºRE{»RF{¼RG{½RH{ÂRI{ÅRJ{ÈRK{ÊRL{ÔRM{ÖRN{×RO{ÙRP{ÚRQ{ÛRR{èRS{êRT{òRU{ôRV{õRW{øRX{ùRY{úRZ{üR[{þR\|R]|R^|R_|R`|Ra| Rb| Rc| Rd|Re|Rf|Rg|Rh| Ri|%Rj|&Rk|(Rl|,Rm|1Rn|3Ro|4Rp|6Rq|9Rr|:Rs|FRt|JRu|URv|QRw|RRx|SRy|YRz|ZR{|[R||\R}|]R~|^S!|aS"|cS#|gS$|iS%|mS&|nS'|pS(|rS)|yS*||S+|}S,|†S-|‡S.|S/|”S0|žS1| S2|¦S3|°S4|¶S5|·S6|ºS7|»S8|¼S9|¿S:|ÄS;|ÇS<|ÈS=|ÉS>|ÍS?|ÏS@|ÓSA|ÔSB|ÕSC|×SD|ÙSE|ÚSF|ÝSG|æSH|éSI|ëSJ|õSK}SL}SM}SN} SO}SP}SQ}SR}SS}ST}SU}SV}#SW}&SX}*SY}-SZ}1S[}S^}@S_}AS`}GSa}HSb}MSc}QSd}SSe}WSf}YSg}ZSh}\Si}]Sj}eSk}gSl}jSm}pSn}xSo}zSp}{Sq}Sr}Ss}‚St}ƒSu}…Sv}†Sw}ˆSx}‹Sy}ŒSz}S{}‘S|}–S}}—S~}T!}žT"}¦T#}§T$}ªT%}³T&}¶T'}·T(}¹T)}ÂT*}ÃT+}ÄT,}ÅT-}ÆT.}ÌT/}ÍT0}ÎT1}×T2}ÙT3~T4}âT5}åT6}æT7}êT8}ëT9}íT:}ñT;}õT<}öT=}ùT>}úT?~T@~TA~TB~TC~TD~TE~TF~ TG~'TH~(TI~,TJ~-TK~/TL~3TM~6TN~?TO~DTP~ETQ~GTR~NTS~PTT~RTU~XTV~_TW~aTX~bTY~eTZ~kT[~nT\~oT]~sT^~xT_~~T`~Ta~†Tb~‡Tc~ŠTd~Te~‘Tf~•Tg~˜Th~šTi~Tj~žTkTo?TpCTqDTrGTsOTtRTuSTv[Tw\Tx]TyaTzcT{dT|eT}fT~mU!qU"}U#~U$U%€U&‹U'U(U)U*‘U+–U,—U-œU.¡U/¢U0¦U1ªU2­U3´U4¼U5¿U6ÀU7ÃU8ÈU9ÎU:ÏU;ÛU<ßU=ãU>åU?èU@ìUAîUBïUCòUDúUEýUFþUGÿUH€UI€UJ€ UK€ UL€UM€UN€UO€UP€UQ€UR€US€UT€UU€ UV€$UW€&UX€,UY€.UZ€0U[€4U\€5U]€7U^€9U_€:U`€Ub€@Uc€DUd€`Ue€dUf€fUg€mUh€qUi€uUj€Uk€ˆUl€ŽUm€œUn€žUo€¦Up€§Uq€«Ur€¸Us€¹Ut€ÈUu€ÍUv€ÏUw€ÒUx€ÔUy€ÕUz€×U{€ØU|€àU}€íU~€îV!€ðV"€òV#€óV$€öV%€ùV&€úV'€þV(V) V*V+V,V-V.V/ V0$V1'V2,V30V45V5:V6aV?gV@hVAiVBmVCoVDwVEVFVG„VH…VI†VJ‹VKŽVL–VM˜VN›VOžVP¢VQ®VR²VS´VT»VUËVVÃVWÅVXÊVYÎVZÏV[ÕV\×V]ÛV^ÝV_ÞV`áVaäVbëVcìVdðVeñVfòVgõVhöViøVjùVkýVlÿVm‚Vn‚Vo‚Vp‚Vq‚Vr‚Vs‚Vt‚Vu‚!Vv‚"Vw‚(Vx‚2Vy‚4Vz‚:V{‚CV|‚DV}‚EV~‚FW!‚KW"‚NW#‚OW$‚QW%‚VW&‚\W'‚`W(‚cW)‚gW*‚mW+‚tW,‚{W-‚}W.‚W/‚€W0‚W1‚ƒW2‚„W3‚‡W4‚‰W5‚ŠW6‚ŽW7‚‘W8‚”W9‚–W:‚˜W;‚šW<‚›W=‚ W>‚¡W?‚£W@‚¤WA‚§WB‚¨WC‚©WD‚ªWE‚®WF‚°WG‚²WH‚´WI‚·WJ‚ºWK‚¼WL‚¾WM‚¿WN‚ÆWO‚ÐWP‚ÕWQ‚ÚWR‚àWS‚âWT‚äWU‚èWV‚êWW‚íWX‚ïWY‚öWZ‚÷W[‚ýW\‚þW]ƒW^ƒW_ƒW`ƒWaƒ Wbƒ WcƒTWdƒWeƒWfƒWgƒWhƒ!Wiƒ"Wjƒ,Wkƒ-Wlƒ.Wmƒ0Wnƒ3Woƒ7Wpƒ:WqƒƒSX?ƒèX@ƒêXAƒöXBƒøXCƒùXDƒüXE„XF„XG„ XH„XI„XJ„XK„XLƒ­XM„/XN„9XO„EXP„GXQ„HXR„JXS„MXT„OXU„QXV„RXW„VXX„XXY„YXZ„ZX[„\X\„`X]„dX^„eX_„gX`„jXa„pXb„sXc„tXd„vXe„xXf„|Xg„}Xh„Xi„…Xj„’Xk„“Xl„•Xm„žXn„¦Xo„¨Xp„©Xq„ªXr„¯Xs„±Xt„´Xu„ºXv„½Xw„¾Xx„ÀXy„ÂXz„ÇX{„ÈX|„ÌX}„ÏX~„ÓY!„ÜY"„çY#„êY$„ïY%„ðY&„ñY'„òY(„÷Y)…2Y*„úY+„ûY,„ýY-…Y.…Y/…Y0… Y1…Y2…Y3…Y4…Y5…"Y6…#Y7…$Y8…%Y9…'Y:…*Y;…+Y<…/Y=…3Y>…4Y?…6Y@…?YA…FYB…OYC…PYD…QYE…RYF…SYG…VYH…YYI…\YJ…]YK…^YL…_YM…`YN…aYO…bYP…dYQ…kYR…oYS…yYT…zYU…{YV…}YW…YX…YY……YZ…†Y[…‰Y\…‹Y]…ŒY^…Y_…“Y`…˜Ya…Yb…ŸYc… Yd…¢Ye…¥Yf…§Yg…´Yh…¶Yi…·Yj…¸Yk…¼Yl…½Ym…¾Yn…¿Yo…ÂYp…ÇYq…ÊYr…ËYs…ÎYt…­Yu…ØYv…ÚYw…ßYx…àYy…æYz…èY{…íY|…óY}…öY~…üZ!…ÿZ"†Z#†Z$†Z%† Z&†Z'†Z(†Z)†Z*†Z+†Z,†Z-†Z.†!Z/†'Z0†)Z1†6Z2†8Z3†:Z4††YZ?†]Z@†`ZA†aZB†bZC†cZD†dZE†iZF†lZG†oZH†uZI†vZJ†wZK†zZL†ZM†‘ZN†–ZO†˜ZP†šZQ†œZR†¡ZS†¦ZT†§ZU†¨ZV†­ZW†±ZX†³ZY†´ZZ†µZ[†·Z\†¸Z]†¹Z^†¿Z_†ÀZ`†ÁZa†ÃZb†ÅZc†ÑZd†ÒZe†ÕZf†×Zg†ÚZh†ÜZi†àZj†ãZk†åZl†çZm†ˆZn†úZo†üZp†ýZq‡Zr‡Zs‡Zt‡ Zu‡Zv‡Zw‡Zx‡Zy‡Zz‡Z{‡Z|‡Z}‡!Z~‡#[!‡(["‡.[#‡/[$‡1[%‡2[&‡9['‡:[(‡<[)‡=[*‡>[+‡@[,‡C[-‡E[.‡M[/‡X[0‡][1‡a[2‡d[3‡e[4‡o[5‡q[6‡r[7‡{[8‡ƒ[9‡„[:‡…[;‡†[<‡‡[=‡ˆ[>‡‰[?‡‹[@‡Œ[A‡[B‡“[C‡•[D‡—[E‡˜[F‡™[G‡ž[H‡ [I‡£[J‡§[K‡¬[L‡­[M‡®[N‡±[O‡µ[P‡¾[Q‡¿[R‡Á[S‡È[T‡É[U‡Ê[V‡Î[W‡Õ[X‡Ö[Y‡Ù[Z‡Ú[[‡Ü[\‡ß[]‡â[^‡ã[_‡ä[`‡ê[a‡ë[b‡í[c‡ñ[d‡ó[e‡ø[f‡ú[g‡ÿ[hˆ[iˆ[jˆ[kˆ [lˆ [mˆ [nˆ[oˆ[pˆ[qˆ[rˆ[sˆ[tˆ[uˆˆ[wˆ[xˆ[yˆ([zˆ-[{ˆ.[|ˆ0[}ˆ2[~ˆ5\!ˆ:\"ˆ<\#ˆA\$ˆC\%ˆE\&ˆH\'ˆI\(ˆJ\)ˆK\*ˆN\+ˆQ\,ˆU\-ˆV\.ˆX\/ˆZ\0ˆ\\1ˆ_\2ˆ`\3ˆd\4ˆi\5ˆq\6ˆy\7ˆ{\8ˆ€\9ˆ˜\:ˆš\;ˆ›\<ˆœ\=ˆŸ\>ˆ \?ˆ¨\@ˆª\Aˆº\Bˆ½\Cˆ¾\DˆÀ\EˆÊ\FˆË\GˆÌ\HˆÍ\IˆÎ\JˆÑ\KˆÒ\LˆÓ\MˆÛ\NˆÞ\Oˆç\Pˆï\Qˆð\Rˆñ\Sˆõ\Tˆ÷\U‰\V‰\W‰ \X‰\Y‰\Z‰\[‰\\‰\]‰\^‰\_‰\`‰ \a‰&\b‰'\c‰(\d‰0\e‰1\f‰2\g‰5\h‰9\i‰:\j‰>\k‰@\l‰B\m‰E\n‰F\o‰I\p‰O\q‰R\r‰W\s‰Z\t‰[\u‰\\v‰a\w‰b\x‰c\y‰k\z‰n\{‰p\|‰s\}‰u\~‰z]!‰{]"‰|]#‰}]$‰‰]%‰]&‰]'‰”](‰•])‰›]*‰œ]+‰Ÿ],‰ ]-‰¥].‰°]/‰´]0‰µ]1‰¶]2‰·]3‰¼]4‰Ô]5‰Õ]6‰Ö]7‰×]8‰Ø]9‰å]:‰é];‰ë]<‰í]=‰ñ]>‰ó]?‰ö]@‰ù]A‰ý]B‰ÿ]CŠ]DŠ]EŠ]FŠ]GŠ]HŠ]IŠ]JŠ]KŠ]LŠ ]MŠ"]NŠ$]OŠ&]PŠ+]QŠ,]RŠ/]SŠ5]TŠ7]UŠ=]VŠ>]WŠ@]XŠC]YŠE]ZŠG][ŠI]\ŠM]]ŠN]^ŠS]_ŠV]`ŠW]aŠX]bŠ\]cŠ]]dŠa]eŠe]fŠg]gŠu]hŠv]iŠw]jŠy]kŠz]lŠ{]mŠ~]nŠ]oŠ€]pŠƒ]qІ]rŠ‹]sŠ]tŠ]uŠ’]vŠ–]wŠ—]xŠ™]yŠŸ]zЧ]{Š©]|Š®]}Н]~г^!ж^"Š·^#Š»^$о^%ŠÃ^&ŠÆ^'ŠÈ^(ŠÉ^)ŠÊ^*ŠÑ^+ŠÓ^,ŠÔ^-ŠÕ^.Š×^/ŠÝ^0Šß^1Šì^2Šð^3Šô^4Šõ^5Šö^6Šü^7Šÿ^8‹^9‹^:‹ ^;‹^<‹^=‹^>‹^?‹ ^@‹-^A‹0^B‹7^C‹<^D‹B^E‹C^F‹D^G‹E^H‹F^I‹H^J‹R^K‹S^L‹T^M‹Y^N‹M^O‹^^P‹c^Q‹m^R‹v^S‹x^T‹y^U‹|^V‹~^W‹^X‹„^Y‹…^Z‹‹^[‹^\‹^]‹”^^‹•^_‹œ^`‹ž^a‹Ÿ^bŒ8^cŒ9^dŒ=^eŒ>^fŒE^gŒG^hŒI^iŒK^jŒO^kŒQ^lŒS^mŒT^nŒW^oŒX^pŒ[^qŒ]^rŒY^sŒc^tŒd^uŒf^vŒh^wŒi^xŒm^yŒs^zŒu^{Œv^|Œ{^}Œ~^~Œ†_!Œ‡_"Œ‹_#Œ_$Œ’_%Œ“_&Œ™_'Œ›_(Œœ_)Œ¤_*Œ¹_+Œº_,ŒÅ_-ŒÆ_.ŒÉ_/ŒË_0ŒÏ_1ŒÖ_2ŒÕ_3ŒÙ_4ŒÝ_5Œá_6Œè_7Œì_8Œï_9Œð_:Œò_;Œõ_<Œ÷_=Œø_>Œþ_?Œÿ_@_A_B _C_D_E_Fe_Gi_Hl_In_J_K‚_L„_Mˆ_N_O_P‘_Q•_Rž_SŸ_T _U¦_V«_W¬_X¯_Y²_Zµ_[·_\¹_]»_^À__Å_`Æ_aÇ_bÈ_cÊ_dÎ_eÑ_fÔ_gÕ_h×_iÙ_jä_kå_lç_mì_nð_o¼_pñ_qò_rô_sý_tŽ_uŽ_vŽ_wŽ_xŽ _yŽ_zŽ_{Ž_|Ž _}Ž!_~Ž"`!Ž#`"Ž&`#Ž'`$Ž1`%Ž3`&Ž6`'Ž7`(Ž8`)Ž9`*Ž=`+Ž@`,ŽA`-ŽK`.ŽM`/ŽN`0ŽO`1ŽT`2Ž[`3Ž\`4Ž]`5Ž^`6Ža`7Žb`8Ži`9Žl`:Žm`;Žo`<Žp`=Žq`>Žy`?Žz`@Ž{`AŽ‚`BŽƒ`Cމ`DŽ`EŽ’`FŽ•`GŽš`HŽ›`IŽ`JŽž`KŽ¢`Lާ`MŽ©`NŽ­`OŽ®`P޳`Q޵`RŽº`SŽ»`TŽÀ`UŽÁ`VŽÃ`WŽÄ`XŽÇ`YŽÏ`ZŽÑ`[ŽÔ`\ŽÜ`]Žè`^Žî`_Žð``Žñ`aŽ÷`bŽù`cŽú`dŽí`e`f`g`h`i`j`k`l`m`n`o `p!`q#`r%`s'`t(`u,`v-`w.`x4`y5`z6`{7`|:`}@`~Aa!Ca"Ga#Oa$Qa%Ra&Sa'Ta(Ua)Xa*]a+^a,ea-a. a/¡a0¤a1¥a2¦a3µa4¶a5¸a6¾a7Àa8Áa9Æa:Êa;Ëa<Ía=Ða>Òa?Óa@ÕaAàaBãaCäaDèaEîaFñaGõaHöaIûaJþaKaLaMaN aOaPaQ(aR)aS/aT*aU,aV-aW3aX4aY7aZ?a[Ca\Da]La^[a_]a`baafabgacladpaetafyag…ahˆai‹ajŒakŽalam•an—ao˜ap™aq›ar as¡at¢au¥av°aw²ax³ay´az¶a{½a|Ìa}¾a~Ãb!Äb"Åb#Çb$Èb%Õb&×b'Øb(Ùb)Üb*Ýb+ßb,åb-Òb.öb/ëb0ïb1ðb2ôb3þb4ÿb5‘b6‘b7‘b8‘b9‘b:‘ b;‘b<‘b=‘b>‘b?‘b@‘bA‘bB‘bC‘ bD‘%bE‘"bF‘#bG‘'bH‘)bI‘.bJ‘/bK‘1bL‘4bM‘6bN‘7bO‘9bP‘:bQ‘’ c?’ c@’ cA’cB’cC’cD’cE’cF’cG’cH’#cI’$cJ’%cK’&cL’(cM’.cN’/cO’0cP’3cQ’5cR’6cS’8cT’9cU’:cV’cX’@cY’BcZ’Cc[’Fc\’Gc]’Jc^’Mc_’Nc`’Oca’Qcb’Xcc’Ycd’\ce’]cf’`cg’ach’eci’gcj’hck’icl’ncm’ocn’pco’ucp’vcq’wcr’xcs’yct’{cu’|cv’}cw’cx’ˆcy’‰cz’Šc{’c|’Žc}’’c~’—d!’™d"’Ÿd#’ d$’¤d%’¥d&’§d'’¨d(’«d)’¯d*’²d+’¶d,’¸d-’ºd.’»d/’¼d0’½d1’¿d2’Àd3’Ád4’Âd5’Ãd6’Åd7’Æd8’Çd9’Èd:’Ëd;’Ìd<’Íd=’Îd>’Ðd?’Ód@’ÕdA’×dB’ØdC’ÙdD’ÜdE’ÝdF’ßdG’àdH’ádI’ãdJ’ådK’çdL’èdM’ìdN’îdO’ðdP’ùdQ’ûdR’ÿdS“dT“dU“dV“ dW“dX“dY“dZ“d[“d\“d]“d^“!d_“$d`“%da“'db“)dc“*dd“3de“4df“6dg“7dh“Gdi“Hdj“Idk“Pdl“Qdm“Rdn“Udo“Wdp“Xdq“Zdr“^ds“ddt“edu“gdv“idw“jdx“mdy“odz“pd{“qd|“sd}“td~“ve!“ze"“}e#“e$“€e%“e&“‚e'“ˆe(“Še)“‹e*“e+“e,“’e-“•e.“˜e/“›e0“že1“¡e2“£e3“¤e4“¦e5“¨e6“«e7“´e8“µe9“¶e:“ºe;“©e<“Áe=“Äe>“Åe?“Æe@“ÇeA“ÉeB“ÊeC“ËeD“ÌeE“ÍeF“ÓeG“ÙeH“ÜeI“ÞeJ“ßeK“âeL“æeM“çeN“ùeO“÷eP“øeQ“úeR“ûeS“ýeT”eU”eV”eW”eX” eY” eZ”e[”e\”e]”e^”e_”e`”.ea”/eb”1ec”2ed”3ee”4ef”;eg”?eh”=ei”Cej”Eek”Hel”Jem”Len”Ueo”Yep”\eq”_er”aes”cet”heu”kev”mew”nex”oey”qez”re{”„e|”ƒe}•xe~•yf!•~f"•„f#•ˆf$•Œf%•f&•Žf'•f(•žf)•Ÿf*•¡f+•¦f,•©f-•«f.•¬f/•´f0•¶f1•ºf2•½f3•¿f4•Æf5•Èf6•Éf7•Ëf8•Ðf9•Ñf:•Òf;•Óf<•Ùf=•Úf>•Ýf?•Þf@•ßfA•àfB•äfC•æfD–fE–fF–"fG–$fH–%fI–&fJ–,fK–1fL–3fM–7fN–8fO–9fP–:fQ–—xg?—{g@—}gA—gB—€gC—‰gD—•gE—–gF——gG—™gH—šgI—žgJ—ŸgK—¢gL—¬gM—®gN—±gO—²gP—µgQ—¶gR—¸gS—¹gT—ºgU—¼gV—¾gW—¿gX—ÁgY—ÄgZ—Åg[—Çg\—Ég]—Êg^—Ìg_—Íg`—Îga—Ðgb—Ñgc—Ôgd—×ge—Øgf—Ùgg—Ýgh—Þgi—àgj—Ûgk—ágl—ägm—ïgn—ñgo—ôgp—÷gq—øgr—úgs˜gt˜ gu˜gv˜ gw˜gx˜gy˜gz˜g{˜g|˜ g}˜#g~˜&h!˜+h"˜.h#˜/h$˜0h%˜2h&˜3h'˜5h(˜%h)˜>h*˜Dh+˜Gh,˜Jh-˜Qh.˜Rh/˜Sh0˜Vh1˜Wh2˜Yh3˜Zh4˜bh5˜ch6˜eh7˜fh8˜jh9˜lh:˜«h;˜­h<˜®h=˜°h>˜´h?˜·h@˜¸hA˜ºhB˜»hC˜¿hD˜ÂhE˜ÅhF˜ÈhG˜ÌhH˜áhI˜ãhJ˜åhK˜æhL˜çhM˜êhN˜óhO˜öhP™hQ™hR™hS™hT™hU™hV™hW™hX™hY™hZ™h[™"h\™&h]™'h^™+h_™1h`™2ha™3hb™4hc™5hd™9he™:hf™;hg™ši?ši@š iAš"iBš#iCš$iDš'iEš-iFš.iGš3iHš5iIš6iJš8iKšGiLšAiMšDiNšJiOšKiPšLiQšNiRšQiSšTiTšViUš]iVšªiWš¬iXš®iYš¯iZš²i[š´i\šµi]š¶i^š¹i_š»i`š¾iaš¿ibšÁicšÃidšÆiešÈifšÎigšÐihšÒiišÕijšÖikš×ilšÛimšÜinšàiošäipšåiqšçiršéisšìitšòiušóivšõiwšùixšúiyšýizšÿi{›i|›i}›i~›j!›j"›j#›j$› j%› j&› j'› j(›j)›j*›j+›j,›j-›j.›j/› j0›&j1›+j2›-j3›3j4›4j5›5j6›7j7›9j8›:j9›=j:›Hj;›Kj<›Lj=›Uj>›Vj?›Wj@›[jA›^jB›ajC›cjD›ejE›fjF›hjG›jjH›kjI›ljJ›mjK›njL›sjM›ujN›wjO›xjP›yjQ›jR›€jS›„jT›…jU›†jV›‡jW›‰jX›ŠjY›‹jZ›j[›j\›j]›”j^›šj_›j`›žja›¦jb›§jc›©jd›¬je›°jf›±jg›²jh›·ji›¸jj›»jk›¼jl›¾jm›¿jn›Ájo›Çjp›Èjq›Îjr›Ðjs›×jt›Øju›Ýjv›ßjw›åjx›çjy›êjz›ëj{›ïj|›ój}›÷j~›øk!›ùk"›úk#›ýk$›ÿk%œk&œk'œ k(œk)œk*œk+œk,œk-œk.œk/œk0œ"k1œ#k2œ&k3œ'k4œ(k5œ)k6œ*k7œ1k8œ5k9œ6k:œ7k;œ=k<œAk=œCk>œDk?œEk@œIkAœJkBœNkCœOkDœPkEœSkFœTkGœVkHœXkIœ[kJœ]kKœ^kLœ_kMœckNœikOœjkPœ\kQœkkRœhkSœnkTœpkUœrkVœukWœwkXœ{kYœækZœòk[œ÷k\œùk] k^k_k`kakbkckdke/kf0kg2kh3ki4kj:kkÖl?×l@ÚlAÞlBßlCàlDålEçlFélGëlHîlIðlJólKôlLþlMž lNžlOžlPžlQžlRžlSžlTžlUžlVžlWžlXžlYžzlZž{l[ž|l\ž€l]ž‚l^žƒl_ž„l`ž…laž‡lbžŽlcžldž–lež˜lfž›lgžžlhž¤liž¨ljž¬lkž®llž¯lmž°lnž³lož´lpžµlqžÆlržÈlsžËltžÕlužßlvžälwžçlxžìlyžílzžîl{žðl|žñl}žòl~žõm!žøm"žÿm#Ÿm$Ÿm%Ÿ m&Ÿm'Ÿm(Ÿm)Ÿm*Ÿm+Ÿm,Ÿm-Ÿm.Ÿm/Ÿm0Ÿm1Ÿ"m2Ÿ&m3Ÿ*m4Ÿ+m5Ÿ/m6Ÿ1m7Ÿ2m8Ÿ4m9Ÿ7m:Ÿ9m;Ÿ:m<ŸŸ?m?ŸAm@ŸCmAŸDmBŸEmCŸFmDŸGmEŸSmFŸUmGŸVmHŸWmIŸXmJŸZmKŸ]mLŸ^mMŸhmNŸimOŸmmPŸnmQŸomRŸpmSŸqmTŸsmUŸumVŸzmWŸ}mXŸmYŸmZŸ‘m[Ÿ’m\Ÿ”m]Ÿ–m^Ÿ—m_Ÿžm`Ÿ¡maŸ¢mbŸ£mcŸ¥screen-5.0.2/utf8encodings/030000664000175000017500000010023615224432722014375 0ustar alexalexScreenI2UTF8 KSC 5601-1992!!0!"0!#0!$·!% %!& &!'¨!(0!)­!* !+"%!,ÿ±!?×!@÷!A"`!B"d!C"e!D"!E"4!F°!G 2!H 3!I!!J!+!Kÿà!Lÿá!Mÿå!N&B!O&@!P" !Q"¥!R#!S"!T"!U"a!V"R!W§!X ;!Y&!Z&![%Ë!\%Ï!]%Î!^%Ç!_%Æ!`%¡!a% !b%³!c%²!d%½!e%¼!f!’!g!!h!‘!i!“!j!”!k0!l"j!m"k!n"!o"=!p"!q"5!r"+!s",!t"!u" !v"†!w"‡!x"‚!y"ƒ!z"*!{")!|"'!}"(!~ÿâ"!!Ò""!Ô"#""$""%´"&ÿ^"'Ç"(Ø")Ý"*Ú"+Ù",¸"-Û".¡"/¿"0Ð"1"."2""3""4¤"5! "6 0"7%Á"8%À"9%·":%¶";&d"<&`"=&a">&e"?&g"@&c"A"™"B%È"C%£"D%Ð"E%Ñ"F%’"G%¤"H%¥"I%¨"J%§"K%¦"L%©"M&h"N&"O&"P&"Q&"R¶"S "T !"U!•"V!—"W!™"X!–"Y!˜"Z&m"[&i"\&j"]&l"^2"_2"`!"a3Ç"b!""c3Â"d3Ø"e!!#!ÿ#"ÿ##ÿ#$ÿ#%ÿ#&ÿ#'ÿ#(ÿ#)ÿ #*ÿ #+ÿ #,ÿ #-ÿ #.ÿ#/ÿ#0ÿ#1ÿ#2ÿ#3ÿ#4ÿ#5ÿ#6ÿ#7ÿ#8ÿ#9ÿ#:ÿ#;ÿ#<ÿ#=ÿ#>ÿ#?ÿ#@ÿ #Aÿ!#Bÿ"#Cÿ##Dÿ$#Eÿ%#Fÿ&#Gÿ'#Hÿ(#Iÿ)#Jÿ*#Kÿ+#Lÿ,#Mÿ-#Nÿ.#Oÿ/#Pÿ0#Qÿ1#Rÿ2#Sÿ3#Tÿ4#Uÿ5#Vÿ6#Wÿ7#Xÿ8#Yÿ9#Zÿ:#[ÿ;#\ÿæ#]ÿ=#^ÿ>#_ÿ?#`ÿ@#aÿA#bÿB#cÿC#dÿD#eÿE#fÿF#gÿG#hÿH#iÿI#jÿJ#kÿK#lÿL#mÿM#nÿN#oÿO#pÿP#qÿQ#rÿR#sÿS#tÿT#uÿU#vÿV#wÿW#xÿX#yÿY#zÿZ#{ÿ[#|ÿ\#}ÿ]#~ÿã$!11$"12$#13$$14$%15$&16$'17$(18$)19$*1:$+1;$,1<$-1=$.1>$/1?$01@$11A$21B$31C$41D$51E$61F$71G$81H$91I$:1J$;1K$<1L$=1M$>1N$?1O$@1P$A1Q$B1R$C1S$D1T$E1U$F1V$G1W$H1X$I1Y$J1Z$K1[$L1\$M1]$N1^$O1_$P1`$Q1a$R1b$S1c$T1d$U1e$V1f$W1g$X1h$Y1i$Z1j$[1k$\1l$]1m$^1n$_1o$`1p$a1q$b1r$c1s$d1t$e1u$f1v$g1w$h1x$i1y$j1z$k1{$l1|$m1}$n1~$o1$p1€$q1$r1‚$s1ƒ$t1„$u1…$v1†$w1‡$x1ˆ$y1‰$z1Š${1‹$|1Œ$}1$~1Ž%!!p%"!q%#!r%$!s%%!t%&!u%'!v%(!w%)!x%*!y%0!`%1!a%2!b%3!c%4!d%5!e%6!f%7!g%8!h%9!i%A‘%B’%C“%D”%E•%F–%G—%H˜%I™%Jš%K›%Lœ%M%Nž%OŸ%P %Q¡%R£%S¤%T¥%U¦%V§%W¨%X©%a±%b²%c³%d´%eµ%f¶%g·%h¸%i¹%jº%k»%l¼%m½%n¾%o¿%pÀ%qÁ%rÃ%sÄ%tÅ%uÆ%vÇ%wÈ%xÉ&!%&"%&#% &$%&%%&&%&'%&(%,&)%$&*%4&+%<&,%&-%&.%&/%&0%&1%&2%#&3%3&4%+&5%;&6%K&7% &8%/&9%(&:%7&;%?&<%&=%0&>%%&?%8&@%B&A%&B%&C%&D%&E%&F%&G%&H% &I%&J%&K%!&L%"&M%&&N%'&O%)&P%*&Q%-&R%.&S%1&T%2&U%5&V%6&W%9&X%:&Y%=&Z%>&[%@&\%A&]%C&^%D&_%E&`%F&a%G&b%H&c%I&d%J'!3•'"3–'#3—'$!'%3˜'&3Ä''3£'(3¤')3¥'*3¦'+3™',3š'-3›'.3œ'/3'03ž'13Ÿ'23 '33¡'43¢'53Ê'63'73Ž'83'93Ï':3ˆ';3‰'<3È'=3§'>3¨'?3°'@3±'A3²'B3³'C3´'D3µ'E3¶'F3·'G3¸'H3¹'I3€'J3'K3‚'L3ƒ'M3„'N3º'O3»'P3¼'Q3½'R3¾'S3¿'T3'U3‘'V3’'W3“'X3”'Y!&'Z3À'[3Á'\3Š']3‹'^3Œ'_3Ö'`3Å'a3­'b3®'c3¯'d3Û'e3©'f3ª'g3«'h3¬'i3Ý'j3Ð'k3Ó'l3Ã'm3É'n3Ü'o3Æ(!Æ("Ð(#ª($&(&2((?()A(*Ø(+R(,º(-Þ(.f(/J(12`(22a(32b(42c(52d(62e(72f(82g(92h(:2i(;2j(<2k(=2l(>2m(?2n(@2o(A2p(B2q(C2r(D2s(E2t(F2u(G2v(H2w(I2x(J2y(K2z(L2{(M$Ð(N$Ñ(O$Ò(P$Ó(Q$Ô(R$Õ(S$Ö(T$×(U$Ø(V$Ù(W$Ú(X$Û(Y$Ü(Z$Ý([$Þ(\$ß(]$à(^$á(_$â(`$ã(a$ä(b$å(c$æ(d$ç(e$è(f$é(g$`(h$a(i$b(j$c(k$d(l$e(m$f(n$g(o$h(p$i(q$j(r$k(s$l(t$m(u$n(v½(w!S(x!T(y¼(z¾({![(|!\(}!](~!^)!æ)")#ð)$')%1)&3)'8)(@))B)*ø)+S),ß)-þ).g)/K)0I)12)22)32)42)52)62)72)82)92):2 );2 )<2 )=2 )>2 )?2)@2)A2)B2)C2)D2)E2)F2)G2)H2)I2)J2)K2)L2)M$œ)N$)O$ž)P$Ÿ)Q$ )R$¡)S$¢)T$£)U$¤)V$¥)W$¦)X$§)Y$¨)Z$©)[$ª)\$«)]$¬)^$­)_$®)`$¯)a$°)b$±)c$²)d$³)e$´)f$µ)g$t)h$u)i$v)j$w)k$x)l$y)m$z)n${)o$|)p$})q$~)r$)s$€)t$)u$‚)v¹)w²)x³)y t)z ){ )| ‚)} ƒ)~ „*!0A*"0B*#0C*$0D*%0E*&0F*'0G*(0H*)0I**0J*+0K*,0L*-0M*.0N*/0O*00P*10Q*20R*30S*40T*50U*60V*70W*80X*90Y*:0Z*;0[*<0\*=0]*>0^*?0_*@0`*A0a*B0b*C0c*D0d*E0e*F0f*G0g*H0h*I0i*J0j*K0k*L0l*M0m*N0n*O0o*P0p*Q0q*R0r*S0s*T0t*U0u*V0v*W0w*X0x*Y0y*Z0z*[0{*\0|*]0}*^0~*_0*`0€*a0*b0‚*c0ƒ*d0„*e0…*f0†*g0‡*h0ˆ*i0‰*j0Š*k0‹*l0Œ*m0*n0Ž*o0*p0*q0‘*r0’*s0“+!0¡+"0¢+#0£+$0¤+%0¥+&0¦+'0§+(0¨+)0©+*0ª++0«+,0¬+-0­+.0®+/0¯+00°+10±+20²+30³+40´+50µ+60¶+70·+80¸+90¹+:0º+;0»+<0¼+=0½+>0¾+?0¿+@0À+A0Á+B0Â+C0Ã+D0Ä+E0Å+F0Æ+G0Ç+H0È+I0É+J0Ê+K0Ë+L0Ì+M0Í+N0Î+O0Ï+P0Ð+Q0Ñ+R0Ò+S0Ó+T0Ô+U0Õ+V0Ö+W0×+X0Ø+Y0Ù+Z0Ú+[0Û+\0Ü+]0Ý+^0Þ+_0ß+`0à+a0á+b0â+c0ã+d0ä+e0å+f0æ+g0ç+h0è+i0é+j0ê+k0ë+l0ì+m0í+n0î+o0ï+p0ð+q0ñ+r0ò+s0ó+t0ô+u0õ+v0ö,!,",#,$,%,&,',(,),*,+,,,-,.,/,0,1,2 ,3!,4",5#,6$,7%,8&,9',:(,;),<*,=+,>,,?-,@.,A/,Q0,R1,S2,T3,U4,V5,WQ,X6,Y7,Z8,[9,\:,];,^<,_=,`>,a?,b@,cA,dB,eC,fD,gE,hF,iG,jH,kI,lJ,mK,nL,oM,pN,qO0!¬0"¬0#¬0$¬0%¬0&¬ 0'¬ 0(¬0)¬0*¬0+¬0,¬0-¬0.¬0/¬00¬01¬02¬03¬04¬05¬ 06¬$07¬,08¬-09¬/0:¬00;¬10<¬80=¬90>¬<0?¬@0@¬K0A¬M0B¬T0C¬X0D¬\0E¬p0F¬q0G¬t0H¬w0I¬x0J¬z0K¬€0L¬0M¬ƒ0N¬„0O¬…0P¬†0Q¬‰0R¬Š0S¬‹0T¬Œ0U¬0V¬”0W¬œ0X¬0Y¬Ÿ0Z¬ 0[¬¡0\¬¨0]¬©0^¬ª0_¬¬0`¬¯0a¬°0b¬¸0c¬¹0d¬»0e¬¼0f¬½0g¬Á0h¬Ä0i¬È0j¬Ì0k¬Õ0l¬×0m¬à0n¬á0o¬ä0p¬ç0q¬è0r¬ê0s¬ì0t¬ï0u¬ð0v¬ñ0w¬ó0x¬õ0y¬ö0z¬ü0{¬ý0|­0}­0~­1!­ 1"­ 1#­1$­1%­1&­1'­ 1(­)1)­,1*­-1+­41,­51-­81.­<1/­D10­E11­G12­I13­P14­T15­X16­a17­c18­l19­m1:­p1;­s1<­t1=­u1>­v1?­{1@­|1A­}1B­1C­1D­‚1E­ˆ1F­‰1G­Œ1H­1I­œ1J­1K­¤1L­·1M­À1N­Á1O­Ä1P­È1Q­Ð1R­Ñ1S­Ó1T­Ü1U­à1V­ä1W­ø1X­ù1Y­ü1Z­ÿ1[®1\®1]®1^® 1_® 1`® 1a®1b®01c®11d®41e®71f®81g®:1h®@1i®A1j®C1k®E1l®F1m®J1n®L1o®M1p®N1q®P1r®T1s®V1t®\1u®]1v®_1w®`1x®a1y®e1z®h1{®i1|®l1}®p1~®x2!®y2"®{2#®|2$®}2%®„2&®…2'®Œ2(®¼2)®½2*®¾2+®À2,®Ä2-®Ì2.®Í2/®Ï20®Ð21®Ñ22®Ø23®Ù24®Ü25®è26®ë27®í28®ô29®ø2:®ü2;¯2<¯2=¯ 2>¯2?¯,2@¯-2A¯02B¯22C¯42D¯<2E¯=2F¯?2G¯A2H¯B2I¯C2J¯H2K¯I2L¯P2M¯\2N¯]2O¯d2P¯e2Q¯y2R¯€2S¯„2T¯ˆ2U¯2V¯‘2W¯•2X¯œ2Y¯¸2Z¯¹2[¯¼2\¯À2]¯Ç2^¯È2_¯É2`¯Ë2a¯Í2b¯Î2c¯Ô2d¯Ü2e¯è2f¯é2g¯ð2h¯ñ2i¯ô2j¯ø2k°2l°2m°2n° 2o°2p°2q°2r°2s°(2t°D2u°E2v°H2w°J2x°L2y°N2z°S2{°T2|°U2}°W2~°Y3!°]3"°|3#°}3$°€3%°„3&°Œ3'°3(°3)°‘3*°˜3+°™3,°š3-°œ3.°Ÿ3/° 30°¡31°¢32°¨33°©34°«35°¬36°­37°®38°¯39°±3:°³3;°´3<°µ3=°¸3>°¼3?°Ä3@°Å3A°Ç3B°È3C°É3D°Ð3E°Ñ3F°Ô3G°Ø3H°à3I°å3J±3K± 3L± 3M± 3N±3O±3P±3Q±3R±3S±3T±3U±3V±#3W±$3X±%3Y±(3Z±,3[±43\±53]±73^±83_±93`±@3a±A3b±D3c±H3d±P3e±Q3f±T3g±U3h±X3i±\3j±`3k±x3l±y3m±|3n±€3o±‚3p±ˆ3q±‰3r±‹3s±3t±’3u±“3v±”3w±˜3x±œ3y±¨3z±Ì3{±Ð3|±Ô3}±Ü3~±Ý4!±ß4"±è4#±é4$±ì4%±ð4&±ù4'±û4(±ý4)²4*²4+²4,² 4-² 4.²4/²40²41²42² 43²444²<45²X46²\47²`48²h49²i4:²t4;²u4<²|4=²„4>²…4?²‰4@²4A²‘4B²”4C²˜4D²™4E²š4F² 4G²¡4H²£4I²¥4J²¦4K²ª4L²¬4M²°4N²´4O²È4P²É4Q²Ì4R²Ð4S²Ò4T²Ø4U²Ù4V²Û4W²Ý4X²â4Y²ä4Z²å4[²æ4\²è4]²ë4^²ì4_²í4`²î4a²ï4b²ó4c²ô4d²õ4e²÷4f²ø4g²ù4h²ú4i²û4j²ÿ4k³4l³4m³4n³4o³4p³4q³4r³4s³4t³4u³T4v³U4w³V4x³X4y³[4z³\4{³^4|³_4}³d4~³e5!³g5"³i5#³k5$³n5%³p5&³q5'³t5(³x5)³€5*³5+³ƒ5,³„5-³…5.³Œ5/³50³”51³ 52³¡53³¨54³¬55³Ä56³Å57³È58³Ë59³Ì5:³Î5;³Ð5<³Ô5=³Õ5>³×5?³Ù5@³Û5A³Ý5B³à5C³ä5D³è5E³ü5F´5G´5H´5I´ 5J´(5K´)5L´+5M´45N´P5O´Q5P´T5Q´X5R´`5S´a5T´c5U´e5V´l5W´€5X´ˆ5Y´5Z´¤5[´¨5\´¬5]´µ5^´·5_´¹5`´À5a´Ä5b´È5c´Ð5d´Õ5e´Ü5f´Ý5g´à5h´ã5i´ä5j´æ5k´ì5l´í5m´ï5n´ñ5o´ø5pµ5qµ5rµ5sµ5tµ5uµ$5vµ%5wµ'5xµ(5yµ)5zµ*5{µ05|µ15}µ45~µ86!µ@6"µA6#µC6$µD6%µE6&µK6'µL6(µM6)µP6*µT6+µ\6,µ]6-µ_6.µ`6/µa60µ 61µ¡62µ¤63µ¨64µª65µ«66µ°67µ±68µ³69µ´6:µµ6;µ»6<µ¼6=µ½6>µÀ6?µÄ6@µÌ6AµÍ6BµÏ6CµÐ6DµÑ6EµØ6Fµì6G¶6H¶6I¶6J¶6K¶%6L¶,6M¶46N¶H6O¶d6P¶h6Q¶œ6R¶6S¶ 6T¶¤6U¶«6V¶¬6W¶±6X¶Ô6Y¶ð6Z¶ô6[¶ø6\·6]·6^·6_·(6`·)6a·,6b·/6c·06d·86e·96f·;6g·D6h·H6i·L6j·T6k·U6l·`6m·d6n·h6o·p6p·q6q·s6r·u6s·|6t·}6u·€6v·„6w·Œ6x·6y·6z·6{·‘6|·’6}·–6~·—7!·˜7"·™7#·œ7$· 7%·¨7&·©7'·«7(·¬7)·­7*·´7+·µ7,·¸7-·Ç7.·É7/·ì70·í71·ð72·ô73·ü74·ý75·ÿ76¸77¸78¸79¸7:¸ 7;¸ 7<¸7=¸7>¸7?¸7@¸7A¸$7B¸%7C¸(7D¸,7E¸47F¸57G¸77H¸87I¸97J¸@7K¸D7L¸Q7M¸S7N¸\7O¸]7P¸`7Q¸d7R¸l7S¸m7T¸o7U¸q7V¸x7W¸|7X¸7Y¸¨7Z¸°7[¸´7\¸¸7]¸À7^¸Á7_¸Ã7`¸Å7a¸Ì7b¸Ð7c¸Ô7d¸Ý7e¸ß7f¸á7g¸è7h¸é7i¸ì7j¸ð7k¸ø7l¸ù7m¸û7n¸ý7o¹7p¹7q¹ 7r¹<7s¹=7t¹@7u¹D7v¹L7w¹O7x¹Q7y¹X7z¹Y7{¹\7|¹`7}¹h7~¹i8!¹k8"¹m8#¹t8$¹u8%¹x8&¹|8'¹„8(¹…8)¹‡8*¹‰8+¹Š8,¹8-¹Ž8.¹¬8/¹­80¹°81¹´82¹¼83¹½84¹¿85¹Á86¹È87¹É88¹Ì89¹Î8:¹Ï8;¹Ð8<¹Ñ8=¹Ò8>¹Ø8?¹Ù8@¹Û8A¹Ý8B¹Þ8C¹á8D¹ã8E¹ä8F¹å8G¹è8H¹ì8I¹ô8J¹õ8K¹÷8L¹ø8M¹ù8N¹ú8Oº8Pº8Qº8Rº8Sº88Tº98Uº<8Vº@8WºB8XºH8YºI8ZºK8[ºM8\ºN8]ºS8^ºT8_ºU8`ºX8aº\8bºd8cºe8dºg8eºh8fºi8gºp8hºq8iºt8jºx8kºƒ8lº„8mº…8nº‡8oºŒ8pº¨8qº©8rº«8sº¬8tº°8uº²8vº¸8wº¹8xº»8yº½8zºÄ8{ºÈ8|ºØ8}ºÙ8~ºü9!»9"»9#» 9$»9%»9&»9'»9(» 9)»)9*»+9+»49,»59-»69.»89/»;90»<91»=92»>93»D94»E95»G96»I97»M98»O99»P9:»T9;»X9<»a9=»c9>»l9?»ˆ9@»Œ9A»9B»¤9C»¨9D»¬9E»´9F»·9G»À9H»Ä9I»È9J»Ð9K»Ó9L»ø9M»ù9N»ü9O»ÿ9P¼9Q¼9R¼9S¼ 9T¼ 9U¼ 9V¼ 9W¼9X¼9Y¼9Z¼9[¼9\¼9]¼9^¼9_¼9`¼9a¼9b¼9c¼$9d¼%9e¼'9f¼)9g¼-9h¼09i¼19j¼49k¼89l¼@9m¼A9n¼C9o¼D9p¼E9q¼I9r¼L9s¼M9t¼P9u¼]9v¼„9w¼…9x¼ˆ9y¼‹9z¼Œ9{¼Ž9|¼”9}¼•9~¼—:!¼™:"¼š:#¼ :$¼¡:%¼¤:&¼§:'¼¨:(¼°:)¼±:*¼³:+¼´:,¼µ:-¼¼:.¼½:/¼À:0¼Ä:1¼Í:2¼Ï:3¼Ð:4¼Ñ:5¼Õ:6¼Ø:7¼Ü:8¼ô:9¼õ::¼ö:;¼ø:<¼ü:=½:>½:?½:@½ :A½:B½:C½$:D½,:E½@:F½H:G½I:H½L:I½P:J½X:K½Y:L½d:M½h:N½€:O½:P½„:Q½‡:R½ˆ:S½‰:T½Š:U½:V½‘:W½“:X½•:Y½™:Z½š:[½œ:\½¤:]½°:^½¸:_½Ô:`½Õ:a½Ø:b½Ü:c½é:d½ð:e½ô:f½ø:g¾:h¾:i¾:j¾ :k¾ :l¾:m¾:n¾:o¾:p¾:q¾D:r¾E:s¾H:t¾L:u¾N:v¾T:w¾U:x¾W:y¾Y:z¾Z:{¾[:|¾`:}¾a:~¾d;!¾h;"¾j;#¾p;$¾q;%¾s;&¾t;'¾u;(¾{;)¾|;*¾};+¾€;,¾„;-¾Œ;.¾;/¾;0¾;1¾‘;2¾˜;3¾™;4¾¨;5¾Ð;6¾Ñ;7¾Ô;8¾×;9¾Ø;:¾à;;¾ã;<¾ä;=¾å;>¾ì;?¿;@¿;A¿ ;B¿;C¿;D¿;E¿;F¿;G¿@;H¿A;I¿D;J¿H;K¿P;L¿Q;M¿U;N¿”;O¿°;P¿Å;Q¿Ì;R¿Í;S¿Ð;T¿Ô;U¿Ü;V¿ß;W¿á;XÀ<;YÀQ;ZÀX;[À\;\À`;]Àh;^Ài;_À;`À‘;aÀ”;bÀ˜;cÀ ;dÀ¡;eÀ£;fÀ¥;gÀ¬;hÀ­;iÀ¯;jÀ°;kÀ³;lÀ´;mÀµ;nÀ¶;oÀ¼;pÀ½;qÀ¿;rÀÀ;sÀÁ;tÀÅ;uÀÈ;vÀÉ;wÀÌ;xÀÐ;yÀØ;zÀÙ;{ÀÛ;|ÀÜ;}ÀÝ;~ÀäÁ<­=?´=@µ=A·=B¹=CÂÜ=DÂÝ=EÂà=FÂã=GÂä=HÂë=IÂì=JÂí=KÂï=LÂñ=MÂö=NÂø=OÂù=PÂû=QÂü=RÃ=SÃ=Tà =Uà =Và =WÃ=XÃ=YÃ=ZÃ=[Ã=\Ã$=]Ã%=^Ã(=_Ã)=`ÃE=aÃh=bÃi=cÃl=dÃp=eÃr=fÃx=gÃy=hÃ|=iÃ}=jÄ=kÈ=lÃŒ=mÃÀ=nÃØ=oÃÙ=pÃÜ=qÃß=rÃà=sÃâ=tÃè=uÃé=vÃí=wÃô=xÃõ=yÃø=zÄ={Ä=|Ä$=}Ä,=~Ä0>!Ä4>"Ä<>#Ä=>$ÄH>%Äd>&Äe>'Äh>(Äl>)Ät>*Äu>+Äy>,Ä€>-Ä”>.Äœ>/ĸ>0ļ>1Äé>2Äð>3Äñ>4Äô>5Äø>6Äú>7Äÿ>8Å>9Å>:Å >;Å><Å>=Å>>Å(>?Å)>@Å,>AÅ0>BÅ8>CÅ9>DÅ;>EÅ=>FÅD>GÅE>HÅH>IÅI>JÅJ>KÅL>LÅM>MÅN>NÅS>OÅT>PÅU>QÅW>RÅX>SÅY>TÅ]>UÅ^>VÅ`>WÅa>XÅd>YÅh>ZÅp>[Åq>\Ås>]Åt>^Åu>_Å|>`Å}>aÅ€>bÅ„>cŇ>dÅŒ>eÅ>fÅ>gÅ‘>hÅ•>iÅ—>jŘ>kÅœ>lÅ >mÅ©>nÅ´>oŵ>pŸ>qŹ>rÅ»>sż>tŽ>už>vÅÄ>wÅÅ>xÅÆ>yÅÇ>zÅÈ>{ÅÉ>|ÅÊ>}ÅÌ>~ÅÎ?!ÅÐ?"ÅÑ?#ÅÔ?$ÅØ?%Åà?&Åá?'Åã?(Åå?)Åì?*Åí?+Åî?,Åð?-Åô?.Åö?/Å÷?0Åü?1Åý?2Åþ?3Åÿ?4Æ?5Æ?6Æ?7Æ?8Æ?9Æ?:Æ ?;Æ?<Æ?=Æ?>Æ??Æ?@Æ$?AÆ%?BÆ(?CÆ,?DÆ-?EÆ.?FÆ0?GÆ3?HÆ4?IÆ5?JÆ7?KÆ9?LÆ;?MÆ@?NÆA?OÆD?PÆH?QÆP?RÆQ?SÆS?TÆT?UÆU?VÆ\?WÆ]?XÆ`?YÆl?ZÆo?[Æq?\Æx?]Æy?^Æ|?_Æ€?`ƈ?aƉ?bÆ‹?cÆ?dÆ”?eÆ•?fƘ?gÆœ?hƤ?iÆ¥?jƧ?kÆ©?lư?mƱ?nÆ´?oƸ?pƹ?qƺ?rÆÀ?sÆÁ?tÆÃ?uÆÅ?vÆÌ?wÆÍ?xÆÐ?yÆÔ?zÆÜ?{ÆÝ?|Æà?}Æá?~Æè@!Æé@"Æì@#Æð@$Æø@%Æù@&Æý@'Ç@(Ç@)Ç@*Ç @+Ç@,Ç@-Ç@.Ç@/Ç @0Ç!@1Ç$@2Ç(@3Ç0@4Ç1@5Ç3@6Ç5@7Ç7@8Ç<@9Ç=@:Ç@@;ÇD@<ÇJ@=ÇL@>ÇM@?ÇO@@ÇQ@AÇR@BÇS@CÇT@DÇU@EÇV@FÇW@GÇX@HÇ\@IÇ`@JÇh@KÇk@LÇt@MÇu@NÇx@OÇ|@PÇ}@QÇ~@Rǃ@SÇ„@TÇ…@ULJ@VLj@Wlj@XÇŠ@YÇŽ@ZÇ@[Ç‘@\Ç”@]Ç–@^Ç—@_ǘ@`Çš@aÇ @bÇ¡@cÇ£@dǤ@eÇ¥@fǦ@gǬ@hÇ­@iǰ@jÇ´@kǼ@lǽ@mÇ¿@nÇÀ@oÇÁ@pÇÈ@qÇÉ@rÇÌ@sÇÎ@tÇÐ@uÇØ@vÇÝ@wÇä@xÇè@yÇì@zÈ@{È@|È@}È@~È A!ÈA"ÈA#ÈA$ÈA%ÈA&ÈA'ÈA(È A)È$A*È,A+È-A,È/A-È1A.È8A/ÈÈ…A?ȆA@ȇAAÈ‹ABÈŒACÈADÈ”AEÈAFÈŸAGÈ¡AHȨAIȼAJȽAKÈÄALÈÈAMÈÌANÈÔAOÈÕAPÈ×AQÈÙARÈàASÈáATÈäAUÈõAVÈüAWÈýAXÉAYÉAZÉA[ÉA\É A]É A^ÉA_ÉA`ÉAaÉ,AbÉ4AcÉPAdÉQAeÉTAfÉXAgÉ`AhÉaAiÉcAjÉlAkÉpAlÉtAmÉ|AnɈAoɉApÉŒAqÉArɘAsÉ™AtÉ›AuÉAvÉÀAwÉÁAxÉÄAyÉÇAzÉÈA{ÉÊA|ÉÐA}ÉÑA~ÉÓB!ÉÕB"ÉÖB#ÉÙB$ÉÚB%ÉÜB&ÉÝB'ÉàB(ÉâB)ÉäB*ÉçB+ÉìB,ÉíB-ÉïB.ÉðB/ÉñB0ÉøB1ÉùB2ÉüB3ÊB4ÊB5Ê B6Ê B7Ê B8Ê B9ÊB:ÊB;Ê)B<ÊLB=ÊMB>ÊPB?ÊTB@Ê\BAÊ]BBÊ_BCÊ`BDÊaBEÊhBFÊ}BGÊ„BHʘBIʼBJʽBKÊÀBLÊÄBMÊÌBNÊÍBOÊÏBPÊÑBQÊÓBRÊØBSÊÙBTÊàBUÊìBVÊôBWËBXËBYËBZËB[Ë B\Ë!B]ËAB^ËHB_ËIB`ËLBaËPBbËXBcËYBdË]BeËdBfËxBgËyBhËœBi˸BjËÔBkËäBlËçBmËéBnÌ BoÌ BpÌBqÌBrÌBsÌBtÌ!BuÌ"BvÌ'BwÌ(BxÌ)ByÌ,BzÌ.B{Ì0B|Ì8B}Ì9B~Ì;C!ÌC$ÌDC%ÌEC&ÌHC'ÌLC(ÌTC)ÌUC*ÌWC+ÌXC,ÌYC-Ì`C.ÌdC/ÌfC0ÌhC1ÌpC2ÌuC3̘C4Ì™C5ÌœC6Ì C7̨C8Ì©C9Ì«C:̬C;Ì­C<Ì´C=̵C≯C?̼C@ÌÄCAÌÅCBÌÇCCÌÉCDÌÐCEÌÔCFÌäCGÌìCHÌðCIÍCJÍCKÍ CLÍ CMÍCNÍCOÍCPÍCQÍCRÍ$CSÍ(CTÍ,CUÍ9CVÍ\CWÍ`CXÍdCYÍlCZÍmC[ÍoC\ÍqC]ÍxC^͈C_Í”C`Í•Ca͘CbÍœCcͤCdÍ¥CeͧCfÍ©CgͰChÍÄCiÍÌCjÍÐCkÍèClÍìCmÍðCnÍøCoÍùCpÍûCqÍýCrÎCsÎCtÎ CuÎCvÎCwÎ CxÎ!CyÎ$CzÎ(C{Î0C|Î1C}Î3C~Î5D!ÎXD"ÎYD#Î\D$Î_D%Î`D&ÎaD'ÎhD(ÎiD)ÎkD*ÎmD+ÎtD,ÎuD-ÎxD.Î|D/΄D0Î…D1·D2ΉD3ÎD4ΑD5ΔD6ΘD7ΠD8ΡD9ΣD:ΤD;Î¥D<άD=έD>ÎÁD?ÎäD@ÎåDAÎèDBÎëDCÎìDDÎôDEÎõDFÎ÷DGÎøDHÎùDIÏDJÏDKÏDLÏDMÏDNÏDOÏDPÏDQÏDRÏ DSÏ$DTÏ,DUÏ-DVÏ/DWÏ0DXÏ1DYÏ8DZÏTD[ÏUD\ÏXD]Ï\D^ÏdD_ÏeD`ÏgDaÏiDbÏpDcÏqDdÏtDeÏxDfÏ€DgÏ…DhÏŒDiÏ¡DjϨDkϰDlÏÄDmÏàDnÏáDoÏäDpÏèDqÏðDrÏñDsÏóDtÏõDuÏüDvÐDwÐDxÐDyÐDzÐ-D{Ð4D|Ð5D}Ð8D~ÐÐÑE?ÐÓE@ÐÔEAÐÕEBÐÜECÐÝEDÐàEEÐäEFÐìEGÐíEHÐïEIÐðEJÐñEKÐøELÑ EMÑ0ENÑ1EOÑ4EPÑ8EQÑ:ERÑ@ESÑAETÑCEUÑDEVÑEEWÑLEXÑMEYÑPEZÑTE[Ñ\E\Ñ]E]Ñ_E^ÑaE_ÑhE`ÑlEaÑ|EbÑ„EcшEdÑ EeÑ¡EfѤEgѨEhѰEiѱEjѳEkѵElѺEmѼEnÑÀEoÑØEpÑôEqÑøErÒEsÒ EtÒEuÒ,EvÒ-EwÒ0ExÒ4EyÒÒôF?ÒøF@ÓFAÓFBÓFCÓFDÓ FEÓ FFÓFGÓFHÓFIÓFJÓFKÓFLÓFMÓ FNÓ!FOÓ%FPÓ(FQÓ)FRÓ,FSÓ0FTÓ8FUÓ9FVÓ;FWÓÔøG?ÔûG@ÔýGAÕGBÕGCÕ GDÕGEÕGFÕGGÕÖ¡H?Ö¨H@Ö¬HAÖ°HBÖ¹HCÖ»HDÖÄHEÖÅHFÖÈHGÖÌHHÖÑHIÖÔHJÖ×HKÖÙHLÖàHMÖäHNÖèHOÖðHPÖõHQÖüHRÖýHS×HT×HU×HV×HW×HX×HY× HZ×(H[×)H\×+H]×-H^×4H_×5H`×8Ha×R;J?StJ@TJA`jJBadJCk¼JDsÏJEJF‰ºJG‰ÒJH•£JIOƒJJR JKX¾JLYxJMYæJN^rJO^yJPaÇJQcÀJRgFJSgìJThJUo—JVvNJWw JXxõJYzJZzÿJ[|!J\€J]‚nJ^‚qJ_ŠëJ`•“JaNkJbUJcf÷Jdn4Jex£JfzíJg„[Jh‰Ji‡NJj—¨JkRØJlWNJmX*Jn]LJoaJpa¾Jqb!JrebJsgÑJtjDJunJvuJwu³JxvãJyw°Jz}:J{¯J|”QJ}”RJ~Ÿ•K!S#K"\¬K#u2K$€ÛK%’@K&•˜K'R[K(XK)YÜK*\¡K+]K,^·K-_:K._JK/awK0l_K1uzK2u†K3|àK4}sK5}±K6ŒK7TK8‚!K9…‘K:‰AK;‹K<’üK=–MK>œGK?NËK@N÷KAP KBQñKCXOKDa7KEa>KFahKGe9KHiêKIoKJu¥KKv†KLvÖKM{‡KN‚¥KO„ËKPùKQ“§KR•‹KSU€KT[¢KUWQKVùKW|³KX¹KY‘µKZP(K[S»K\\EK]]èK^bÒK_cnK`dÚKadçKbn Kcp¬Kdy[KeÝKfŽKgùKh}Ki’EKj’øKkN~KlNöKmPeKn]þKo^úKpaKqiWKrqKs†TKtŽGKu“uKvš+KwN^KxP‘KygpKzh@K{Q K|RK}R’K~j¢L!w¼L"’L#žÔL$R«L%`/L&òL'PHL(a©L)cíL*dÊL+hoTL?}PL@:LAŠ#LBQ|LCaJLD{LE‹LF’WLG“ŒLHN¬LIOÓLJPLKP¾LLQLMRÁLNRÍLOSLPWpLQXƒLR^šLS_‘LTavLUa¬LVdÎLWelLXfoLYf»LZfôL[h—L\m‡L]p…L^pñL_tŸL`t¥LatÊLbuÙLcxlLdxìLezßLfzöLg}ELh}“Li€Lj€?LkLlƒ–Lm‹fLnLoLp“áLq˜Lr˜8LsšZLt›èLuOÂLvUSLwX:LxYQLy[cLz\FL{`¸L|bL}hBL~h°M!hèM"nªM#uLM$vxM%xÎM&z=M'|ûM(~kM)~|M*ŠM+Š¡M,Œ?M-–ŽM.ÄM/SäM0SéM1TJM2TqM3VúM4YÑM5[dM6\;M7^«M8b÷M9e7M:eEM;erMiÁM?l½M@uüMAvMBw~MCz?MD”ME€MF€¡MGMH‚æMI‚ýMJƒðMK…ÁMLˆ1MMˆ´MNŠ¥MOùMPœMQ“.MR–ÇMS˜gMTšØMUŸMVTíMWe›MXfòMYhMZz@M[Œ7M\`M]VðM^WdM_]M`fMah±MbhÍMcnþMdt(MeˆžMf›äMglhMhùMiš¨MjO›MkQlMlQqMmRŸMn[TMo]åMp`PMq`mMrbñMsc§Mte;MusÙMvzzMw†£MxŒ¢My—MzN2M{[áM|bM}gœM~tÜN!yÑN"ƒÓN#ЇN$вN%èN&NN'“KN(˜FN)^ÓN*ièN+…ÿN,íN-ùN.Q N/[˜N0[ìN1acN2húN3k>N4pLN5t/N6tØN7{¡N8PN9ƒÅN:‰ÀN;Œ«N<•ÜN=™(N>R.N?`]N@bìNANBOŠNCQINDS!NEXÙNF^ãNGfàNHm8NIpšNJrÂNKsÖNL{PNM€ñNN”[NOSfNPc›NQkNRNVNSP€NTXJNUXÞNV`*NWa'NXbÐNYiÐNZ›AN[[N\}N]€±N^_N_N¤N`PÑNaT¬NbU¬Nc[ Nd] Ne]çNfe*NgeNNhh!NijKNjráNkvŽNlwïNm}^NnùNo Np…NNq†ßNrNsNNtÊNu™NvšUNw›«NxNNyNENzN]N{NÇN|OñN}QwN~RþO!S@O"SãO#SåO$TŽO%VO&WuO'W¢O([ÇO)]‡O*^ÐO+aüO,bØO-eQO.g¸O/géO0iËO1kPO2kÆO3kìO4lBO5nO6pxO7r×O8s–O9tO:w¿O;wéO€ O?üO@‚OA‚ OB‚ßOCˆbOD‹3OEŒüOFŽÀOGOH±OI’dOJ’¶OK™ÒOLšEOMœéON×OOŸœOPW OQ\@ORƒÊOS— OT—«OUž´OVTOWz˜OX¤OYˆÙOZŽÍO[áO\XO]\HO^c˜O_zŸO`[®Oa_ObzyOcz®Od‚ŽOeެOfP&OgR8OhRøOiSwOjWOkbóOlcrOmk OnmÃOow7OpS¥OqsWOr…hOsŽvOt•ÕOug:OvjÃOwopOxŠmOyŽÌOz™KO{ùO|fwO}kxO~Œ´P!›hØP?iuP@–™PAPÅPBR¤PCRäPDaÃPEe¤PFh9PGiÿPHt~PI{KPJ‚¹PKƒëPL‰²PM‹9PNÑPO™IPPù PQNÊPRY—PSdÒPTfPUjŽPVt4PWyPXy½PY‚©PZˆ~P[ˆP\‰_P]ù P^“&P_O P`SÊPa`%PbbqPclrPd}Pe}fPfN˜PgQbPhwÜPi€¯PjOPkOPlQvPmQ€PnUÜPoVhPpW;PqWúPrWüPsYPtYGPuY“Pv[ÄPw\Px]Py]ñPz^~P{_ÌP|b€P}e×P~eãQ!gQ"gQ#g^Q$hËQ%hÄQ&j_Q'k:Q(l#Q)l}Q*l‚Q+mÇQ,s˜Q-t&Q.t*Q/t‚Q0t£Q1uxQ2uQ3xQ4xïQ5yAQ6yGQ7yHQ8yzQ9{•Q:}Q;}ºQ<ˆQ=€Q>€-Q?€ŒQ@ŠQA‹OQBŒHQCwQD“!QE“$QF˜âQG™QQHšQIšQJšeQKž’QL}ÊQMOvQNT QObîQPhTQQ‘ÑQRU«QSQ:QTù QUù QVZQWaæQXù QYbÏQZbÿQ[ùQ\ùQ]ùQ^ùQ_ùQ`ùQa£QbùQcùQdùQeùQfùQgŠþQhùQiùQjùQkùQlf–QmùQnqVQoùQpùQq–ãQrù QscOQtczQuSWQvù!QwgQxi`QynsQzù"Q{u7Q|ù#Q}ù$Q~ù%R!} R"ù&R#ù'R$ˆrR%VÊR&ZR'ù(R(ù)R)ù*R*ù+R+ù,R,NCR-ù-R.QgR/YHR0gðR1€R2ù.R3YsR4^tR5dšR6yÊR7_õR8`lR9bÈR:c{R;[çR<[×R=RªR>ù/R?YtR@_)RA`RBù0RCù1RDù2REtYRFù3RGù4RHù5RIù6RJù7RKù8RL™ÑRMù9RNù:ROù;RPùRSù?RTù@RUùARVùBRWùCRXoÃRYùDRZùER[¿R\²R]`ñR^ùFR_ùGR`fRaùHRbùIRc\?RdùJReùKRfùLRgùMRhùNRiùORjùPRkùQRlZéRmŠ%Rng{Ro}RpùRRqùSRrùTRsùURtùVRuùWRv€ýRwùXRxùYRy\fÇS?máS@n[SAomSBo¹SCuðSD€CSE½SF…ASG‰ƒSHŠÇSI‹ZSJ“SKl“SLuSSM{TSNŽSO]SPUSQXSRXXSS^bSTbSUdžSVhàSWuvSX|ÖSY‡³SZžèS[NãS\WˆS]WnS^Y'S_\ S`\±Sa^6Sb_…Scb4SddáSes³SfúSgˆ‹ShŒ¸Si–ŠSjžÛSk[…Sl_·Sm`³SnPSoRSpR0SqWSrX5SsXWSt\Su\`Sv\öSw]‹Sx^¦Sy_’Sz`¼S{cS|c‰S}dS~hCT!hùT"jÂT#mØT$n!T%nÔT&oäT'qþT(vÜT)wyT*y±T+z;T,„T-‰©T.ŒíT/óT0ŽHT1T2T3ST4ýT5“MT6–vT7—ÜT8kÒT9pT:rXT;r¢Ty¿T?{äT@~›TA‹€TBX©TC`ÇTDefTEeýTFf¾TGlŒTHqTIqÉTJŒZTK˜TLNmTMzTNNÝTOQ¬TPQÍTQRÕTRT TSa§TTgqTUhPTVhßTWmTXo|TYu¼TZw³T[zåT\€ôT]„cT^’…T_Q\T`e—Tag\Tbg“TcuØTdzÇTeƒsTfùZTgŒFThTi˜-Tj\oTkÀTl‚šTmATnoTo’ Tp_—Tq]TrjYTsqÈTtv{Tu{ITv…äTw‹Tx‘'Tyš0TzU‡T{aöT|ù[T}viT~…U!†?U"‡ºU#ˆøU$U%ù\U&mU'pÙU(sÞU)}aU*„=U+ù]U,‘jU-™ñU.ù^U/N‚U0SuU1kU2kU3p>U4rU5†-U6žU7RLU8£U9]PU:dåU;e,U|CU?~œU@…ÍUA‰dUB‰½UCbÉUDØUEˆUF^ÊUGgUHmjUIrüUJtUKtoUL‡‚UMÞUNO†UO] UP_ UQ„ URQ·USc UTueUUN®UVPUWQiUXQÉUYhUZjU[|®U\|±U]|çU^‚oU_ŠÒU`Ua‘ÏUbO¶UcQ7UdRõUeTBUf^ìUganUhb>UieÅUjjÚUkoþUly*Um…ÜUnˆ#Uo•­UpšbUqšjUrž—UsžÎUtR›UufÆUvkwUwpUxy+UybUz—BU{aU|bU}e#U~o#V!qIV"t‰V#}ôV$€oV%„îV&&V'#V(“JV)Q½V*RV+R£V,m V-pÈV.ˆÂV/^ÉV0e‚V1k®V2oÂV3|>V4suV5NäV6O6V7VùV8ù_V9\ºV:]ºV;`VšV?ÎV@€FVAVB’4VC–öVD—HVE˜VFŸaVGO‹VHo§VIy®VJ‘´VK–·VLRÞVMù`VNdˆVOdÄVPjÓVQo^VRpVSrVTvçVU€VV†VW†\VXïVYVZ—2V[›oV\úV]žuV^xŒV_yV`} VaƒÉVb“VcžVdž“VeŠÖVfXßVg_Vhg'Vip'VjtÏVk|`Vl€~VmQ!Vnp(VorbVpxÊVqŒÂVrŒÚVsŒôVt–÷VuN†VvPÚVw[îVx^ÖVye™VzqÎV{vBV|w­V}€JV~„üW!|W"›'W#ŸW$XØW%ZAW&\bW'jW(mÚW)oW*v;W+}/W,~7W-…W.‰8W/“äW0–KW1R‰W2eÒW3góW4i´W5mAW6nœW7pW8t W9t`W:uYW;v$W˜^W?QmW@b.WA–xWBO–WCP+WD]WEmêWF}¸WG*WH_‹WIaDWJhWKùaWL–†WMRÒWN€‹WOQÜWPQÌWQi^WRzWS}¾WTƒñWU–uWVOÚWWR)WXS˜WYTWZUW[\eW\`§W]gNW^h¨W_mlW`rWarøWbtWctƒWdùbWeuâWf|lWgyWh¸Wiƒ‰WjˆÏWkˆáWl‘ÌWm‘ÐWn–âWo›ÉWpTWqo~WrqÐWst˜Wt…úWuŽªWv–£WwœWWxžŸWyg—WzmËW{t3W|èW}—W~x,X!zËX"{ X#|’X$diX%tjX&uòX'x¼X(xèX)™¬X*›TX+ž»X,[ÞX-^UX.o X/œX0ƒ«X1ˆX2NX3SMX4Z)X5]ÒX6_NX7abX8c=X9fiX:füX;nÿXwžX?„,X@…XAˆ;XBXC™EXDœ;XEUXFb¹XGg+XHl«XIƒ XJ‰jXK—zXLN¡XMY„XN_ØXO_ÙXPgXQ}²XRTXS‚’XTƒ+XUƒ½XVXW™XXWËXYY¹XZZ’X[[ÐX\f'X]gšX^h…X_kÏX`qdXauXbŒ·XcŒãXdXe›EXfXgŒŠXh–LXiš@Xjž¥Xk[_XllXmsXnvòXovßXp„ XqQªXr‰“XsQMXtQ•XuRÉXvhÉXwl”XxwXyw Xz}¿X{}ìX|—bX}žµX~nÅY!…Y"Q¥Y#T Y$T}Y%fY&fY'i'Y(nŸY)v¿Y*w‘Y+ƒY,„ÂY-‡ŸY.‘iY/’˜Y0œôY1ˆ‚Y2O®Y3Q’Y4RßY5YÆY6^=Y7aUY8dxY9dyY:f®Y;gÐYkÛY?r_Y@raYAtAYBw8YCwÛYD€YE‚¼YFƒYG‹YH‹(YIŒŒYJg(YKlYLrgYMvîYNwfYOzFYP©YQkYRl’YSY"YTg&YU„™YVSoYWX“YXY™YY^ßYZcÏY[f4Y\gsY]n:Y^s+Y_z×Y`‚×Ya“(YbRÙYc]ëYda®YeaËYfb YgbÇYhd«YieàYjiYYkkfYlkËYmq!Yns÷You]Yp~FYq‚YrƒYs…jYtŠ£YuŒ¿Yv—'YwaYxX¨YyžØYzPY{RY|T;Y}UOY~e‡Z!lvZ"} Z#} Z$€^Z%†ŠZ&•€Z'–ïZ(RÿZ)l•Z*riZ+TsZ,ZšZ-\>Z.]KZ/_LZ0_®Z1g*Z2h¶Z3icZ4n\·Z?`¶Z@a ZAa«ZBeOZCeûZDeüZElZFlïZGsŸZHsÉZI}áZJ•”ZK[ÆZL‡ZM‹ZNR]ZOSZZPbÍZQdZRd²ZSg4ZTj8ZUlÊZVsÀZWtžZX{”ZY|•ZZ~Z[ŠZ\‚6Z]…„Z^ëZ_–ùZ`™ÁZaO4ZbSJZcSÍZdSÛZebÌZfd,ZgeZhe‘ZiiÃZjlîZkoXZlsíZmuTZnv"ZoväZpvüZqxÐZrxûZsy,Zt}FZu‚,Zv‡àZwÔZx˜Zy˜ïZzRÃZ{bÔZ|d¥Z}n$Z~oQ[!v|["Ë[#‘±[$’b[%šî[&›C['P#[(P[)WJ[*Y¨[+\([,^G[-_w[.b?[/e>[0e¹[1eÁ[2f [3g‹[4iœ[5nÂ[6xÅ[7}![8€ª[9€[:‚+[;‚³[<„¡[=†Œ[>Š*[?‹[@¦[A–2[BŸ[CP [DOó[Eùc[FWù[G_˜[HbÜ[Ic’[Jgo[KnC[Lq[MvÃ[N€Ì[O€Ú[Pˆô[Qˆõ[R‰[SŒà[T)[U‘M[V–j[WO/[XOp[Y^gÏ[[h"[\v}[]v~[^›D[_^a[`j [aqi[bqÔ[cuj[dùd[e~A[f…C[g…é[h˜Ü[iO[j{O[kp[l•¥[mQá[n^[ohµ[pl>[qlN[rlÛ[sr¯[t{Ä[uƒ[vlÕ[wt:[xPû[yRˆ[zXÁ[{dØ[|j—[}t§[~vV\!x§\"†\#•â\$—9\%ùe\&S^\'_\(‹Š\)¨\*¯\+Š\,R%\-w¥\.œI\/Ÿ\0N\1P\2Qu\3\[\4^w\5f\6f:\7gÄ\8hÅ\9p³\:u\;uÅ\'\?™ \@š\AOÝ\BX!\CX1\D[ö\Efn\Fke\Gm\Hnz\Io}\Jsä\Ku+\Lƒé\MˆÜ\N‰\O‹\\P\QO\RPÕ\SS\TS\\U[“\V_©\Wg \Xy\Yy\Zƒ/\[…\\‰\]‰†\^9\_;\`™¥\aœ\bg,\cNv\dOø\eYI\f\\g\ï\h\ð\icg\jhÒ\kpý\lq¢\mt+\n~+\o„ì\p‡\q"\r’Ò\sœó\tN \uNØ\vOï\wP…\xRV\yRo\zT&\{T\|Wà\}Y+\~Zf]![Z]"[u]#[Ì]$^œ]%ùf]&bv]'ew](e§])mn]*n¥]+r6],{&]-|?].6]/P]0Q]1š]2‚@]3‚™]4ƒ©]5Š]6Œ ]7Œæ]8Œû]9t]:º];è]<‘Ü]=–]>–D]?™Ù]@œç]AS]BR]CT)]DVt]EX³]FYT]GYn]H_ÿ]Ia¤]Jbn]Kf]Ll~]Mq]NvÆ]O|‰]P|Þ]Q}]R‚¬]SŒÁ]T–ð]Uùg]VO[]W_]X_]YbÂ]Z])][g ]\hÚ]]x|]^~C]_l]`N]aP™]bS]cS*]dSQ]eYƒ]fZb]g^‡]h`²]iaŠ]jbI]kby]le]mg‡]ni§]okÔ]pkÖ]qk×]rkØ]sl¸]tùh]ut5]vuú]wx]xx‘]yyÕ]zyØ]{|ƒ]|}Ë]}á]~€¥^!>^"Â^#ƒò^$‡^%ˆè^&й^'‹l^(Œ»^)‘^*—^^+˜Û^,Ÿ;^-V¬^.[*^/_l^0eŒ^1j³^2k¯^3m\^4oñ^5p^6r]^7s­^8Œ§^9ŒÓ^:˜;^;a‘^š^?NM^@N‹^AN›^BNÕ^CO:^DO<^EO^FOß^GPÿ^HSò^ISø^JU^KUã^LVÛ^MXë^NYb^OZ^P[ë^Q[ú^R\^S]ó^T^+^U_™^V`^Wch^Xeœ^Ye¯^Zgö^[gû^\h­^]k{^^l™^_l×^`n#^ap ^bsE^cx^dy>^ey@^fy`^gyÁ^h{é^i}^j}r^k€†^l‚ ^mƒŽ^n„Ñ^o†Ç^pˆß^qŠP^rŠ^^s‹^tŒÜ^uf^v­^wª^x˜ü^y™ß^zž^{RJ^|ùi^}g^~ùj_!P˜_"R*_#\q_$ec_%lU_&sÊ_'u#_(u_){—_*„œ_+‘x_,—0_-Nw_.d’_/kº_0q^_1…©_2N _3ùk_4gI_5hî_6n_7‚Ÿ_8…_9ˆk_:c÷_;o_<’_=˜¯_>N _?P·_@PÏ_AQ_BUF_CUª_DV_E[@_F\_G\à_H^8_I^Š_J^ _K^Â_L`ó_MhQ_Nja_OnX_Pr=_Qr@_RrÀ_Svø_Tye_U{±_VÔ_Wˆó_X‰ô_YŠs_ZŒa_[ŒÞ_\—_]X^_^t½__Œý_`UÇ_aùl_bza_c}"_d‚r_err_fu_gu%_hùm_i{_jX…_kXû_l]¼_m^_n^¶_o__p`U_qb’_rc_seM_tf‘_ufÙ_vfø_wh_xhò_yr€_zt^_{{n_|}n_}}Ö_~r`!€å`"‚`#…¯`$‰`%Š“`&`'’ä`(žÍ`)Ÿ `*Y`+Ym`,^-`-`Ü`.f`/fs`0g`1lP`2mÅ`3o_`4wó`5x©`6„Æ`7‘Ë`8“+`9NÙ`:PÊ`;QH`[£`?bG`@e~`AeË`Bn2`Cq}`Dt`EtD`Ft‡`Gt¿`Hvl`Iyª`J}Ú`K~U`L¨`Mz`N³`O‚9`P†`Q‡ì`RŠu`Sã`Tx`U’‘`V”%`W™M`X›®`YSh`Z\Q`[iT`\lÄ`]m)`^n+`_‚ ``…›`a‰;`bŠ-`cŠª`d–ê`eŸg`fRa`gf¹`hk²`i~–`j‡þ`k `l•ƒ`m–]`ne`om‰`pqî`qùn`rWÎ`sYÓ`t[¬`u`'`v`ú`wb`xf`yf_`zs)`{sù`|vÛ`}w`~{la!€Va"€ra#ea$Š a%‘’a&Na'Râa(kra)ma*za+{9a,}0a-ùoa.Œ°a/Sìa0V/a1XQa2[µa3\a4\a5]âa6b@a7cƒa8da9f-a:h³a;l¼apa?p¤a@qÒaAu&aBuaCuŽaDvaE{aF{àaG|+aH} aI}9aJ…,aK…maL†aMŠ4aN aOaaPµaQ’·aR—öaSš7aTO×aU\laVg_aWm‘aX|ŸaY~ŒaZ‹a[a\a][ka^]ýa_d a`„Àaa\ab˜áacs‡ad[‹ae`šafg~agmÞahŠaiЦajak˜ alR7amùpanpQaoxŽap“–aqˆpar‘×asOîatS×auUýavVÚawW‚axXýayZÂaz[ˆa{\«a|\Àa}^%a~ab!b b"bKb#cˆb$db%e6b&exb'j9b(kŠb)l4b*mb+o1b,qçb-réb.sxb/tb0t²b1v&b2wab3yÀb4zWb5zêb6|¹b7}b8}¬b9~ab:žb;)b<ƒ1b=„b>„Úb?…êb@ˆ–bAаbB‹bC8bDBbEƒbF‘lbG’–bH’¹bI–‹bJ–§bK–¨bL–ÖbM—bN˜bO™–bPšÓbQ›bRSÔbSX~bTYbU[pbV[¿bWmÑbXoZbYqŸbZt!b[t¹b\€…b]ƒýb^]áb__‡b`_ªba`BbbeìbchbdiobejSbfk‰bgm5bhmóbisãbjvþbkw¬bl{Mbm}bn#bo‚bpƒ@bq„ôbr…cbsŠbbtŠÄbu‘‡bv“bw˜bx™´byb bzˆSb{ðb|’eb}]b~]'c!]ic"t_c#c$‡hc%oÕc&bþc'Òc(‰6c)‰rc*Nc+NXc,Pçc-RÝc.SGc/bc0fc1~ic2ˆc3–^c4Oc5Sc6V6c7YËc8Z¤c9\8c:\Nc;\Mc<^c=_c>`Cc?e½c@f/cAfBcBg¾cCgôcDscEwâcFy:cGÅcH„”cI„ÍcJ‰–cKŠfcLŠicMŠácNŒUcOŒzcPWôcQ[ÔcR_cS`ocTbícUi cVk–cWn\cXq„cY{ÒcZ‡Uc[‹Xc\Žþc]˜ßc^˜þc_O8c`OcaOácbT{ccZ cd[¸ceaX d?\³d@]½dA^DdB`ádCadDcádEjdFn%dG‘dH“TdI˜NdJœdKŸwdL[‰dM\¸dNc dOfOdPhHdQw[Ce?`Ye@cÚeAeeBemeCf˜eDùzeEiJeFj#eGm eHpeIqleJuÒeKv eLy³eMzpeNù{eOŠePù|eQ‰DeRù}eS‹“eT‘ÀeU–}eVù~eW™ eXWeY_¡eZe¼e[oe\ve]y¦e^Šže_™­e`›ZeaŸlebQeca¶edb‘eejefÆegPCehX0ei_fejq ekŠelŠúem[|en†eoOúepQš[f?V¥f@X'fAYøfBZfC[´fDùŽfE^öfFùfGùfHcPfIc;fJù‘fKi=fLl‡fMl¿fNmŽfOm“fPmõfQofRù’fSpßfTq6fUqYfVù“fWqÃfXqÕfYù”fZxOf[xof\ù•f]{uf^}ãf_ù–f`~/faù—fbˆMfcŽßfdù˜feù™ffùšfg’[fhù›fiœöfjùœfkùflùžfm`…fnm…foùŸfpq±fqù frù¡fs•±ftS­fuù¢fvù£fwù¤fxgÓfyù¥fzpŽf{q0f|t0f}‚vf~‚Òg!ù¦g"•»g#šåg$ž}g%fÄg&ù§g'qÁg(„Ig)ù¨g*ù©g+XKg,ùªg-ù«g.]¸g/_qg0ù¬g1f g2fŽg3iyg4i®g5l8g6lóg7n6g8oAg9oÚg:pg;p/gspg?ù­g@t[gAù®gBtÔgCvÈgDzNgE~“gFù¯gGù°gH‚ñgIŠ`gJÎgKù±gL“HgMù²gN—gOù³gPù´gQNBgRP*gSùµgTRgUSágVfógWlmgXoÊgYs gZwg[zbg\‚®g]…Ýg^†g_ù¶g`ˆÔgaŠcgb‹}gcŒkgdù·ge’³gfù¸gg—gh˜giN”gjO gkOÉglP²gmSHgnT>goT3gpUÚgqXbgrXºgsYggtZgu[ägv`Ÿgwù¹gxaÊgyeVgzeÿg{fdg|h§g}lZg~o³h!pÏh"q¬h#sRh${}h%‡h&Фh'œ2h(Ÿh)\Kh*lƒh+sDh,s‰h-’:h.n«h/teh0vh1zih2~h3† h4Q@h5XÅh6dÁh7tîh8uh9vph:Áh;•h<–Íh=™Th>n&h?tæh@z©hAzªhBåhC†ÙhD‡xhEŠhFZIhG[ŒhH[›hIh¡hJihKmchLs©hMthNt,hOx—hP}éhQëhRhSUhTƒžhUŒLhV–.hW˜hXfðhY_€hZeúh[g‰h\ljh]s‹h^P-h_Zh`kjhawîhbYhc]lhd]Íhes%hfuOhgùºhhù»hiPåhjQùhkX/hlY-hmY–hnYÚho[åhpù¼hqù½hr]¢hsb×htdhud“hvdþhwù¾hxfÜhyù¿hzjHh{ùÀh|qÿh}tdh~ùÁi!zˆi"z¯i#~Gi$~^i%€i&pi'ùÂi(‡ïi)‰i*‹ i+Yi,ùÃi-€i.™Ri/a~i0k2i1mti2~i3‰%i4±i5OÑi6P­i7Q—i8RÇi9WÇi:X‰i;[¹i<^¸i=aBi>i•i?mŒi@ngiAn¶iBq”iCtbiDu(iEu,iF€siGƒ8iH„ÉiIŽ iJ“”iK“ÞiLùÄiMNŽiNOQiOPviPQ*iQSÈiRSËiSSóiT[‡iU[ÓiV\$iWaiXa‚iYeôiZr[i[s—i\t@i]vÂi^yPi_y‘i`y¹ia}ib½ic‚‹id…Õie†^ifÂigGihõii‘êij–…ik–èil–éimRÖin_gioeíipf1iqh/irq\isz6itÁiu˜ ivN‘iwùÅixjRiykžizoi{q‰i|€i}‚¸i~…Sj!Kj"–•j#–òj$—ûj%…j&›1j'Nj(qŠj)–Äj*QCj+SŸj,Táj-Wj.Wj/W£j0Z›j1ZÄj2[Ãj3`(j4a?j5côj6l…j7m9j8nrj9nj:r0j;s?jˆj?Ej@`jAùÆjB–bjC˜XjDjEgjFŠjG’^jHOMjIPIjJPÞjKSqjLW jMYÔjNZjO\ jPapjQfjRn-jSr2jTtKjU}ïjV€ÃjW„jX„fjY…?jZ‡_j[ˆ[j\‰j]‹j^Uj_—Ëj`›OjaNsjbO‘jcQjdQjjeùÇjfU/jgU©jh[zji[¥jj^|jk^}jl^¾jm` jn`ßjoajpa jqcÄjre8jsg jtùÈjugÔjvgÚjwùÉjxiajyibjzl¹j{m'j|ùÊj}n8j~ùËk!oák"s6k#s7k$ùÌk%t\k&u1k'ùÍk(vRk)ùÎk*ùÏk+}­k,þk-„8k.ˆÕk/Š˜k0ŠÛk1Šík2Ž0k3ŽBk4Jk5>k6zk7‘Ik8‘Ék9“nk:ùÐk;ùÑkkÓk?€‰k@€²kAùÓkBùÔkCQAkDYkkE\9kFùÕkGùÖkHodkIs§kJ€äkKkLù×kM’kN•kOùØkPùÙkQùÚkRùÛkS€kTbkUpkV}hkW‡kXùÜkYW kZ`ik[aGk\k·k]оk^’€k_–±k`NYkaTkbmëkc…-kd–pke—ókf˜îkgcÖkhlãki‘kjQÝkkaÉklºkmùknOkoPkpQkq[œkraksaÿktdìkuikvkÅkwu‘kxwãky©kz‚dk{…k|‡ûk}ˆck~мl!‹pl"‘«l#NŒl$Nål%O l&ùÝl'ùÞl(Y7l)Yèl*ùßl+]òl,_l-_[l.`!l/ùàl0ùál1ùâl2ùãl3r>l4sål5ùäl6upl7uÍl8ùål9yûl:ùæl;€ l<€3l=€„l>‚ál?ƒQl@ùçlAùèlBŒ½lCŒ³lD‡lEùélFùêlG˜ôlH™ lIùëlJùìlKp7lLvÊlMÊlNÌlOülP‹lQNºlRNÁlSRlTSplUùílVT½lWVàlXYûlY[ÅlZ_l[_Íl\nnl]ùîl^ùïl_}jl`ƒ5laùðlb†“lcŠldùñle—mlf—wlgùòlhùóliNljOZlkO~llXùlmeålnn¢lo8lp“°lq™¹lrNûlsXìltYŠluYÙlv`Alwùôlxùõlyzlzùöl{ƒOl|ŒÃl}Qel~SDm!ù÷m"ùøm#ùùm$NÍm%Rim&[Um'‚¿m(NÔm)R:m*T¨m+YÉm,Yÿm-[Pm.[Wm/[\m0`cm1aHm2nËm3p™m4qnm5s†m6t÷m7uµm8xÁm9}+m:€m;êm<ƒ(m=…m>…Ém?Šîm@ŒÇmA–ÌmBO\mCRúmDV¼mEe«mFf(mGp|mHp¸mIr5mJ}½mK‚mL‘LmM–ÀmNrmO[qmPhçmQk˜mRozmSvÞmT\‘mUf«mVo[mW{´mX|*mYˆ6mZ–Üm[Nm\N×m]S m^X4m_X»m`XïmaYlmb\mc^3md^„me_5mfcŒmgf²mhgVmijmjj£mkk mlo?mmrFmnùúmosPmpt‹mqzàmr|§msxmtßmuçmvƒŠmw„lmx…#my…”mz…Ïm{ˆÝm|m}‘¬m~•wn!–œn"Qn#TÉn$W(n%[°n&bMn'gPn(h=n)h“n*n=n+nÓn,p}n-~!n.ˆÁn/Œ¡n0 n1ŸKn2ŸNn3r-n4{n5ŠÍn6“n7OGn8ONn9Q2n:T€n;YÐn<^•n=bµn>gun?inn@jnAl®nBnnCrÙnDs*nEu½nF{¸nG}5nH‚çnIƒùnJ„WnK…÷nLŠ[nMŒ¯nNއnOnP¸nQ–ÎnRŸ_nSRãnTT nUZánV[ÂnWdXnXeunYnônZrÄn[ùûn\v„n]zMn^{n_|Mn`~>naßnbƒ{nc‹+ndŒÊnednfángŽ_nhêniùnjink“ÑnlOCnmOznnP³noQhnpQxnqRMnrRjnsXantX|nuY`nv\nw\Unx^Ûny`›nzb0n{hn|k¿n}ln~o±o!qNo"t o#u0o$u8o%uQo&vro'{Lo({‹o){­o*{Æo+~o,Šno->o.Io/’?o0’“o1“"o2”+o3–ûo4˜Zo5˜ko6™o7Ro8b*o9b˜o:mYo;vdo}vo?S`o@\¾oA^—oBo8oCp¹oD|˜oE—oF›ŽoGžÞoHc¥oIdzoJ‡voKNoLN•oMN­oNP\oOPuoPTHoQYÃoR[šoS^@oT^­oU^÷oV_oW`ÅoXc:oYe?oZeto[eÌo\fvo]fxo^gþo_iho`j‰oakcobl@ocmÀodmèoenofn^ogpohp¡oisŽojsýoku:olw[omx‡onyŽooz opz}oq|¾or}Žos‚GotŠouŠêovŒžow‘-ox‘Joy‘Øoz’fo{’Ìo|“ o}—o~—Vp!—\p"˜p#Ÿp$R6p%R‘p&U|p'X$p(^p)_p*`Œp+cÐp,h¯p-oßp.ymp/{,p0Íp1…ºp2ˆýp3Šøp4ŽDp5‘p6–dp7–›p8—=p9˜Lp:ŸJp;OÎpR©p?V2p@_pA_kpBcªpCdÍpDeépEfApFfúpGfùpHgpIhpJh×pKiýpLopMonpNqgpOqåpPr*pQtªpRw:pSyVpTyZpUyßpVz pWz•pX|—pY|ßpZ}Dp[~pp\€‡p]…ûp^†¤p_ŠTp`Š¿pa™pbŽpc pdmpe‘ãpf–;pg–ÕphœåpieÏpj|pk³pl“Ãpm[Xpn\ poSRppbÙpqsprP'ps[—pt_žpu`°pvakpwhÕpxmÙpyt.pzz.p{}Bp|}œp}~1p~kq!Ž*q"Ž5q#“~q$”q%OPq&WPq']æq(^§q)c+q*jq+N;q,OOq-Oq.PZq/YÝq0€Äq1Tjq2Thq3Uþq4YOq5[™q6]Þq7^Úq8f]q9g1q:gñq;h*qnJq?oq@p·qAsàqBu‡qC|LqD}qE},qF}¢qG‚qH†ÛqIŠ;qJŠ…qKpqLŽŠqM3qN1qO‘NqP‘RqQ”DqR™ÐqSzùqT|¥qUOÊqVQqWQÆqXWÈqY[ïqZ\ûq[fYq\j=q]mZq^n–q_oìq`q qauoqbzãqcˆ"qd!qeuqf–Ëqg™ÿqhƒqiN-qjNòqkˆFql‘ÍqmS}qnjÛqoikqplAqq„zqrXžqsaŽqtfþqubïqvpÝqwuqxuÇqy~Rqz„¸q{‹Iq|q}NKq~Sêr!T«r"W0r#W@r$_×r%cr&cr'dor(e/r)eèr*fzr+gr,g³r-kbr.l`r/lšr0o,r1wår2x%r3yIr4yWr5}r6€¢r7r8ór9‚r:‚·r;‡r<ŠŒr=ùür>r?¾r@rrAvôrBzrCz7rD~TrE€wrFUrGUÔrHXurIc/rJd"rKfIrLfKrMhmrNi›rOk„rPm%rQn±rRsÍrSthrTt¡rUu[rVu¹rWvárXwrYw‹rZyær[~ r\~r]ûr^…/r_ˆ—r`Š:raŒÑrbŽërc°rd2re“­rf–crg–srh—riO„rjSñrkYêrlZÉrm^rnhNrotÆrpu¾rqyérrz’rs£rt†íruŒêrvÌrwírxeŸrygrzùýr{W÷r|oWr}}Ýr~/s!“ös"–Æs#_µs$aòs%o„s&Ns'O˜s(Ps)SÉs*Ußs+]os,]îs-k!s.kds/xËs0{šs1ùþs2ŽIs3ŽÊs4ns5cIs6d>s7w@s8z„s9“/s:”s;Ÿjsqæs?t¨s@tÚsAzÄsB|sC~‚sD|²sE~˜sF‹šsG sH”}sI™sJ™LsKR9sL[ßsMdæsNg-sO}.sPPísQSÃsRXysSaXsTaYsUaúsVe¬sWzÙsX‹’sY‹–sZP s[P!s\Rus]U1s^Zzt?‚t@…¦tAŒätBŽtCwtD‘çtE•átF–!tG—ÆtHQøtITòtJU†tK_¹tLd¤tMoˆtN}´tOtPMtQ”5tRPÉtS\tTl¾tUmûtVutWw»tX|=tY|dtZŠyt[ŠÂt\Xt]Y¾t^^t_cwt`rRtauŠtbwktcŠÜtdŒ¼tetf^ótgftthmøti€}tjƒÁtkŠËtl—Qtm›ÖtnútoRCtpfÿtqm•trnïts}àttŠætu.tv^twšÔtxRtyRtzTèt{a”t|b„t}bÛt~h¢u!iu"iZu#j5u$p’u%q&u&x]u'yu(yu)yÒu*z u+€–u,‚xu-‚Õu.ƒIu/…Iu0Œ‚u1…u2‘bu3‘‹u4‘®u5OÃu6VÑu7qíu8w×u9‡u:‰øu;[øu<_Öu=gQu>¨u?Sâu@XZuA[õuB`¤uCauDd`uE~=uF€puG…%uH’ƒuId®uJP¬uK]uLguMXœuNb½uOc¨uPiuQixuRjuSnkuTvºuUyËuV‚»uW„)uXŠÏuY¨uZýu[‘u\‘Ku]‘œu^“u_“u`“šua–Ûubš6ucœ udNueu\ufy]ugzúuh{Qui{Éuj~.uk„ÄulŽYumŽtunŽøuoupf%uqi?urtCusQúutg.uužÜuvQEuw_àuxl–uy‡òuzˆ]u{ˆwu|`´u}µu~„v!v"SÖv#T9v$V4v%Z6v&\1v'pŠv(àv)€Zv*v+ív,£v-‘‰v.š_v/òv0Ptv1NÄv2S v3`ûv4n,v5\dv6Oˆv7P$v8Uäv9\Ùv:^_v;`evmÄv?q¾v@uÔvAuôvBvavCzvDzIvE}ÇvF}ûvGnvHôvI†©vJvK–ÉvL™³vMŸRvNRGvORÅvP˜ívQ‰ªvRNvSgÒvTovUOµvV[âvWg•vXlˆvYmxvZtv[x'v\‘Ýv]“|v^‡Äv_yäv`z1va_ëvbNÖvcT¤vdU>veX®vfY¥vg`ðvhbSvibÖvjg6vkiUvl‚5vm–@vn™±vo™ÝvpP,vqSSvrUDvsW|vtúvubXvvúvwdâvxfkvygÝvzoÁv{oïv|t"v}t8v~Šw!”8w"TQw#Vw$Wfw%_Hw&ašw'kNw(pXw)p­w*}»w+Š•w,Yjw-+w.c¢w/ww0€=w1Œªw2XTw3d-w4i»w5[•w6^w7now8úw9…iw:QLw;SðwaKw?k†w@lpwAlðwB{wC€ÎwD‚ÔwEÆwF°wG˜±wHúwIdÇwJo¤wKd‘wLewMQNwNTwOWwPŠwQa_wRhvwSúwTuÛwU{RwV}qwWwXXwYiÌwZw[‰*w\w]˜9w^Pxw_YWw`Y¬wab•wbwc›*wda]werywf•ÖwgWawhZFwi]ôwjbŠwkd­wldúwmgwwnlâwom>wpr,wqt6wrx4wswwt‚­wuÛwv˜wwR$wxWBwygwzrHw{tãw|Œ©w}¦w~’x!–*x"Qkx#Síx$cLx%Oix&Ux'`–x(eWx)l›x*mx+rLx,rýx-zx.‰‡x/Œx0_mx1oŽx2pùx3¨x4ax5O¿x6POx7bAx8rGx9{Çx:}èx;éxšx?Œ¶x@WjxA^sxBg°xC„ xDŠUxET xF[xG^cxH^âxI_ xJeƒxK€ºxL…=xM•‰xN–[xOOHxPSxQS xRSxST†xTTúxUWxV^xW`xXb›xYb±xZcUx[úx\láx]mfx^u±x_x2x`€Þxa/xb‚Þxc„axd„²xeˆxf‰xg xh’êxi˜ýxj›‘xk^Exlf´xmfÝxnpxorxpúxqOõxrR}xs_jxtaSxugSxvjxwoxxtâxyyhxzˆhx{Œyx|˜Çx}˜Äx~šCy!TÁy"zy#iSy$Š÷y%ŒJy&˜¨y'™®y(_|y)b«y*u²y+v®y,ˆ«y-y.–By/S9y0_Yy?^Èy@f0yAl³yBtUyCƒwyD‡fyEŒÀyFPyG—yHœyIXÑyJ[xyK†PyL‹yM´yN[ÒyO`hyP`yQeñyRlWySo"yTo£yUpyVUyWðyX•‘yY•’yZ–Py[—Óy\Rry]Dy^Qýy_T+y`T¸yaUcybUŠycj»ydmµye}Øyf‚fyg’œyh–wyižyyjTykTÈylvÒym†äyn•¤yo•Ôyp–\yqN¢yrO ysYîytZæyu]÷yv`Rywb—yxgmyyhAyzl†y{n/y|8y}€›y~‚*z!úz"ú z#˜z$N¥z%PUz&T³z'W“z(YZz)[iz*[³z+aÈz,iwz-mwz.p#z/‡ùz0‰ãz1Šrz2Šçz3‚z4™íz5š¸z6R¾z7h8z8Pz9^xz:gOz;ƒGz<ˆLz=N«z>Tz?V®z@sæzA‘zB—ÿzC™ zD™WzE™™zFVSzGXŸzH†[zIŠ1zJa²zKjözLs{zMŽÒzNkGzO–ªzPšWzQYUzRrzSkzT—izUOÔzV\ôzW_&zXaøzYf[zZlëz[p«z\s„z]s¹z^sþz_w)z`wMza}Czb}bzc~#zd‚7zeˆRzfú zgŒâzh’Izi˜ozj[Qzkztzlˆ@zm˜znZÌzoOàzpSTzqY>zr\ýzsc>ztmyzurùzvzwzxƒ¢zy’Ïzz˜0z{N¨z|QDz}Rz~W‹{!_b{"lÂ{#nÎ{$p{%pP{&p¯{'q’{(sé{)ti{*ƒJ{+‡¢{,ˆa{-{.¢{/“£{0™¨{1Qn{2_W{3`à{4ag{5f³{6…Y{7ŽJ{8‘¯{9—‹{:NN{;N’{Xú{?Y}{@\µ{A_'{Bb6{CbH{Df {Efg{Fkë{Gmi{HmÏ{InV{Jnø{Ko”{Loà{Moé{Np]{OrÐ{Pt%{QtZ{Rtà{Sv“{Ty\{U|Ê{V~{W€á{X‚¦{Y„k{Z„¿{[†N{\†_{]‡t{^‹w{_Œj{`“¬{a˜{b˜e{c`Ñ{db{e‘w{fZZ{gf{hm÷{in>{jt?{k›B{l_ý{m`Ú{n{{oTÄ{p_{ql^{rlÓ{sm*{tpØ{u}{v†y{wŠ {x;{yS{zTŒ{{[{|j:{}pk{~uu|!y|"y¾|#‚±|$ƒï|%Šq|&‹A|'Œ¨|(—t|)ú |*dô|+e+|,xº|-x»|.zk|/N8|0Uš|1YP|2[¦|3^{|4`£|5cÛ|6ka|7fe|8hS|9n|:qe|;t°|<}|=„|>ši|?œ%|@m;|AnÑ|Bs>|CŒA|D•Ê|EQð|F^L|G_¨|H`M|I`ö|Ja0|KaL|LfC|MfD|Ni¥|OlÁ|Pn_|QnÉ|Rob|SqL|Ttœ|Uv‡|V{Á|W|'|XƒR|Y‡W|ZQ|[–|\žÃ|]S/|^VÞ|_^û|`_Š|a`b|b`”|ca÷|dff|eg|fjœ|gmî|ho®|ipp|jsj|k~j|l¾|mƒ4|n†Ô|oЍ|pŒÄ|qRƒ|rsr|s[–|tjk|u”|vTî|wV†|x[]|yeH|ze…|{fÉ||hŸ|}m|~mÆ}!r;}"€´}#‘u}$šM}%O¯}&P}'Sš}(T})T<}*U‰}+UÅ},^?}-_Œ}.g=}/qf}0sÝ}1}2RÛ}3Ró}4Xd}5XÎ}6q}7q}8qû}9…°}:Š};fˆ}<…¨}=U§}>f„}?qJ}@„1}ASI}BU™}CkÁ}D_Y}E_½}Fcî}Gf‰}HqG}IŠñ}J}Kž¾}LO}Md:}NpË}Ouf}P†g}Q`d}R‹N}Sø}TQG}UQö}VS}Wm6}X€ø}YžÑ}Zf}[k#}\p˜}]uÕ}^T}_\y}`}}aŠ}bk }ck=}dkF}eT8}f`p}gm=}hÕ}i‚}jPÖ}kQÞ}lUœ}mVk}nVÍ}oYì}p[ }q^ }ra™}sa˜}tb1}uf^}vfæ}wq™}xq¹}yqº}zr§}{y§}|z}}²}~Špscreen-5.0.2/utf8encodings/020000664000175000017500000006563615224432722014412 0ustar alexalexScreenI2UTF8ßJIS X 0208 (1990)!!0!"0!#0!$ÿ !%ÿ!&0û!'ÿ!(ÿ!)ÿ!*ÿ!+0›!,0œ!-´!.ÿ@!/¨!0ÿ>!1ÿã!2ÿ?!30ý!40þ!50!60ž!70!8NÝ!90!:0!;0!<0ü!= !> !?ÿ!@\!A0!B !Cÿ\!D &!E %!F !G !H !I !Jÿ!Kÿ !L0!M0!Nÿ;!Oÿ=!Pÿ[!Qÿ]!R0!S0 !T0 !U0 !V0 !W0 !X0!Y0!Z0![0!\ÿ !]"!^±!_×!`÷!aÿ!b"`!cÿ!dÿ!e"f!f"g!g"!h"4!i&B!j&@!k°!l 2!m 3!n!!oÿå!pÿ!q¢!r£!sÿ!tÿ!uÿ!vÿ !wÿ !x§!y&!z&!{%Ë!|%Ï!}%Î!~%Ç"!%Æ""%¡"#% "$%³"%%²"&%½"'%¼"( ;")0"*!’"+!",!‘"-!“".0":"";" "<"†"="‡">"‚"?"ƒ"@"*"A")"J"'"K"("L¬"M!Ò"N!Ô"O""P""\" "]"¥"^#"_""`""a"a"b"R"c"j"d"k"e""f"="g""h"5"i"+"j","r!+"s 0"t&o"u&m"v&j"w "x !"y¶"~%ï#0ÿ#1ÿ#2ÿ#3ÿ#4ÿ#5ÿ#6ÿ#7ÿ#8ÿ#9ÿ#Aÿ!#Bÿ"#Cÿ##Dÿ$#Eÿ%#Fÿ&#Gÿ'#Hÿ(#Iÿ)#Jÿ*#Kÿ+#Lÿ,#Mÿ-#Nÿ.#Oÿ/#Pÿ0#Qÿ1#Rÿ2#Sÿ3#Tÿ4#Uÿ5#Vÿ6#Wÿ7#Xÿ8#Yÿ9#Zÿ:#aÿA#bÿB#cÿC#dÿD#eÿE#fÿF#gÿG#hÿH#iÿI#jÿJ#kÿK#lÿL#mÿM#nÿN#oÿO#pÿP#qÿQ#rÿR#sÿS#tÿT#uÿU#vÿV#wÿW#xÿX#yÿY#zÿZ$!0A$"0B$#0C$$0D$%0E$&0F$'0G$(0H$)0I$*0J$+0K$,0L$-0M$.0N$/0O$00P$10Q$20R$30S$40T$50U$60V$70W$80X$90Y$:0Z$;0[$<0\$=0]$>0^$?0_$@0`$A0a$B0b$C0c$D0d$E0e$F0f$G0g$H0h$I0i$J0j$K0k$L0l$M0m$N0n$O0o$P0p$Q0q$R0r$S0s$T0t$U0u$V0v$W0w$X0x$Y0y$Z0z$[0{$\0|$]0}$^0~$_0$`0€$a0$b0‚$c0ƒ$d0„$e0…$f0†$g0‡$h0ˆ$i0‰$j0Š$k0‹$l0Œ$m0$n0Ž$o0$p0$q0‘$r0’$s0“%!0¡%"0¢%#0£%$0¤%%0¥%&0¦%'0§%(0¨%)0©%*0ª%+0«%,0¬%-0­%.0®%/0¯%00°%10±%20²%30³%40´%50µ%60¶%70·%80¸%90¹%:0º%;0»%<0¼%=0½%>0¾%?0¿%@0À%A0Á%B0Â%C0Ã%D0Ä%E0Å%F0Æ%G0Ç%H0È%I0É%J0Ê%K0Ë%L0Ì%M0Í%N0Î%O0Ï%P0Ð%Q0Ñ%R0Ò%S0Ó%T0Ô%U0Õ%V0Ö%W0×%X0Ø%Y0Ù%Z0Ú%[0Û%\0Ü%]0Ý%^0Þ%_0ß%`0à%a0á%b0â%c0ã%d0ä%e0å%f0æ%g0ç%h0è%i0é%j0ê%k0ë%l0ì%m0í%n0î%o0ï%p0ð%q0ñ%r0ò%s0ó%t0ô%u0õ%v0ö&!‘&"’&#“&$”&%•&&–&'—&(˜&)™&*š&+›&,œ&-&.ž&/Ÿ&0 &1¡&2£&3¤&4¥&5¦&6§&7¨&8©&A±&B²&C³&D´&Eµ&F¶&G·&H¸&I¹&Jº&K»&L¼&M½&N¾&O¿&PÀ&QÁ&RÃ&SÄ&TÅ&UÆ&VÇ&WÈ&XÉ'!'"'#'$'%'&'''(')'*'+','-'.'/'0'1'2 '3!'4"'5#'6$'7%'8&'9'':(';)'<*'=+'>,'?-'@.'A/'Q0'R1'S2'T3'U4'V5'WQ'X6'Y7'Z8'[9'\:'];'^<'_='`>'a?'b@'cA'dB'eC'fD'gE'hF'iG'jH'kI'lJ'mK'nL'oM'pN'qO(!%("%(#% ($%(%%(&%('%((%,()%$(*%4(+%<(,%(-%(.%(/%(0%(1%(2%#(3%3(4%+(5%;(6%K(7% (8%/(9%((:%7(;%?(<%(=%0(>%%(?%8(@%B0!Nœ0"U0#Z0$–?0%TÀ0&a0'c(0(Yö0)"0*„u0+ƒ0,zP0-`ª0.cá0/n%00eí01„f02‚¦03›õ04h“05W'06e¡07bq08[›09YÐ0:†{0;˜ô0<}b0=}¾0>›Ž0?b0@|Ÿ0Aˆ·0B[‰0C^µ0Dc 0Ef—0FhH0G•Ç0H—0IgO0JNå0KO 0LOM0MO0NPI0OVò0PY70QYÔ0RZ0S\ 0T`ß0Ua0Vap0Wf0Xi0Ypº0ZuO0[up0\yû0]}­0^}ï0_€Ã0`„0aˆc0b‹0cU0dz0eS;0fN•0gN¥0hWß0i€²0jÁ0kxï0lN0mXñ0nn¢0o80pz20qƒ(0r‚‹0sœ/0tQA0uSp0vT½0wTá0xVà0yYû0z_0{˜ò0|më0}€ä0~…-1!–b1"–p1#– 1$—û1%T 1&Só1'[‡1(pÏ1)½1*Â1+–è1,So1-\1.zº1/N10x“11ü12n&13V14U15k16…17œ;18Yå19S©1:mf1;tÜ1<•1=VB1>N‘1?K1@–ò1AƒO1B™ 1CSá1DU¶1E[01F_q1Gf 1Hfó1Ih1Jl81Kló1Lm)1Mt[1NvÈ1OzN1P˜41Q‚ñ1Rˆ[1SŠ`1T’í1Um²1Vu«1WvÊ1X™Å1Y`¦1Z‹1[Š1\•²1]iŽ1^S­1_Q†1`W1aX01bYD1c[´1d^ö1e`(1fc©1gcô1hl¿1io1jpŽ1kq1lqY1mqÕ1ns?1o~1p‚v1q‚Ñ1r…—1s`1t’[1u1vXi1we¼1xlZ1yu%1zQù1{Y.1|Ye1}_€1~_Ü2!b¼2"eú2#j*2$k'2%k´2&s‹2'Á2(‰V2),2*2+žÄ2,\¡2-l–2.ƒ{2/Q20\K21a¶22Æ23hv24ra25NY26Oú27Sx28`i29n)2:zO2;—ó2Nî2?OU2@O=2AO¡2BOs2CR 2DSï2EV 2FY2GZÁ2H[¶2I[á2JyÑ2Kf‡2Lgœ2Mg¶2NkL2Ol³2Ppk2QsÂ2Ry2Sy¾2Tz<2U{‡2V‚±2W‚Û2Xƒ2Yƒw2Zƒï2[ƒÓ2\‡f2]в2^V)2_Œ¨2`æ2aN2b—2c†Š2dOÄ2e\è2fb2grY2hu;2iå2j‚½2k†þ2lŒÀ2m–Å2n™2o™Õ2pNË2qO2r‰ã2sVÞ2tXJ2uXÊ2v^û2w_ë2x`*2y`”2z`b2{aÐ2|b2}bÐ2~e93!›A3"ff3#h°3$mw3%pp3&uL3'v†3(}u3)‚¥3*‡ù3+•‹3,–Ž3-Œ3.Qñ3/R¾30Y31T³32[³33]34ah35i‚36m¯37x38„Ë39ˆW3:Šr3;“§3<š¸3=ml3>™¨3?†Ù3@W£3Agÿ3B†Î3C’3DRƒ3EV‡3FT3G^Ó3Hbá3Id¹3Jh<3Kh83Lk»3Msr3Nxº3Ozk3P‰š3Q‰Ò3Rk3S3Tí3U•£3V–”3W—i3X[f3Y\³3Zi}3[˜M3\˜N3]c›3^{ 3_j+3`j3ah¶3bœ 3co_3dRr3eU3f`p3gbì3hm;3in3jnÑ3k„[3l‰3mD3nN3oœ93pSö3qi3rj:3s—„3th*3uQ\3vzÃ3w„²3x‘Ü3y“Œ3zV[3{(3|h"3}ƒ3~„14!|¥4"R4#‚Å4$tæ4%N~4&Oƒ4'Q 4([Ò4)R 4*RØ4+Rç4,]û4-Uš4.X*4/Yæ40[Œ41[˜42[Û43^r44^y45`£46a47ac48a¾49cÛ4:eb4;gÑ4k>4?kS4@lW4Ao"4Bo—4CoE4Dt°4Eu4Fvã4Gw 4Hzÿ4I{¡4J|!4K}é4L64Mð4N€4O‚f4Pƒž4Q‰³4RŠÌ4SŒ«4T„4U”Q4V•“4W•‘4X•¢4Y–e4Z—Ó4[™(4\‚4]N84^T+4_\¸4`]Ì4as©4bvL4cw<4d\©4eë4f 4g–Á4h˜4i˜T4j˜X4kO4lO4mSq4nUœ4oVh4pWú4qYG4r[ 4s[Ä4t\4u^ 4v^~4w_Ì4xcî4yg:4ze×4{eâ4|g4}hË4~hÄ5!j_5"^05#kÅ5$l5%l}5&u5'yH5([c5)z5*}5+_½5,‰5-Š5.Œ´5/w50ŽÌ5152˜â53š54›<55N€56P}57Q58Y“59[œ5:b/5;b€5r 5?u‘5@yG5A©5B‡û5Cм5D‹p5Ec¬5FƒÊ5G— 5HT 5IT5JU«5KhT5LjX5MŠp5Nx'5Ogu5PžÍ5QSt5R[¢5S5T†P5U5VN5WNE5XNÇ5YO5ZSÊ5[T85\[®5]_5^`%5_eQ5`g=5alB5blr5clã5dpx5et5fzv5gz®5h{5i}5j|þ5k}f5leç5mr[5nS»5o\E5p]è5qbÒ5rbà5sc5tn 5u†Z5vŠ15wÝ5x’ø5yo5zy¦5{›Z5|N¨5}N«5~N¬6!O›6"O 6#PÑ6$QG6%zö6&Qq6'Qö6(ST6)S!6*S6+Së6,U¬6-Xƒ6.\á6/_760_J61`/62`P63`m64c65eY66jK67lÁ68rÂ69rí6:wï6;€ø6<6=‚6>…N6?÷6@“á6A—ÿ6B™W6CšZ6DNð6EQÝ6F\-6Gf6Him6I\@6Jfò6Kiu6Ls‰6MhP6N|6OPÅ6PRä6QWG6R]þ6S“&6Te¤6Uk#6Vk=6Wt46Xy6Yy½6Z{K6[}Ê6\‚¹6]ƒÌ6^ˆ6_‰_6`‹96aÑ6b‘Ñ6cT6d’€6eN]6fP66gSå6hS:6ir×6js–6kwé6l‚æ6mޝ6n™Æ6o™È6p™Ò6qQw6ra6s†^6tU°6uzz6vPv6w[Ó6xG6y–…6zN26{jÛ6|‘ç6}\Q6~\H7!c˜7"zŸ7#l“7$—t7%a7&zª7'qŠ7(–ˆ7)|‚7*h7+~p7,hQ7-“l7.Rò7/T70…«71Š72¤73ŽÍ74á75Sf76ˆˆ77yA78OÂ79P¾7:R7;QD7sê7?W‹7@YQ7A_b7B_„7C`u7Dav7Eag7Fa©7Gc²7Hd:7Iel7Jfo7KhB7Ln7Muf7Nz=7O|û7P}L7Q}™7R~K7Sk7Tƒ7UƒJ7V†Í7WŠ7XŠc7Y‹f7ZŽý7[˜7\7]‚¸7^Î7_›è7`R‡7ab7bdƒ7coÀ7d–™7ehA7fP‘7gk 7hlz7ioT7jzt7k}P7lˆ@7mŠ#7ng7oNö7pP97qP&7rPe7sQ|7tR87uRc7vU§7wW7xX7yZÌ7z^ú7{a²7|aø7}bó7~cr8!i8"j)8#r}8$r¬8%s.8&x8'xo8(}y8)w 8*€©8+‰‹8,‹8-Œâ8.ŽÒ8/c80“u81–z82˜U83š84žx85QC86SŸ87S³88^{89_&8:n8;n8}C8?‚78@Š8AŠú8B–P8CNN8DP 8ESä8FT|8GVú8HYÑ8I[d8J]ñ8K^«8L_'8Mb88NeE8Og¯8PnV8QrÐ8R|Ê8Sˆ´8T€¡8U€á8Vƒð8W†N8XЇ8Yè8Z’78[–Ç8\˜g8]Ÿ8^N”8_N’8`O 8aSH8bTI8cT>8dZ/8e_Œ8f_¡8g`Ÿ8hh§8ijŽ8jtZ8kx8lŠž8mФ8n‹w8o‘8pN^8q›É8rN¤8sO|8tO¯8uP8vP8wQI8xQl8yRŸ8zR¹8{Rþ8|Sš8}Sã8~T9!T9"U‰9#WQ9$W¢9%Y}9&[T9'[]9([9)]å9*]ç9+]÷9,^x9-^ƒ9.^š9/^·90_91`R92aL93b—94bØ95c§96e;97f98fC99fô9:gm9;h!9l_9?m*9@mi9An/9Bn9Cu29Dv‡9Exl9Fz?9G|à9H}9I}9J}^9K}±9L€9M€9N€¯9O€±9PT9Q9R‚*9SƒR9TˆL9Uˆa9V‹9WŒ¢9XŒü9YÊ9Z‘u9[’q9\x?9]’ü9^•¤9_–M9`˜9a™™9bšØ9c;9dR[9eR«9fS÷9gT9hXÕ9ib÷9joà9kŒj9l_9mž¹9nQK9oR;9pTJ9qVý9rz@9s‘w9t`9užÒ9vsD9wo 9xp9yu9z_ý9{`Ú9|š¨9}rÛ9~¼:!kd:"˜:#NÊ:$Vð:%Wd:&X¾:'ZZ:(`h:)aÇ:*f:+f:,h9:-h±:.m÷:/uÕ:0}::1‚n:2›B:3N›:4OP:5SÉ:6U:7]o:8]æ:9]î::gû:;l™:ŠP:?“–:@ˆß:AWP:B^§:Cc+:DPµ:EP¬:FQ:Gg:HTÉ:IX^:JY»:K[°:L_i:MbM:Nc¡:Oh=:Pks:Qn:Rp}:S‘Ç:Tr€:Ux:Vx&:Wym:XeŽ:Y}0:ZƒÜ:[ˆÁ:\ :]–›:^Rd:_W(:`gP:aj:bŒ¡:cQ´:dWB:e–*:fX::giŠ:h€´:iT²:j]:kWü:lx•:mú:nO\:oRJ:pT‹:qd>:rf(:sg:tgõ:uz„:v{V:w}":x“/:yh\:z›­:{{9:|S:}QŠ:~R7;![ß;"bö;#d®;$dæ;%g-;&kº;'…©;(–Ñ;)v;*›Ö;+cL;,“;-›«;.v¿;/fR;0N ;1P˜;2SÂ;3\q;4`è;5d’;6ec;7h_;8qæ;9sÊ;:u#;;{—;<~‚;=†•;>‹ƒ;?ŒÛ;@‘x;A™;Be¬;Cf«;Dk‹;ENÕ;FNÔ;GO:;HO;IR:;JSø;KSò;LUã;MVÛ;NXë;OYË;PYÉ;QYÿ;R[P;S\M;T^;U^+;V_×;W`;Xc;Ye/;Z[\;[e¯;\e½;]eè;^g;_kb;`k{;al;bsE;cyI;dyÁ;e|ø;f};g}+;h€¢;i;jó;k‰–;lŠ^;mŠi;nŠf;oŠŒ;pŠî;qŒÇ;rŒÜ;s–Ì;t˜ü;uko;vN‹;wO<;xO;yQP;z[W;{[ú;|aH;}c;~fB<%t½<&uÔ<'xÁ<(y:<)€ <*€3<+ê<,„”<-ž<.lPn_“=?b=@gÔ=AlA=Bn =Csc=D~&=E‘Í=F’ƒ=GSÔ=HY=I[¿=JmÑ=Ky]=L~.=M|›=NX~=OqŸ=PQú=QˆS=Rð=SOÊ=T\û=Uf%=Vw¬=Wzã=X‚=Y™ÿ=ZQÆ=[_ª=\eì=]io=^k‰=_mó=`n–=aod=bvþ=c}=d]á=eu=f‘‡=g˜=hQæ=iR=jb@=kf‘=lfÙ=mn=n^¶=o}Ò=pr=qfø=r…¯=s…÷=tŠø=uR©=vSÙ=wYs=x^=y_=z`U={’ä=|–d=}P·=~Q>!RÝ>"S >#SG>$Sì>%Tè>&UF>'U1>(V>)Yh>*Y¾>+Z<>,[µ>-\>.\>/\>0\>1^„>2^Š>3^à>4_p>5b>6b„>7bÛ>8cŒ>9cw>:f>;f >=fv>>g~>?h¢>@j>Aj5>Bl¼>Cmˆ>Dn >EnX>Fq<>Gq&>Hqg>IuÇ>Jw>Kx]>Ly>Mye>Nyð>Ozà>P{>Q|§>R}9>S€–>TƒÖ>U„‹>V…I>Wˆ]>Xˆó>YŠ>ZŠ<>[ŠT>\Šs>]Œa>^ŒÞ>_‘¤>`’f>a“~>b”>c–œ>d—˜>eN >fN>gN>hNW>iQ—>jRp>kWÎ>lX4>mXÌ>n[">o^8>p`Å>qdþ>rga>sgV>tmD>ur¶>vus>wzc>x„¸>y‹r>z‘¸>{“ >|V1>}Wô>~˜þ?!bí?"i ?#k–?$qí?%~T?&€w?'‚r?(‰æ?)˜ß?*‡U?+±?,\;?-O8?.Oá?/Oµ?0U?1Z ?2[Ý?3[é?4_Ã?5aN?6c/?7e°?8fK?9hî?:i›?;mx?u¹??w?@y^?Ayæ?B}3?Cã?D‚¯?E…ª?F‰ª?GŠ:?HŽ«?I›?J2?K‘Ý?L—?MNº?NNÁ?OR?PXu?QXì?R\ ?Su?T\=?UN?VŠ ?WÅ?X–c?Y—m?Z{%?[ŠÏ?\˜?]‘b?^Vó?_S¨?`?aT9?bW‚?c^%?dc¨?el4?fpŠ?gwa?h|‹?ià?jˆp?kB?l‘T?m“?n“?o–?pt^?qšÄ?r]?s]i?tep?ug¢?v¨?w–Û?xcn?ygI?zi?{ƒÅ?|˜?}–À?~ˆþ@!o„@"dz@#[ø@$N@%p,@&u]@'f/@(QÄ@)R6@*Râ@+YÓ@,_@-`'@.b@/e?@0et@1f@2ft@3hò@4h@5kc@6n@7rr@8u@9vÛ@:|¾@;€V@‰@?Š @@Š“@AŠË@B@C‘’@D—R@E—Y@Fe‰@Gz@H@I–»@J^-@K`Ü@Lb@Me¥@Nf@Og@Pwó@QzM@R|M@S~>@T @UŒ¬@Vd@Wá@XŽ_@Yx©@ZR@[bÙ@\c¥@]dB@^b˜@_Š-@`zƒ@a{À@bЬ@c–ê@d}v@e‚ @f‡I@gNÙ@hQH@iSC@jS`@k[£@l\@m\@n]Ý@ob&@pbG@qd°@rh@sh4@tlÉ@umE@vm@wgÓ@xo\@yqN@zq}@{eË@|z@}{­@~}ÚA!~JA"¨A#zA$‚A%‚9A&…¦A'ŠnA(ŒÎA)õA*xA+wA,’­A-’‘A.•ƒA/›®A0RMA1U„A2o8A3q6A4QhA5y…A6~UA7³A8|ÎA9VLA:XQA;\¨AfýA?iZA@rÙAAuABuŽACyADyVAEyßAF|—AG} AH}DAI†AJŠ4AK–;ALaAMŸ ANPçAORuAPSÌAQSâARP ASUªATXîAUYOAVr=AW[‹AX\dAYSAZ`ãA[`óA\c\A]cƒA^c?A_c»A`dÍAaeéAbfùAc]ãAdiÍAeiýAfoAgqåAhN‰AiuéAjvøAkz“Al|ßAm}ÏAn}œAo€aApƒIAqƒXAr„lAs„¼At…ûAuˆÅAvpAwAxmAy“—Az—A{šA|PÏA}X—A~aŽB!ÓB"…5B#B$ B%OÃB&PtB'RGB(SsB)`oB*cIB+g_B,n,B-³B.B/O×B0\^B1ŒÊB2eÏB3}šB4SRB5ˆ–B6QvB7cÃB8[XB9[kB:\ B;d BNÖB?YB@Y*BAlpBBŠQBCU>BDXBEY¥BF`ðBGbSBHgÁBI‚5BJiUBK–@BL™ÄBMš(BNOSBOXBP[þBQ€BR\±BS^/BT_…BU` BVaKBWb4BXfÿBYlðBZnÞB[€ÎB\B]‚ÔB^ˆ‹B_Œ¸B`Ba.Bb–ŠBcžÛBd›ÛBeNãBfSðBgY'Bh{,Bi‘Bj˜LBkùBlnÝBmp'BnSSBoUDBp[…BqbXBrbžBsbÓBtl¢BuoïBvt"BwŠBx”8ByoÁBzŠþB{ƒ8B|QçB}†øB~SêC!SéC"OFC#TC$°C%YjC&1C']ýC(zêC)¿C*hÚC+Œ7C,røC-œHC.j=C/аC0N9C1SXC2VC3WfC4bÅC5c¢C6eæC7kNC8máC9n[C:p­C;wíC}»C?€=C@€ÆCA†ËCBŠ•CC“[CDVãCEXÇCF_>CGe­CHf–CIj€CJkµCKu7CLŠÇCMP$CNwåCOW0CP_CQ`eCRfzCSl`CTuôCUzCVnCWôCX‡CYECZ™³C[{ÉC\u\C]zùC^{QC_„ÄC`CayéCbz’Ccƒ6CdZáCew@CfN-CgNòCh[™Ci_àCjb½CkfvôD?gD@lˆDAsÍDBŒÃDC“®DD–sDEm%DFXœDGiDHiÌDIýDJ“šDKuÛDLDMXZDNhDOc´DPiûDQOCDRo,DSgØDT»DU…&DV}´DW“TDXi?DYopDZWjD[X÷D\[,D]},D^r*D_T D`‘ãDa´DbN­DcONDdP\DePuDfRCDgŒžDhTHDiX$Dj[šDk^Dl^•Dm^­Dn^÷Do_Dp`ŒDqbµDrc:DscÐDth¯Dul@Dvx‡DwyŽDxz Dy}àDz‚GD{ŠD|ŠæD}ŽDD~E!¸E"‘-E#‘ØE$ŸE%låE&dXE'dâE(euE)nôE*v„E+{E,iE-“ÑE.nºE/TòE0_¹E1d¤E2ME3íE4’DE5QxE6XkE7Y)E8\UE9^—E:mûE;~EŽâE?˜[E@p¹EAOEBk¿ECo±EDu0EE–ûEFQNEGTEHX5EIXWEJY¬EK\`EL_’EMe—ENg\EOn!EPv{EQƒßERŒíESETýEU“MEVx%EWx:EXRªEY^¦EZWE[YtE\`E]PE^QZE_Q¬E`QÍEaREbUEcXTEdXXEeYWEf[•Eg\öEh]‹Ei`¼Ejb•Ekd-ElgqEmhCEnh¼EohßEpv×EqmØErnoEsm›EtpoEuqÈEv_SEwuØExywEy{IEz{TE{{RE||ÖE}}qE~R0F!„cF"…iF#…äF$ŠF%‹F&ŒFF'ŽF(F)F*”F+–vF,˜-F-š0F.•ØF/PÍF0RÕF1T F2XF3\F4a§F5džF6mF7w³F8zåF9€ôF:„F;SF<’…F=\àF>F?S?F@_—FA_³FBmœFCryFDwcFEy¿FF{äFGkÒFHrìFIŠ­FJhFKjaFLQøFMzFNi4FO\JFPœöFQ‚ëFR[ÅFS‘IFTpFUVxFV\oFW`ÇFXefFYlŒFZŒZF[AF\˜F]TQF^fÇF_’ F`YHFa£FbQ…FcNMFdQêFe…™Ff‹FgpXFhczFi“KFjibFk™´Fl~FmuwFnSWFoi`FpŽßFq–ãFrl]FsNŒFt\3G?¿G@²GA‰—GB†¤GC]ôGDbŠGEd­GF‰‡GGgwGHlâGIm>GJt6GKx4GLZFGMuGN‚­GO™¬GPOóGQ^ÃGRbÝGSc’GTeWGUgoGVvÃGWrLGX€ÌGY€ºGZ)G[‘MG\P G]WùG^Z’G_h…G`isGaqdGbrýGcŒ·GdXòGeŒàGf–jGgGh‡GiyäGjwçGk„)GlO/GmReGnSZGobÍGpgÏGqlÊGrv}Gs{”Gt|•Gu‚6Gv…„GwëGxfÝGyo GzrG{~G|ƒ«G}™ÁG~ž¦H!QýH"{±H#xrH${¸H%€‡H&{HH'jèH(^aH)€ŒH*uQH+u`H,QkH-’bH.nŒH/vzH0‘—H1šêH2OH3pH4bœH5{OH6•¥H7œéH8VzH9XYH:†äH;–¼HSJH?SÍH@SÛHA^HBd,HCe‘HDgHEl>HFlNHGrHHHr¯HIsíHJuTHK~AHL‚,HM…éHNŒ©HO{ÄHP‘ÆHQqiHR˜HS˜ïHTc=HUfiHVujHWväHXxÐHY…CHZ†îH[S*H\SQH]T&H^YƒH_^‡H`_|Ha`²HbbIHcbyHdb«HeeHfkÔHglÌHhu²Hiv®Hjx‘HkyØHl}ËHmwHn€¥Hoˆ«HpйHqŒ»HrHs—^Ht˜ÛHuj Hv|8HwP™Hx\>Hy_®Hzg‡H{kØH|t5H}w H~ŽI!Ÿ;I"gÊI#zI$S9I%u‹I&šíI'_fI(I)ƒñI*€˜I+_ŠUI?ŒyI@^ßIAcÏIBuÅICyÒID‚×IE“(IF’òIG„œIH†íIIœ-IJTÁIK_lILeŒIMm\INpIOŒ§IPŒÓIQ˜;IReOIStöITN IUNØIVWàIWY+IXZfIY[ÌIZQ¨I[^I\^œI]`I^bvI_ewI`e§IafnIbmnIcr6Id{&IePIfšIg‚™Ih‹\IiŒ IjŒæIktIl–Im–DInO®Iod«IpkfIq‚Ir„aIs…jItèIu\IviSIw˜¨Ix„zIy…WIzOI{RoI|_©I}^EI~g J!yJ"yJ#‰J$‰†J%mõJ&_J'bUJ(l¸J)NÏJ*riJ+›’J,RJ-T;J.VtJ/X³J0a¤J1bnJ2qJ3YnJ4|‰J5|ÞJ6}J7–ðJ8e‡J9€^J:NJ;OuJ^cJ?^sJ@_ JAgÄJBN&JC…=JD•‰JE–[JF|sJG˜JHPûJIXÁJJvVJKx§JLR%JMw¥JN…JO{†JPPOJQY JRrGJS{ÇJT}èJUºJVÔJWMJXO¿JYRÉJZZ)J[_J\—­J]OÝJ^‚J_’êJ`WJacUJbkiJcu+JdˆÜJeJfzBJgRßJhX“JiaUJjb Jkf®JlkÍJm|?JnƒéJoP#JpOøJqSJrTFJsX1JtYIJu[Jv\ðJw\ïJx])Jy^–Jzb±J{cgJ|e>J}e¹J~g K!lÕK"láK#pùK$x2K%~+K&€ÞK'‚³K(„ K)„ìK*‡K+‰K,Š*K-ŒJK.¦K/’ÒK0˜ýK1œóK2lK3NOK4N¡K5PK6RVK7WJK8Y¨K9^=K:_ØK;_ÙKgK?gÐK@hÒKAQ’KB}!KC€ªKD¨KE‹KFŒŒKGŒ¿KH’~KI–2KJT KK˜,KLSKMPÕKNS\KOX¨KPd²KQg4KRrgKSwfKTzFKU‘æKVRÃKWl¡KXk†KYXKZ^LK[YTK\g,K]ûK^QáK_vÆK`diKaxèKb›TKcž»KdWËKeY¹Kff'KggšKhkÎKiTéKjiÙKk^UKlœKmg•Kn›ªKogþKpœRKqh]KrN¦KsOãKtSÈKub¹Kvg+Kwl«KxÄKyO­Kz~mK{ž¿K|NK}abK~n€L!o+L"…L#TsL$g*L%›EL&]óL'{•L(\¬L)[ÆL*‡L+nJL,„ÑL-zL.L/Y™L0|L1lL2w L3RÙL4Y"L5q!L6r_L7wÛL8—'L9aL:i L;ZLT L?T}L@fLAvßLB÷LC’˜LDœôLEYêLFr]LGnÅLHQMLIhÉLJ}¿LK}ìLL—bLMžºLNdxLOj!LPƒLQY„LR[_LSkÛLTsLUvòLV}²LW€LX„™LYQ2LZg(L[žÙL\vîL]gbL^RÿL_™L`\$Lab;Lb|~LcŒ°LdUOLe`¶Lf} Lg•€LhSLiN_LjQ¶LkYLlr:Lm€6Ln‘ÎLo_%LpwâLqS„Lr_yLs}Lt…¬LuŠ3LvŽLw—VLxgóLy…®Lz”SL{a L|aL}l¹L~vRM!ŠíM"8M#U/M$OQM%Q*M&RÇM'SËM([¥M)^}M*` M+a‚M,cÖM-g M.gÚM/ngM0mŒM1s6M2s7M3u1M4yPM5ˆÕM6Š˜M7JM8‘M9õM:–ÄM;‡MOYM?NM@ЉMA?MB˜MCP­MD^|MEY–MF[¹MG^¸MHcÚMIcúMJdÁMKfÜMLiJMMiØMNm MOn¶MPq”MQu(MRz¯MSŠMT€MU„IMV„ÉMW‰MX‹!MYŽ MZeM[–}M\™ M]a~M^b‘M_k2M`lƒMamtMbÌMcüMdmÀMe…Mf‡ºMgˆøMhgeMiƒ±Mj˜N!N?QÌN@[îNAe™NBhNCm¼NDsNEvBNFw­NGzNH|çNI‚oNJŠÒNK|NL‘ÏNM–uNN˜NOR›NP}ÑNQP+NRS˜NSg—NTmËNUqÐNVt3NWèNX*NY–£NZœWN[žŸN\t`N]XAN^m™N_}/N`˜^NaNäNbO6NcO‹NdQ·NeR±Nf]ºNg`Nhs²NiyN}}ôN~€oO!„îO"#O#“,O$TBO%›oO&jÓO'p‰O(ŒÂO)ïO*—2O+R´O,ZAO-^ÊO._O/gO0i|O1i”O2mjO3oO4rbO5rüO6{íO7€O8€~O9‡KO:ÎO;QmO<ž“O=y„O>€‹O?“2O@ŠÖOAP-OBTŒOCŠqODkjOEŒÄOFOG`ÑOHg OIòOJN™OKN˜OLœOMŠkON…ÁOO…hOPiOQn~ORx—OSUP!_ P"NP#NP$N*P%N1P&N6P'NNÂP?N×P@NÞPANíPBNßPCN÷PDO PEOZPFO0PGO[PHO]PIOWPJOGPKOvPLOˆPMOPNO˜POO{PPOiPQOpPRO‘PSOoPTO†PUO–PVQPWOÔPXOßPYOÎPZOØP[OÛP\OÑP]OÚP^OÐP_OäP`OåPaPPbP(PcPPdP*PeP%PfPPgOPhOöPiP!PjP)PkP,PlOþPmOïPnPPoPPpPCPqPGPrgPsPUPtPPPuPHPvPZPwPVPxPlPyPxPzP€P{PšP|P…P}P´P~P²Q!PÉQ"PÊQ#P³Q$PÂQ%PÖQ&PÞQ'PåQ(PíQ)PãQ*PîQ+PùQ,PõQ-Q Q.QQ/QQ0QQ1QQ2QQ3QQ4Q!Q5Q:Q6Q7Q7QQbQ?zøQ@QiQAQjQBQnQCQ€QDQ‚QEVØQFQŒQGQ‰QHQQIQ‘QJQ“QKQ•QLQ–QMQ¤QNQ¦QOQ¢QPQ©QQQªQRQ«QSQ³QTQ±QUQ²QVQ°QWQµQXQ½QYQÅQZQÉQ[QÛQ\QàQ]†UQ^QéQ_QíQ`QðQaQõQbQþQcRQdR QeRQfRQgR'QhR*QiR.QjR3QkR9QlROQmRDQnRKQoRLQpR^QqRTQrRjQsRtQtRiQuRsQvRQwR}QxRQyR”QzR’Q{RqQ|RˆQ}R‘Q~¨R!§R"R¬R#R­R$R¼R%RµR&RÁR'RÍR(R×R)RÞR*RãR+RæR,˜íR-RàR.RóR/RõR0RøR1RùR2SR3SR4u8R5S R6SR7SR8SR9SR:S#R;S/RS8R?S@R@SFRASERBNRCSIRDSMREQÖRFS^RGSiRHSnRIYRJS{RKSwRLS‚RMS–RNS ROS¦RPS¥RQS®RRS°RSS¶RTSÃRU|RV–ÙRWSßRXfüRYqîRZSîR[SèR\SíR]SúR^TR_T=R`T@RaT,RbT-RcTT¯S?UŠS@UŸSAU{SBU~SCU˜SDUžSEU®SFU|SGUƒSHU©SIU‡SJU¨SKUÚSLUÅSMUßSNUÄSOUÜSPUäSQUÔSRVSSU÷STVSUUþSVUýSWVSXUùSYVNSZVPS[qßS\V4S]V6S^V2S_V8S`VkSaVdSbV/ScVlSdVjSeV†SfV€SgVŠShV SiV”SjVSkV¥SlV®SmV¶SnV´SoVÂSpV¼SqVÁSrVÃSsVÀStVÈSuVÎSvVÑSwVÓSxV×SyVîSzVùS{WS|VÿS}WS~W T!WT"W T#W T$WT%WT&WT'UÇT(WT)W&T*W7T+W8T,WNT-W;T.W@T/WOT0WiT1WÀT2WˆT3WaT4WT5W‰T6W“T7W T8W³T9W¤T:WªT;W°TWÔT?WÒT@WÓTAX TBWÖTCWãTDX TEXTFXTGXrTHX!TIXbTJXKTKXpTLkÀTMXRTNX=TOXyTPX…TQX¹TRXŸTSX«TTXºTUXÞTVX»TWX¸TXX®TYXÅTZXÓT[XÑT\X×T]XÙT^XØT_XåT`XÜTaXäTbXßTcXïTdXúTeXùTfXûTgXüThXýTiYTjY TkYTlYTmh¦TnY%ToY,TpY-TqY2TrY8TsY>TtzÒTuYUTvYPTwYNTxYZTyYXTzYbT{Y`T|YgT}YlT~YiU!YxU"YU#YU$O^U%O«U&Y£U'Y²U(YÆU)YèU*YÜU+YU,YÙU-YÚU.Z%U/ZU0ZU1ZU2Z U3ZU4Z@U5ZlU6ZIU7Z5U8Z6U9ZbU:ZjU;ZšUZËU?ZÂU@Z½UAZãUBZ×UCZæUDZéUEZÖUFZúUGZûUH[ UI[ UJ[UK[2ULZÐUM[*UN[6UO[>UP[CUQ[EUR[@US[QUT[UUU[ZUV[[UW[eUX[iUY[pUZ[sU[[uU\[xU]eˆU^[zU_[€U`[ƒUa[¦Ub[¸Uc[ÃUd[ÇUe[ÉUf[ÔUg[ÐUh[äUi[æUj[âUk[ÞUl[åUm[ëUn[ðUo[öUp[óUq\Ur\Us\Ut\ Uu\Uv\ Uw\"Ux\(Uy\8Uz\9U{\AU|\FU}\NU~\SV!\PV"\OV#[qV$\lV%\nV&NbV'\vV(\yV)\ŒV*\‘V+\”V,Y›V-\«V.\»V/\¶V0\¼V1\·V2\ÅV3\¾V4\ÇV5\ÙV6\éV7\ýV8\úV9\íV:]ŒV;\êV<] V=]V>]V?]\V@]VA]VB]VC]VD]"VE]VF]VG]VH]LVI]RVJ]NVK]KVL]lVM]sVN]vVO]‡VP]„VQ]‚VR]¢VS]VT]¬VU]®VV]½VW]VX]·VY]¼VZ]ÉV[]ÍV\]ÓV]]ÒV^]ÖV_]ÛV`]ëVa]òVb]õVc^ Vd^Ve^Vf^Vg^Vh^6Vi^7Vj^DVk^CVl^@Vm^NVn^WVo^TVp^_Vq^bVr^dVs^GVt^uVu^vVv^zVwž¼Vx^Vy^ Vz^ÁV{^ÂV|^ÈV}^ÐV~^ÏW!^ÖW"^ãW#^ÝW$^ÚW%^ÛW&^âW'^áW(^èW)^éW*^ìW+^ñW,^óW-^ðW.^ôW/^øW0^þW1_W2_ W3_]W4_\W5_ W6_W7_W8_)W9_-W:_8W;_AW<_HW=_LW>_NW?_/W@_QWA_VWB_WWC_YWD_aWE_mWF_sWG_wWH_ƒWI_‚WJ_WK_ŠWL_ˆWM_‘WN_‡WO_žWP_™WQ_˜WR_ WS_¨WT_­WU_¼WV_ÖWW_ûWX_äWY_øWZ_ñW[_ÝW\`³W]_ÿW^`!W_``W``Wa`Wb`)Wc`Wd`1We`Wf`Wg`+Wh`&Wi`Wj`:Wk`ZWl`AWm`jWn`wWo`_Wp`JWq`FWr`MWs`cWt`CWu`dWv`BWw`lWx`kWy`YWz`W{`W|`çW}`ƒW~`šX!`„X"`›X#`–X$`—X%`’X&`§X'`‹X(`áX)`¸X*`àX+`ÓX,`´X-_ðX.`½X/`ÆX0`µX1`ØX2aMX3aX4aX5`öX6`÷X7aX8`ôX9`úX:aX;a!X<`ûX=`ñX>a X?aX@aGXAa>XBa(XCa'XDaJXEa?XFabÆY?dÔY@bÈYAbÜYBbÌYCbÊYDbÂYEbÇYFb›YGbÉYHc YIbîYJbñYKc'YLcYMcYNbïYObõYPcPYQc>YRcMYSdYTcOYUc–YVcŽYWc€YXc«YYcvYZc£Y[cY\c‰Y]cŸY^cµY_ckY`ciYac¾YbcéYccÀYdcÆYecãYfcÉYgcÒYhcöYicÄYjdYkd4YldYmdYnd&Yod6YpeYqdYrd(YsdYtdgYudoYvdvYwdNYxe*Yyd•Yzd“Y{d¥Y|d©Y}dˆY~d¼Z!dÚZ"dÒZ#dÅZ$dÇZ%d»Z&dØZ'dÂZ(dñZ)dçZ*‚ Z+dàZ,dáZ-b¬Z.dãZ/dïZ0e,Z1döZ2dôZ3dòZ4dúZ5eZ6dýZ7eZ8eZ9eZ:e$Z;e#Ze5Z?e7Z@e6ZAe8ZBuKZCeHZDeVZEeUZFeMZGeXZHe^ZIe]ZJerZKexZLe‚ZMeƒZN‹ŠZOe›ZPeŸZQe«ZRe·ZSeÃZTeÆZUeÁZVeÄZWeÌZXeÒZYeÛZZeÙZ[eàZ\eáZ]eñZ^grZ_f Z`fZaeûZbgsZcf5Zdf6Zef4ZffZgfOZhfDZifIZjfAZkf^Zlf]ZmfdZnfgZofhZpf_ZqfbZrfpZsfƒZtfˆZufŽZvf‰Zwf„Zxf˜ZyfZzfÁZ{f¹Z|fÉZ}f¾Z~f¼[!fÄ["f¸[#fÖ[$fÚ[%fà[&f?['fæ[(fé[)fð[*fõ[+f÷[,g[-g[.g[/g&[0g'[1—8[2g.[3g?[4g6[5gA[6g8[7g7[8gF[9g^[:g`[;gY[g‰[?gp[@g©[Ag|[Bgj[CgŒ[Dg‹[Eg¦[Fg¡[Gg…[Hg·[Igï[Jg´[Kgì[Lg³[Mgé[Ng¸[Ogä[PgÞ[QgÝ[Rgâ[Sgî[Tg¹[UgÎ[VgÆ[Wgç[Xjœ[Yh[ZhF[[h)[\h@[]hM[^h2[_hN[`h³[ah+[bhY[chc[dhw[eh[fhŸ[gh[hh­[ih”[jh[kh›[lhƒ[mj®[nh¹[oht[phµ[qh [rhº[si[th[uh~[vi[whÊ[xi[yhØ[zi"[{i&[|há[}i [~hÍ\!hÔ\"hç\#hÕ\$i6\%i\&i\'h×\(hã\)i%\*hù\+hà\,hï\-i(\.i*\/i\0i#\1i!\2hÆ\3iy\4iw\5i\\6ix\7ik\8iT\9i~\:in\;i9\iY\?i0\@ia\Ai^\Bi]\Ci\Dij\Ei²\Fi®\GiÐ\Hi¿\IiÁ\JiÓ\Ki¾\LiÎ\M[è\NiÊ\OiÝ\Pi»\QiÃ\Ri§\Sj.\Ti‘\Ui \Viœ\Wi•\Xi´\YiÞ\Ziè\[j\\j\]iÿ\^k \_iù\`iò\aiç\bj\ci±\dj\eií\fj\gië\hj \ij\jjÁ\kj#\lj\mjD\nj \ojr\pj6\qjx\rjG\sjb\tjY\ujf\vjH\wj8\xj"\yj\zj\{j \|j„\}j¢\~j£]!j—]"†]#j»]$jÃ]%jÂ]&j¸]'j³](j¬])jÞ]*jÑ]+jß],jª]-jÚ].jê]/jû]0k]1†]2jú]3k]4k]5›1]6k]7k8]8k7]9vÜ]:k9];˜î]kI]?kP]@kY]AkT]Bk[]Ck_]Dka]Ekx]Fky]Gk]Hk€]Ik„]Jkƒ]Kk]Lk˜]Mk•]Nkž]Ok¤]Pkª]Qk«]Rk¯]Sk²]Tk±]Uk³]Vk·]Wk¼]XkÆ]YkË]ZkÓ][kß]\kì]]kë]^kó]_kï]`ž¾]al]bl]cl]dl]el$]fl#]gl^]hlU]ilb]jlj]kl‚]ll]mlš]nl]ol›]pl~]qlh]rls]sl’]tl]ulÄ]vlñ]wlÓ]xl½]yl×]zlÅ]{lÝ]|l®]}l±]~l¾^!lº^"lÛ^#lï^$lÙ^%lê^&m^'ˆM^(m6^)m+^*m=^+m8^,m^-m5^.m3^/m^0m ^1mc^2m“^3md^4mZ^5my^6mY^7mŽ^8m•^9oä^:m…^;mù^mµ^?mÇ^@mæ^Am¸^BmÆ^Cmì^DmÞ^EmÌ^Fmè^GmÒ^HmÅ^Imú^JmÙ^Kmä^LmÕ^Mmê^Nmî^On-^Pnn^Qn.^Rn^Snr^Tn_^Un>^Vn#^Wnk^Xn+^Ynv^ZnM^[n^\nC^]n:^^nN^_n$^`nÿ^an^bn8^cn‚^dnª^en˜^fnÉ^gn·^hnÓ^in½^jn¯^knÄ^ln²^mnÔ^nnÕ^on^pn¥^qnÂ^rnŸ^soA^to^upL^vnì^wnø^xnþ^yo?^znò^{o1^|nï^}o2^~nÌ_!o>_"o_#n÷_$o†_%oz_&ox_'o_(o€_)oo_*o[_+oó_,om_-o‚_.o|_/oX_0oŽ_1o‘_2oÂ_3of_4o³_5o£_6o¡_7o¤_8o¹_9oÆ_:oª_;oß_oÔ_?oØ_@oñ_Aoî_BoÛ_Cp _Dp _Eoú_Fp_Gp_Hp_Ioþ_Jp_Kp_Lot_Mp_Np_Op_Pp0_Qp>_Rp2_SpQ_Tpc_Up™_Vp’_Wp¯_Xpñ_Yp¬_Zp¸_[p³_\p®_]pß_^pË__pÝ_`pÙ_aq _bpý_cq_dq_eqe_fqU_gqˆ_hqf_iqb_jqL_kqV_lql_mq_nqû_oq„_pq•_qq¨_rq¬_sq×_tq¹_uq¾_vqÒ_wqÉ_xqÔ_yqÎ_zqà_{qì_|qç_}qõ_~qü`!qù`"qÿ`#r `$r`%r`&r(`'r-`(r,`)r0`*r2`+r;`,r<`-r?`.r@`/rF`0rK`1rX`2rt`3r~`4r‚`5r`6r‡`7r’`8r–`9r¢`:r§`;r¹`rÆ`?rÄ`@rÎ`ArÒ`Brâ`Crà`Drá`Erù`Fr÷`GP`Hs`Is `Js`Ks`Ls`Ms4`Ns/`Os)`Ps%`Qs>`RsN`SsO`TžØ`UsW`Vsj`Wsh`Xsp`Ysx`Zsu`[s{`\sz`]sÈ`^s³`_sÎ``s»`asÀ`bså`csî`dsÞ`et¢`ft`gto`ht%`isø`jt2`kt:`ltU`mt?`nt_`otY`ptA`qt\`rti`stp`ttc`utj`vtv`wt~`xt‹`ytž`zt§`{tÊ`|tÏ`}tÔ`~sña!tàa"tãa#tça$téa%tîa&tòa'tða(tña)tøa*t÷a+ua,ua-ua.u a/ua0u a1ua2ua3ua4u&a5u,a6uuia?uda@ugaAukaBumaCuxaDuvaEu†aFu‡aGutaHuŠaIu‰aJu‚aKu”aLušaMuaNu¥aOu£aPuÂaQu³aRuÃaSuµaTu½aUu¸aVu¼aWu±aXuÍaYuÊaZuÒa[uÙa\uãa]uÞa^uþa_uÿa`uüaavabuðacuúaduòaeuóafv agv ahv aivajv'akv alv!amv"anv$aov4apv0aqv;arvGasvHatvFauv\avvXawvaaxvbayvhazvia{vja|vga}vla~vpb!vrb"vvb#vxb$v|b%v€b&vƒb'vˆb(v‹b)vŽb*v–b+v“b,v™b-všb.v°b/v´b0v¸b1v¹b2vºb3vÂb4vÍb5vÖb6vÒb7vÞb8váb9våb:vçb;vêb<†/b=vûb>wb?wb@wbAw)bBw$bCwbDw%bEw&bFwbGw7bHw8bIwGbJwZbKwhbLwkbMw[bNwebOwbPw~bQwybRwŽbSw‹bTw‘bUw bVwžbWw°bXw¶bYw¹bZw¿b[w¼b\w½b]w»b^wÇb_wÍb`w×bawÚbbwÜbcwãbdwîbewübfx bgxbhy&bix bjy*bkxEblxŽbmxtbnx†box|bpxšbqxŒbrx£bsxµbtxªbux¯bvxÑbwxÆbxxËbyxÔbzx¾b{x¼b|xÅb}xÊb~xìc!xçc"xÚc#xýc$xôc%yc&yc'yc(yc)y,c*y+c+y@c,y`c-yWc.y_c/yZc0yUc1ySc2yzc3yc4yŠc5yc6y§c7ŸKc8yªc9y®c:y³c;y¹cyÕc?yçc@yìcAyácByãcCzcDz cEzcFzcGz cHzcIy€cJz1cKz;cLz>cMz7cNzCcOzWcPzIcQzacRzbcSzicTŸcUzpcVzycWz}cXzˆcYz—cZz•c[z˜c\z–c]z©c^zÈc_z°c`z¶cazÅcbzÄccz¿cdƒcezÇcfzÊcgzÍchzÏcizÕcjzÓckzÙclzÚcmzÝcnzácozâcpzæcqzícrzðcs{ct{cu{ cv{cw{3cx{cy{cz{c{{5c|{(c}{6c~{Pd!{zd"{d#{Md${ d%{Ld&{Ed'{ud({ed){td*{gd+{pd,{qd-{ld.{nd/{d0{˜d1{Ÿd2{d3{œd4{šd5{‹d6{’d7{d8{]d9{™d:{Ëd;{Ád<{Ìd={Ïd>{´d?{Æd@{ÝdA{édB|dC|dD{ædE{ådF|`dG|dH|dI|dJ{ódK{÷dL|dM| dN{ödO|#dP|'dQ|*dR|dS|7dT|+dU|=dV|LdW|CdX|TdY|OdZ|@d[|Pd\|Xd]|_d^|dd_|Vd`|eda|ldb|udc|ƒdd|de|¤df|­dg|¢dh|«di|¡dj|¨dk|³dl|²dm|±dn|®do|¹dp|½dq|Àdr|Åds|Âdt|Ødu|Òdv|Üdw|âdx›;dy|ïdz|òd{|ôd||öd}|úd~}e!}e"}e#}e$} e%}Ee&}Ke'}.e(}2e)}?e*}5e+}Fe,}se-}Ve.}Ne/}re0}he1}ne2}Oe3}ce4}“e5}‰e6}[e7}e8}}e9}›e:}ºe;}®e<}£e=}µe>}Çe?}½e@}«eA~=eB}¢eC}¯eD}ÜeE}¸eF}ŸeG}°eH}ØeI}ÝeJ}äeK}ÞeL}ûeM}òeN}áeO~eP~ eQ~#eR~!eS~eT~1eU~eV~ eW~ eX~"eY~FeZ~fe[~;e\~5e]~9e^~Ce_~7e`~2ea~:eb~gec~]ed~Vee~^ef~Yeg~Zeh~yei~jej~iek~|el~{em~ƒen}Õeo~}ep®eq~er~ˆes~‰et~Œeu~’ev~ew~“ex~”ey~–ez~Že{~›e|~œe}8e~:f!Ef"Lf#Mf$Nf%Pf&Qf'Uf(Tf)Xf*_f+`f,hf-if.gf/xf0‚f1†f2ƒf3ˆf4‡f5Œf6”f7žf8f9šf:£f;¯f<²f=¹f>®f?¶f@¸fA‹qfBÅfCÆfDÊfEÕfFÔfGáfHæfIéfJófKùfL˜ÜfM€fN€fO€ fP€fQ€fR€fS€fT€!fU€(fV€?fW€;fX€JfY€FfZ€Rf[€Xf\€Zf]€_f^€bf_€hf`€sfa€rfb€pfc€vfd€yfe€}ff€fg€„fh€†fi€…fj€›fk€“fl€šfm€­fnQfo€¬fp€Ûfq€åfr€Ùfs€Ýft€Äfu€Úfv€Öfw fx€ïfy€ñfzf{)f|#f}/f~Kg!–‹g"Fg#>g$Sg%Qg&€üg'qg(ng)eg*fg+tg,ƒg-ˆg.Šg/€g0‚g1 g2•g3¤g4£g5_g6“g7©g8°g9µg:¾g;¸g<½g=Àg>Âg?ºg@ÉgAÍgBÑgCÙgDØgEÈgFÚgGßgHàgIçgJúgKûgLþgM‚gN‚gO‚gP‚gQ‚ gR‚ gS‚gT‚gU‚)gV‚+gW‚8gX‚3gY‚@gZ‚Yg[‚Xg\‚]g]‚Zg^‚_g_‚dg`‚bga‚hgb‚jgc‚kgd‚.ge‚qgf‚wgg‚xgh‚~gi‚gj‚’gk‚«gl‚Ÿgm‚»gn‚¬go‚ágp‚ãgq‚ßgr‚Ògs‚ôgt‚ógu‚úgvƒ“gwƒgx‚ûgy‚ùgz‚Þg{ƒg|‚Üg}ƒ g~‚Ùh!ƒ5h"ƒ4h#ƒh$ƒ2h%ƒ1h&ƒ@h'ƒ9h(ƒPh)ƒEh*ƒ/h+ƒ+h,ƒh-ƒh.ƒ…h/ƒšh0ƒªh1ƒŸh2ƒ¢h3ƒ–h4ƒ#h5ƒŽh6ƒ‡h7ƒŠh8ƒ|h9ƒµh:ƒsh;ƒuh<ƒ h=ƒ‰h>ƒ¨h?ƒôh@„hAƒëhBƒÎhCƒýhD„hEƒØhF„ hGƒÁhHƒ÷hI„hJƒàhKƒòhL„ hM„"hN„ hOƒ½hP„8hQ…hRƒûhS„mhT„*hU„† i?†i@† iA…þiB…úiC†iD†"iE†iF†0iG†?iH†MiINUiJ†TiK†_iL†giM†qiN†“iO†£iP†©iQ†ªiR†‹iS†ŒiT†¶iU†¯iV†ÄiW†ÆiX†°iY†ÉiZˆ#i[†«i\†Ôi]†Þi^†éi_†ìi`†ßia†Ûib†ïic‡id‡ie‡if‡ig‡ih†ûii‡ij‡ ik‡ il†ùim‡ in‡4io‡?ip‡7iq‡;ir‡%is‡)it‡iu‡`iv‡_iw‡xix‡Liy‡Niz‡ti{‡Wi|‡hi}‡ni~‡Yj!‡Sj"‡cj#‡jj$ˆj%‡¢j&‡Ÿj'‡‚j(‡¯j)‡Ëj*‡½j+‡Àj,‡Ðj-–Öj.‡«j/‡Äj0‡³j1‡Çj2‡Æj3‡»j4‡ïj5‡òj6‡àj7ˆj8ˆ j9‡þj:‡öj;‡÷j<ˆj=‡Òj>ˆj?ˆj@ˆjAˆ"jBˆ!jCˆ1jDˆ6jEˆ9jFˆ'jGˆ;jHˆDjIˆBjJˆRjKˆYjLˆ^jMˆbjNˆkjOˆjPˆ~jQˆžjRˆujSˆ}jTˆµjUˆrjVˆ‚jWˆ—jXˆ’jYˆ®jZˆ™j[ˆ¢j\ˆj]ˆ¤j^ˆ°j_ˆ¿j`ˆ±jaˆÃjbˆÄjcˆÔjdˆØjeˆÙjfˆÝjgˆùjh‰jiˆüjjˆôjkˆèjlˆòjm‰jn‰ jo‰ jp‰jq‰Cjr‰js‰%jt‰*ju‰+jv‰Ajw‰Djx‰;jy‰6jz‰8j{‰Lj|‰j}‰`j~‰^k!‰fk"‰dk#‰mk$‰jk%‰ok&‰tk'‰wk(‰~k)‰ƒk*‰ˆk+‰Šk,‰“k-‰˜k.‰¡k/‰©k0‰¦k1‰¬k2‰¯k3‰²k4‰ºk5‰½k6‰¿k7‰Àk8‰Úk9‰Ük:‰Ýk;‰çk<‰ôk=‰øk>Šk?Šk@ŠkAŠ kBŠkCŠkDŠ%kEŠ6kFŠAkGŠ[kHŠRkIŠFkJŠHkKŠ|kLŠmkMŠlkNŠbkOŠ…kPŠ‚kQŠ„kRЍkSŠ¡kTŠ‘kUŠ¥kVЦkWŠškXŠ£kYŠÄkZŠÍk[ŠÂk\ŠÚk]Šëk^Šók_Šçk`ŠäkaŠñkb‹kcŠàkdŠâkeŠ÷kfŠÞkgŠÛkh‹ ki‹kj‹kkŠákl‹km‹kn‹ko‹ kp‹3kq—«kr‹&ks‹+kt‹>ku‹(kv‹Akw‹Lkx‹Oky‹Nkz‹Ik{‹Vk|‹[k}‹Zk~‹kl!‹_l"‹ll#‹ol$‹tl%‹}l&‹€l'‹Œl(‹Žl)‹’l*‹“l+‹–l,‹™l-‹šl.Œ:l/ŒAl0Œ?l1ŒHl2ŒLl3ŒNl4ŒPl5ŒUl6Œbl7Œll8Œxl9Œzl:Œ‚l;Œ‰l<Œ…l=ŒŠl>Œl?ŒŽl@Œ”lAŒ|lBŒ˜lCblDŒ­lEŒªlFŒ½lGŒ²lHŒ³lIŒ®lJŒ¶lKŒÈlLŒÁlMŒälNŒãlOŒÚlPŒýlQŒúlRŒûlSlTlU lVlWlX lYlZŸNl[l\ŒÍl]l^l_gl`mlaqlbslcld™leÂlf¾lgºlhÏliÚljÖlkÌllÛlmËlnêloëlpßlqãlrülsŽltŽ luÿlvŽlwŽlxŽlyŽlzŽBl{Ž5l|Ž0l}Ž4l~ŽJm!ŽGm"ŽIm#ŽLm$ŽPm%ŽHm&ŽYm'Ždm(Ž`m)Ž*m*Žcm+ŽUm,Žvm-Žrm.Ž|m/Žm0އm1Ž…m2Ž„m3Ž‹m4ŽŠm5Ž“m6Ž‘m7Ž”m8Ž™m9Žªm:Ž¡m;ެm<ްm=ŽÆm>ޱm?޾m@ŽÅmAŽÈmBŽËmCŽÛmDŽãmEŽümFŽûmGŽëmHŽþmI mJmKmLmMmNmOmPmQmR mS&mT3mU;mV9mWEmXBmY>mZLm[Im\Fm]Nm^Wm_\m`bmacmbdmcœmdŸme£mf­mg¯mh·miÚmjåmkâmlêmmïmn‡moômpmqùmrúmsmtmu!mv mwmxmy mz'm{6m|5m}9m~øn!On"Pn#Qn$Rn%n&In'>n(Vn)Xn*^n+hn,on-vn.–¨n/rn0‚n1}n2n3€n4Šn5‰n6n7¨n8¯n9±n:µn;ân<än=bHn>Ûn?‘n@‘nA‘nB‘2nC‘0nD‘JnE‘VnF‘XnG‘cnH‘enI‘inJ‘snK‘rnL‘‹nM‘‰nN‘‚nO‘¢nP‘«nQ‘¯nR‘ªnS‘µnT‘´nU‘ºnV‘ÀnW‘ÁnX‘ÉnY‘ËnZ‘Ðn[‘Ön\‘ßn]‘án^‘Ûn_‘ün`‘õna‘önb’nc‘ÿnd’ne’,nf’ng’nh’^ni’Wnj’Enk’Inl’dnm’Hnn’•no’?np’Knq’Pnr’œns’–nt’“nu’›nv’Znw’Ïnx’¹ny’·nz’én{“n|’ún}“Dn~“.o!“o"“"o#“o$“#o%“:o&“5o'“;o(“\o)“`o*“|o+“no,“Vo-“°o.“¬o/“­o0“”o1“¹o2“Öo3“×o4“èo5“åo6“Øo7“Ão8“Ýo9“Ðo:“Èo;“äo<”o=”o>”o?”o@”oA”oB”6oC”+oD”5oE”!oF”:oG”AoH”RoI”DoJ”[oK”`oL”boM”^oN”joO’)oP”poQ”uoR”woS”}oT”ZoU”|oV”~oW”oX”oY•‚oZ•‡o[•Šo\•”o]•–o^•˜o_•™o`• oa•¨ob•§oc•­od•¼oe•»of•¹og•¾oh•Êoioöoj•Ãok•Íol•Ìom•Õon•Ôoo•Öop•Üoq•áor•åos•âot–!ou–(ov–.ow–/ox–Boy–Loz–Oo{–Ko|–wo}–\o~–^p!–]p"–_p#–fp$–rp%–lp&–p'–˜p(–•p)–—p*–ªp+–§p,–±p-–²p.–°p/–´p0–¶p1–¸p2–¹p3–Îp4–Ëp5–Ép6–Íp7‰Mp8–Üp9— p:–Õp;–ùp<—p=—p>—p?—p@—pA—pB—pC—pD—pE—$pF—*pG—0pH—9pI—=pJ—>pK—DpL—FpM—HpN—BpO—IpP—\pQ—`pR—dpS—fpT—hpURÒpV—kpW—qpX—ypY—…pZ—|p[—p\—zp]—†p^—‹p_—p`—pa—œpb—¨pc—¦pd—£pe—³pf—´pg—Ãph—Æpi—Èpj—Ëpk—Üpl—ípmŸOpn—òpozßpp—öpq—õpr˜ps˜ pt˜8pu˜$pv˜!pw˜7px˜=py˜Fpz˜Op{˜Kp|˜kp}˜op~˜pq!˜qq"˜tq#˜sq$˜ªq%˜¯q&˜±q'˜¶q(˜Äq)˜Ãq*˜Æq+˜éq,˜ëq-™q.™ q/™q0™q1™q2™!q3™q4™q5™$q6™ q7™,q8™.q9™=q:™>q;™Bq<™Iq=™Eq>™Pq?™Kq@™QqA™RqB™LqC™UqD™—qE™˜qF™¥qG™­qH™®qI™¼qJ™ßqK™ÛqL™ÝqM™ØqN™ÑqO™íqP™îqQ™ñqR™òqS™ûqT™øqUšqVšqWšqX™âqYšqZš+q[š7q\šEq]šBq^š@q_šCq`š>qašUqbšMqcš[qdšWqeš_qfšbqgšeqhšdqišiqjškqkšjqlš­qmš°qnš¼qošÀqpšÏqqšÑqršÓqsšÔqtšÞqušßqvšâqwšãqxšæqyšïqzšëq{šîq|šôq}šñq~š÷r!šûr"›r#›r$›r%›r&›"r'›#r(›%r)›'r*›(r+›)r,›*r-›.r.›/r/›2r0›Dr1›Cr2›Or3›Mr4›Nr5›Qr6›Xr7›tr8›“r9›ƒr:›‘r;›–r<›—r=›Ÿr>› r?›¨r@›´rA›ÀrB›ÊrC›¹rD›ÆrE›ÏrF›ÑrG›ÒrH›ãrI›ârJ›ärK›ÔrL›árMœ:rN›òrO›ñrP›ðrQœrRœrSœ rTœrUœ rVœrWœrXœrYœ rZœr[œ.r\œr]œ%r^œ$r_œ!r`œ0raœGrbœ2rcœFrdœ>reœZrfœ`rgœgrhœvriœxrjœçrkœìrlœðrm rnroœërprqrr*rs&rt¯ru#rvrwDrxryrzAr{?r|>r}Fr~Hs!]s"^s#ds$Qs%Ps&Ys'rs(‰s)‡s*«s+os,zs-šs.¤s/©s0²s1Äs2Ás3»s4¸s5ºs6Æs7Ïs8Âs9Ùs:Ós;øs<æs=ís>ïs?ýs@žsAžsBžsCžusDžysEž}sFžsGžˆsHž‹sIžŒsJž’sKž•sLž‘sMžsNž¥sOž©sPž¸sQžªsRž­sS—asTžÌsUžÎsVžÏsWžÐsXžÔsYžÜsZžÞs[žÝs\žàs]žås^žès_žïs`žôsažösbž÷scžùsdžûsežüsfžýsgŸshŸsiv·sjŸskŸ!slŸ,smŸ>snŸJsoŸRspŸTsqŸcsrŸ_ssŸ`stŸasuŸfsvŸgswŸlsxŸjsyŸwszŸrs{Ÿvs|Ÿ•s}Ÿœs~Ÿ t!X/t"iÇt#Yt$tdt%QÜt&q™screen-5.0.2/utf8encodings/010000664000175000017500000007216015224432722014377 0ustar alexalexScreenI2UTF8GB 2312-80!!0!"0!#0!$0û!%É!&Ç!'¨!(0!)0!* !+ÿ^!, !- &!. !/ !0 !1 !20!30!40!50 !60 !70 !80 !90 !:0!;0!<0!=0!>0!?0!@±!A×!B÷!C"6!D"'!E"(!F"!G"!H"*!I")!J"!K"7!L"!M"¥!N"%!O" !P#!Q"™!R"+!S".!T"a!U"L!V"H!W"=!X"!Y"`!Z"n!["o!\"d!]"e!^"!_"5!`"4!a&B!b&@!c°!d 2!e 3!f!!gÿ!h¤!iÿà!jÿá!k 0!l§!m!!n&!o&!p%Ë!q%Ï!r%Î!s%Ç!t%Æ!u%¡!v% !w%³!x%²!y ;!z!’!{!!|!‘!}!“!~0"1$ˆ"2$‰"3$Š"4$‹"5$Œ"6$"7$Ž"8$"9$":$‘";$’"<$“"=$”">$•"?$–"@$—"A$˜"B$™"C$š"D$›"E$t"F$u"G$v"H$w"I$x"J$y"K$z"L${"M$|"N$}"O$~"P$"Q$€"R$"S$‚"T$ƒ"U$„"V$…"W$†"X$‡"Y$`"Z$a"[$b"\$c"]$d"^$e"_$f"`$g"a$h"b$i"e2 "f2!"g2""h2#"i2$"j2%"k2&"l2'"m2("n2)"q!`"r!a"s!b"t!c"u!d"v!e"w!f"x!g"y!h"z!i"{!j"|!k#!ÿ#"ÿ##ÿ#$ÿå#%ÿ#&ÿ#'ÿ#(ÿ#)ÿ #*ÿ #+ÿ #,ÿ #-ÿ #.ÿ#/ÿ#0ÿ#1ÿ#2ÿ#3ÿ#4ÿ#5ÿ#6ÿ#7ÿ#8ÿ#9ÿ#:ÿ#;ÿ#<ÿ#=ÿ#>ÿ#?ÿ#@ÿ #Aÿ!#Bÿ"#Cÿ##Dÿ$#Eÿ%#Fÿ&#Gÿ'#Hÿ(#Iÿ)#Jÿ*#Kÿ+#Lÿ,#Mÿ-#Nÿ.#Oÿ/#Pÿ0#Qÿ1#Rÿ2#Sÿ3#Tÿ4#Uÿ5#Vÿ6#Wÿ7#Xÿ8#Yÿ9#Zÿ:#[ÿ;#\ÿ<#]ÿ=#^ÿ>#_ÿ?#`ÿ@#aÿA#bÿB#cÿC#dÿD#eÿE#fÿF#gÿG#hÿH#iÿI#jÿJ#kÿK#lÿL#mÿM#nÿN#oÿO#pÿP#qÿQ#rÿR#sÿS#tÿT#uÿU#vÿV#wÿW#xÿX#yÿY#zÿZ#{ÿ[#|ÿ\#}ÿ]#~ÿã$!0A$"0B$#0C$$0D$%0E$&0F$'0G$(0H$)0I$*0J$+0K$,0L$-0M$.0N$/0O$00P$10Q$20R$30S$40T$50U$60V$70W$80X$90Y$:0Z$;0[$<0\$=0]$>0^$?0_$@0`$A0a$B0b$C0c$D0d$E0e$F0f$G0g$H0h$I0i$J0j$K0k$L0l$M0m$N0n$O0o$P0p$Q0q$R0r$S0s$T0t$U0u$V0v$W0w$X0x$Y0y$Z0z$[0{$\0|$]0}$^0~$_0$`0€$a0$b0‚$c0ƒ$d0„$e0…$f0†$g0‡$h0ˆ$i0‰$j0Š$k0‹$l0Œ$m0$n0Ž$o0$p0$q0‘$r0’$s0“%!0¡%"0¢%#0£%$0¤%%0¥%&0¦%'0§%(0¨%)0©%*0ª%+0«%,0¬%-0­%.0®%/0¯%00°%10±%20²%30³%40´%50µ%60¶%70·%80¸%90¹%:0º%;0»%<0¼%=0½%>0¾%?0¿%@0À%A0Á%B0Â%C0Ã%D0Ä%E0Å%F0Æ%G0Ç%H0È%I0É%J0Ê%K0Ë%L0Ì%M0Í%N0Î%O0Ï%P0Ð%Q0Ñ%R0Ò%S0Ó%T0Ô%U0Õ%V0Ö%W0×%X0Ø%Y0Ù%Z0Ú%[0Û%\0Ü%]0Ý%^0Þ%_0ß%`0à%a0á%b0â%c0ã%d0ä%e0å%f0æ%g0ç%h0è%i0é%j0ê%k0ë%l0ì%m0í%n0î%o0ï%p0ð%q0ñ%r0ò%s0ó%t0ô%u0õ%v0ö&!‘&"’&#“&$”&%•&&–&'—&(˜&)™&*š&+›&,œ&-&.ž&/Ÿ&0 &1¡&2£&3¤&4¥&5¦&6§&7¨&8©&A±&B²&C³&D´&Eµ&F¶&G·&H¸&I¹&Jº&K»&L¼&M½&N¾&O¿&PÀ&QÁ&RÃ&SÄ&TÅ&UÆ&VÇ&WÈ&XÉ'!'"'#'$'%'&'''(')'*'+','-'.'/'0'1'2 '3!'4"'5#'6$'7%'8&'9'':(';)'<*'=+'>,'?-'@.'A/'Q0'R1'S2'T3'U4'V5'WQ'X6'Y7'Z8'[9'\:'];'^<'_='`>'a?'b@'cA'dB'eC'fD'gE'hF'iG'jH'kI'lJ'mK'nL'oM'pN'qO(!("á(#Î($à(%(&é('((è()+(*í(+Ð(,ì(-M(.ó(/Ò(0ò(1k(2ú(3Ô(4ù(5Ö(6Ø(7Ú(8Ü(9ü(:ê(E1(F1(G1(H1(I1 (J1 (K1 (L1 (M1 (N1(O1(P1(Q1(R1(S1(T1(U1(V1(W1(X1(Y1(Z1([1(\1(]1(^1(_1(`1 (a1!(b1"(c1#(d1$(e1%(f1&(g1'(h1((i1))$%)%%)&%)'%)(%))%)*%)+%),%)-% ).% )/% )0% )1% )2%)3%)4%)5%)6%)7%)8%)9%):%);%)<%)=%)>%)?%)@%)A%)B%)C%)D% )E%!)F%")G%#)H%$)I%%)J%&)K%')L%()M%))N%*)O%+)P%,)Q%-)R%.)S%/)T%0)U%1)V%2)W%3)X%4)Y%5)Z%6)[%7)\%8)]%9)^%:)_%;)`%<)a%=)b%>)c%?)d%@)e%A)f%B)g%C)h%D)i%E)j%F)k%G)l%H)m%I)n%J)o%K0!UJ0"–?0#WÃ0$c(0%TÎ0&U 0'TÀ0(v‘0)vL0*…<0+wî0,‚~0-x0.r10/–˜00—01l(02[‰03Oú04c 05f—06\¸07€ú08hH09€®0:f0;vÎ0q¬0?ñ0@ˆ„0AP²0BYe0CaÊ0Do³0E‚­0FcL0GbR0HSí0IT'0J{0KQk0Lu¤0M]ô0NbÔ0OË0P—v0QbŠ0R€0SW]0T—80Ub0Vr80Wv}0XgÏ0Yv~0ZdF0[Op0\%0]bÜ0^z0_e‘0`sí0ad,0bbs0c‚,0d˜0eg0frH0gbn0hbÌ0iO40jtã0kSJ0lRž0m~Ê0n¦0o^.0ph†0qiœ0r€0s~Ñ0thÒ0uxÅ0v†Œ0w•Q0xP0yŒ$0z‚Þ0{€Þ0|S0}‰0~Re1!…„1"–ù1#OÝ1$X!1%™q1&[1'b±1(b¥1)f´1*Œy1+œ1,r1-go1.x‘1/`²10SQ11S12ˆ13€Ì1415”¡16P 17rÈ18Y19`ë1:q1;ˆ«1g,1?{(1@])1A~÷1Bu-1Clõ1DŽf1Eø1F<1GŸ;1HkÔ1I‘1J{1K_|1Lx§1M„Ö1N…=1OkÕ1PkÙ1QkÖ1R^1S^‡1Tuù1U•í1Ve]1W_ 1X_Å1YŸ1ZXÁ1[Â1\1]–[1^—­1_¹1`1a,1bbA1cO¿1dSØ1eS^1f¨1g©1h«1iM1jh1k_j1l˜1mˆh1nœÖ1oa‹1pR+1qv*1r_l1seŒ1toÒ1unè1v[¾1wdH1xQu1yQ°1zgÄ1{N1|yÉ1}™|1~p³2!uÅ2"^v2#s»2$ƒà2%d­2&bè2'”µ2(lâ2)SZ2*RÃ2+d2,”Â2-{”2.O/2/^20‚62122Š23n$24lÊ25šs26cU27S\28Tú29ˆe2:Wà2;N 2<^2=ke2>|?2?è2@`2Adæ2Bs2CˆÁ2DgP2EbM2F"2Gwl2HŽ)2I‘Ç2J_i2KƒÜ2L…!2M™2NSÂ2O†•2Pk‹2Q`í2R`è2Sp2T‚Í2U‚12VNÓ2Wl§2X…Ï2YdÍ2Z|Ù2[iý2\fù2]ƒI2^S•2_{V2`O§2aQŒ2bmK2c\B2dŽm2ecÒ2fSÉ2gƒ,2hƒ62igå2jx´2kd=2l[ß2m\”2n]î2o‹ç2pbÆ2qgô2rŒz2sd2tcº2u‡I2v™‹2wŒ2x 2y”ò2zN§2{–2|˜¤2}f 2~s3!W:3"\3#^83$•3%P3&€ 3'S‚3(e^3)uE3*U13+P!3,…3-b„3.”ž3/g30V231on32]â33T534p’35f36bo37d¤38c£39_{3:oˆ3;ô3<ã3=°3>\3?fh3@_ñ3Al‰3B–H3C3Dˆl3Ed‘3Fyð3GWÎ3HjY3Ib3JTH3KNX3Lz 3M`é3No„3O‹Ú3Pb3Q3Rš‹3Syä3TT3Uuô3Vc3WS3Xl`3Yß3Z_3[šp3\€;3]Ÿ3^Oˆ3_\:3`d3aÅ3be¥3cp½3dQE3eQ²3f†k3g]3h[ 3ib½3j‘l3kut3lŽ 3mz 3na3o{y3pNÇ3q~ø3rw…3sN3tí3uR3vQú3wjq3xS¨3yއ3z•3{–Ï3|nÁ3}–d3~iZ4!x@4"P¨4#w×4$d4%‰æ4&Y4'cã4(]Ý4)z4*i=4+O 4,‚94-U˜4.N24/u®40z—41^b42^Š43•ï44R45T946pŠ47cv48•$49W‚4:f%4;i?4<‘‡4=U4>mó4?~¯4@ˆ"4Ab34B~ð4Cuµ4Dƒ(4ExÁ4F–Ì4Gž4HaH4It÷4J‹Í4Kkd4LR:4MP4Nk!4O€j4P„q4QVñ4RS4SNÎ4TN4UQÑ4V|—4W‘‹4X|4YOÃ4ZŽ4[{á4\zœ4]dg4^]4_P¬4`4av4b|¹4cmì4dà4egQ4f[X4g[ø4hxË4id®4jd4kcª4lc+4m•4nd-4o¾4p{T4qv)4rbS4sY'4tTF4uky4vP£4wb44x^&4yk†4zNã4{74|ˆ‹4}_…4~.5!` 5"€=5#bÅ5$N95%SU5&ø5'c¸5(€Æ5)eæ5*l.5+OF5,`î5-má5.‹Þ5/_950†Ë51_S52c!53QZ54ƒa55hc56R57cc58ŽH59P5:\›5;yw5<[ü5=R05>z;5?`¼5@S5Av×5B_·5C_—5Dv„5EŽl5Fpo5Gv{5H{I5Iwª5JQó5K“5LX$5MON5Nnô5Oê5PeL5Q{5RrÄ5Sm¤5Tß5UZá5Vbµ5W^•5XW05Y„‚5Z{,5[^5\_5]5^5_˜ 5`c‚5anÇ5bx˜5cp¹5dQx5e—[5fW«5gu55hOC5iu85j^—5k`æ5lY`5mmÀ5nk¿5ox‰5pSü5q–Õ5rQË5sR5tc‰5uT 5v”“5wŒ5xÌ5yr95zxŸ5{‡v5|í5}Œ 5~Sà6!N6"vï6#Sî6$”‰6%˜v6&Ÿ6'•-6([š6)‹¢6*N"6+N6,Q¬6-„c6.aÂ6/R¨60h 61O—62`k63Q»64m65Q\66b–67e—68–a69ŒF6:6;uØ6<ý6=wc6>kÒ6?rŠ6@rì6A‹û6BX56Cwy6DL6Eg\6F•@6G€š6H^¦6In!6JY’6Kzï6Lwí6M•;6Nkµ6Oe­6P6QX6RQQ6S–6T[ù6UX©6VT(6WŽr6Xef6Y˜6ZVä6[”6\vþ6]A6^c‡6_TÆ6`Y6aY:6bW›6c޲6dg56eú6f‚56gRA6h`ð6iX6j†þ6k\è6lžE6mOÄ6n˜6o‹¹6pZ%6q`v6rS„6sb|6tO6u‘6v™6w`i6x€ 6yQ?6z€36{\6|™u6}m16~NŒ7!07"SÑ7#Z7${O7%O7&NO7'–7(lÕ7)sÐ7*…é7+^7,uj7-û7.j 7/wþ70”’71~A72Qá73pæ74SÍ75Ô76ƒ77)78r¯79™m7:lÛ7;WJ7<‚³7=e¹7>€ª7?b?7@–27AY¨7BNÿ7C‹¿7D~º7Ee>7Fƒò7G—^7HUa7I˜Þ7J€¥7KS*7L‹ý7MT 7N€º7O^Ÿ7Pl¸7Q97R‚¬7S‘Z7TT)7Ul7VR7W~·7XW_7Yq7Zl~7[|‰7\YK7]Ný7^_ÿ7_a$7`|ª7aN07b\7cg«7d‡7e\ð7f• 7g˜Î7hu¯7ipý7j"7kQ¯7l7m‹½7nYI7oQä7pO[7qT&7rY+7sew7t€¤7u[u7vbv7wbÂ7x7y^E7zl7{{&7|O7}OØ7~g 8!mn8"mª8#y8$ˆ±8%_8&u+8'bš8(…8)Oï8*‘Ü8+e§8,/8-Q8.^œ8/P80t81Ro82‰†83K84Y 85P…86NØ87–88r689y8:8;[Ì8<‹£8=–D8>Y‡8?8@T8AVv8BV8C‹å8De98Ei‚8F”™8GvÖ8Hn‰8I^r8Ju8KgF8LgÑ8Mzÿ8N€8Ov8Pa8QyÆ8Reb8Sc8TQˆ8UR8V”¢8W88X€›8Y~²8Z\—8[n/8\g`8]{Ù8^v‹8_šØ8`8a”8b|Õ8cd8d•P8ez?8fTJ8gTå8hkL8id8jb8kž=8l€ó8mu™8nRr8o—i8p„[8qh<8r†ä8s–8t–”8u”ì8vN*8wT8x~Ù8yh98zß8{€8|fô8}^š8~¹9!WÂ9"€?9#h—9$]å9%e;9&RŸ9'`m9(Ÿš9)O›9*ެ9+Ql9,[«9-_9.]é9/l^90bñ91!92Qq93”©94Rþ95lŸ96‚ß97r×98W¢99g„9:-9;Y9<œ9=ƒÇ9>T•9?{9@O09Al½9B[d9CYÑ9DŸ9ESä9F†Ê9Gš¨9HŒ79I€¡9JeE9K˜~9LVú9M–Ç9NR.9OtÜ9PRP9Q[á9Rc9S‰9TNV9UbÐ9V`*9Whú9XQs9Y[˜9ZQ 9[‰Â9\{¡9]™†9^P9_`ï9`pL9a/9bQI9c^9d9etp9f‰Ä9gW-9hxE9i_R9jŸŸ9k•ú9lh9m›<9n‹á9ovx9phB9qgÜ9rê9s59tR=9uŠ9vnÚ9whÍ9x•9yí9zVý9{gœ9|ˆù9}Ç9~TÈ:!š¸:"[i:#mw:$l&:%N¥:&[³:'š‡:(‘c:)a¨:*¯:+—é:,T+:-mµ:.[Ò:/Qý:0UŠ:1U:2ð:3d¼:4cM:5eñ:6a¾:7`:8q :9lW::lI:;Y/:XÕ:?VŽ:@Œj:Akë:BÝ:CY}:D€:ES÷:Fmi:GTu:HU:Iƒw:JƒÏ:Kh8:Ly¾:MTŒ:NOU:OT:PvÒ:QŒ‰:R–:Sl³:Tm¸:Uk:V‰:Wžd:X::YV?:ZžÑ:[uÕ:\_ˆ:]rà:^`h:_Tü:`N¨:aj*:bˆa:c`R:dp:eTÄ:fpØ:g†y:hž?:im*:j[:k_:l~¢:mU‰:nO¯:os4:pT<:qSš:rP:sT:tT|:uNN:v_ý:wtZ:xXö:y„k:z€á:{‡t:|rÐ:}|Ê:~nV;!_';"†N;#U,;$b¤;%N’;&lª;'b7;(‚±;)T×;*SN;+s>;,nÑ;-u;;.R;/S;0‹Ý;1iÐ;2_Š;3`;4mî;5WO;6k";7s¯;8hS;9Ø;:;;cb;<`£;=U$;>uê;?Œb;@q;Am£;B[¦;C^{;DƒR;EaL;FžÄ;Gxú;H‡W;I|';Jv‡;KQð;L`ö;MqL;NfC;O^L;P`M;QŒ;Rpp;Sc%;T‰;U_½;V`b;W†Ô;XVÞ;YkÁ;Z`”;[ag;\SI;]`à;^ff;_?;`yý;aO;bpé;clG;d‹³;e‹ò;f~Ø;gƒd;hf;iZZ;j›B;kmQ;lm÷;mŒA;nm;;oO;ppk;qƒ·;rb;s`Ñ;t— ;u';vyx;wQû;xW>;yWú;zg:;{ux;|z=;}yï;~{•[cš„=?Z=@V¼=Ad=B”ð=Cwë=DO¥=E=Frá=G‰Ò=H™z=I4=J~Þ=KR=LeY=M‘u=N=Oƒ=PSë=Qz–=Rcí=Sc¥=Tv†=Uyø=VˆW=W–6=Xb*=YR«=Z‚‚=[hT=\gp=]cw=^wk=_zí=`m=a~Ó=b‰ã=cYÐ=db=e…É=f‚¥=guL=hP=iNË=ju¥=k‹ë=l\J=m]þ=n{K=oe¤=p‘Ñ=qNÊ=rm%=s‰_=t}'=u•&=vNÅ=wŒ(=xÛ=y—s=zfK={y=|Ñ=}pì=~mx>!\=>"R²>#ƒF>$Qb>%ƒ>&w[>'fv>(œ¸>)N¬>*`Ê>+|¾>,|³>-~Ï>.N•>/‹f>0fo>1˜ˆ>2—Y>3Xƒ>4el>5•\>6_„>7uÉ>8—V>9zß>:zÞ>;QÀ>=z˜>>cê>?zv>@~ >As–>B—í>CNE>Dpx>EN]>F‘R>GS©>HeQ>Ieç>Jü>K‚>LTŽ>M\1>Nuš>O— >PbØ>QrÙ>Ru½>S\E>Tšy>UƒÊ>V\@>WT€>Xwé>YN>>Zl®>[€Z>\bÒ>]cn>^]è>_Qw>`Ý>aŽ>b•/>cOñ>dSå>e`ç>fp¬>gRg>hcP>ižC>jZ>kP&>lw7>mSw>n~â>od…>pe+>qb‰>rc˜>sP>tr5>u‰É>vQ³>w‹À>x~Ý>yWG>zƒÌ>{”§>|Q›>}T>~\û?!OÊ?"zã?#mZ?$á?%š?&U€?'T–?(Sa?)T¯?*_?+cé?,iw?-Qï?.ah?/R ?0X*?1RØ?2WN?3x ?4w ?5^·?6aw?7|à?8b[?9b—?:N¢?;p•?<€?=b÷?>pä??—`?@Ww?A‚Û?Bgï?Chõ?DxÕ?E˜—?FyÑ?GXó?HT³?ISï?Jn4?KQK?LR;?M[¢?N‹þ?O€¯?PUC?QW¦?R`s?SWQ?TT-?Uzz?V`P?W[T?Xc§?Yb ?ZSã?[bc?\[Ç?]g¯?^Tí?_zŸ?`‚æ?a‘w?b^“?cˆä?dY8?eW®?fc?gè?h€ï?iWW?j{w?kO©?l_ë?m[½?nk>?oS!?p{P?qrÂ?rhF?swÿ?tw6?ue÷?vQµ?wN?xvÔ?y\¿?zz¥?{„u?|YN?}›A?~P€@!™ˆ@"a'@#nƒ@$Wd@%f@&cF@'Vð@(bì@)bi@*^Ó@+–@,Wƒ@-bÉ@.U‡@/‡!@0J@1£@2Uf@3ƒ±@4ge@5V@6„Ý@7Zj@8h@9bæ@:{î@;–@Œ0@?cý@@‰È@AaÒ@B@CpÂ@Dnå@Et@Fi”@Grü@H^Ê@IÎ@Jg@Kmj@Lc^@MR³@Nrb@O€@POl@QYå@R‘j@SpÙ@Tm@URÒ@VNP@W–÷@X•m@Y…~@ZxÊ@[}/@\Q!@]W’@^dÂ@_€‹@`|{@alê@bhñ@ci^@dQ·@eS˜@fh¨@gr@hžÎ@i{ñ@jrø@ky»@lo@mt@ngN@o‘Ì@pœ¤@qy<@rƒ‰@sƒT@tT@uh@vN=@wS‰@xR±@yx>@zS†@{R)@|Pˆ@}O‹@~OÐA!uâA"zËA#|’A$l¥A%–¶A&R›A'tƒA(TéA)OéA*€TA+ƒ²A,ÞA-•pA.^ÉA/`A0mŸA1^A2e[A38A4”þA5`KA6p¼A7~ÃA8|®A9QÉA:hA;|±A<‚oA=N$A>†A?‘ÏA@f~AAN®ABŒACd©AD€JAEPÚAFu—AGqÎAH[åAI½AJofAKN†ALd‚AM•cAN^ÖAOe™APRAQˆÂARpÈASR£ATsAUt3AVg—AWx÷AX—AYN4AZ»A[œÞA\mËA]QÛA^AA_TA`bÎAas²AbƒñAc–öAdŸ„Ae”ÃAfO6AgšAhQÌAipuAj–uAk\­Al˜†AmSæAnNäAonœApt Aqi´ArxkAs™AtuYAuRAvv$AwmAAxgóAyQmAzŸ™A{€KA|T™A}{b.B?štB@TBA”ÝBBO£BCeÅBD\eBE\aBFBG†QBHl/BI_‹BJs‡BKnäBL~ÿBM\æBNcBO[jBPnæBQSuBRNqBSc BTueBUb¡BVnBWO&BXNÑBYl¦BZ~¶B[‹ºB\„B]‡ºB^WB_;B`•#Ba{©Bbš¡BcˆøBd„=BemBfš†Bg~ÜBhYˆBiž»Bjs›BkxBl†‚BmšlBnš‚BoVBpTBqWËBrNpBsž¦BtSVBuÈBv Bww’Bx™’By†îBznáB{…B|füB}abB~o+C!Œ)C"‚’C#ƒ+C$vòC%lC&_ÙC'ƒ½C(s+C)ƒC*•C+kÛC,wÛC-”ÆC.SoC/ƒC0Q’C1^=C2ŒŒC38C4NHC5s«C6gšC7h…C8‘vC9— C:qdC;l¡C•AC?kÏC@ŽCAf'CB[ÐCCY¹CDZšCE•èCF•÷CGNìCH„ CI„™CJj¬CKvßCL•0CMsCNh¦CO[_CPw/CQ‘šCR—aCS|ÜCT÷CUŒCV_%CW|sCXyØCY‰ÅCZlÌC[‡C\[ÆC]^BC^hÉC_w C`~õCaQ•CbQMCcRÉCdZ)CeCf—bCg‚×ChcÏCiw„Cj…ÐCkyÒCln:Cm^™CnY™Co…CppmCqlCrb¿Csv¿CteOCu`¯Cv•ýCwfCx‡ŸCyž#Cz”íC{T C|T}C}Œ,C~dxD!dyD"†D#j!D$œD%xèD&diD'›TD(b¹D)g+D*ƒ«D+X¨D,žØD-l«D.o D/[ÞD0–LD1Œ D2r_D3gÐD4bÇD5raD6N©D7YÆD8kÍD9X“D:f®D;^UDg(D?vîD@wfDArgDBzFDCbÿDDTêDETPDF” DG£DHZDI~³DJlDKNCDLYvDM€DNYHDOSWDPu7DQ–¾DRVÊDSc DTDU`|DV•ùDWmÖDXTbDY™DZQ…D[ZéD\€ýD]Y®D^—D_P*D`låDa\UjE?´E@r,EA^EB`ECt6EDbÍEEc’EFrLEG_˜EHnCEIm>EJeEKoXELvØEMxÐENvüEOuTEPR$EQSÛERNSES^žETeÁEU€*EV€ÖEWb›EXT†EYR(EZp®E[ˆE\ÑE]láE^TxE_€ÚE`WùEaˆôEbTEc–jEd‘MEeOiEfl›EgU·EhvÆEix0Ejb¨EkpùEloŽEm_mEn„ìEohÚEpx|Eq{÷Er¨Esg EtžOEucgEvx°EwWoExxEy—9EzbyE{b«E|RˆE}t5E~k×F!UdF">F#u²F$v®F%S9F&uÞF'PûF(\AF)‹lF*{ÇF+POF,rGF-š—F.˜ØF/oF0tâF1yhF2d‡F3w¥F4büF5˜‘F6+F7TÁF8€XF9NRF:WjF;‚ùF<„ F=^sF>QíF?töF@‹ÄFA\OFBWaFClüFD˜‡FEZFFFx4FG›DFHëFI|•FJRVFKbQFL”úFMNÆFNƒ†FO„aFPƒéFQ„²FRWÔFSg4FTWFUfnFVmfFWŒ1FXfÝFYpFZgF[k:F\hF]bF^Y»F_NF`QÄFaoFbgÒFclFdQvFehËFfYGFgkgFhufFi]FjFkŸPFle×FmyHFnyAFoš‘FpwFq\‚FrN^FsOFtT/FuYQFvx FwVhFxlFyÄFz_F{l}F|lãF}‹«F~cG!`pG"m=G#ruG$bfG%”ŽG&”ÅG'SCG(ÁG){~G*NßG+Œ&G,N~G-žÔG.”±G/”³G0RMG1o\G2cG3mEG4Œ4G5XG6]LG7k G8kIG9gªG:T[G;TG<ŒG=X™G>…7G?_:G@b¢GAjGGB•9GCerGD`„GEheGFw§GGNTGHO¨GI]çGJ—˜GKd¬GLØGM\íGNOÏGOzGPRGQƒGRNGS`/GTzƒGU”¦GVOµGWN²GXyæGYt4GZRäG[‚¹G\dÒG]y½G^[ÝG_lG`—RGa{Gbl"GcP>GdSGenGfdÎGgftGhl0Gi`ÅGj˜wGk‹÷Gl^†GmtgÓH?täH@XäHAeHBV·HC‹©HD™vHEbpHF~ÕHG`ùHHpíHIXìHJNÁHKNºHL_ÍHM—çHNNûHO‹¤HPRHQYŠHR~«HSbTHTNÍHUeåHVbHWƒ8HX„ÉHYƒcHZ‡H[q”H\n¶H][¹H^~ÒH_Q—H`cÉHagÔHb€‰Hcƒ9HdˆHeQHf[zHgY‚Hh±HiNsHjl]HkQeHl‰%HmoHn–.Ho…JHpt^Hq•Hr•ðHsm¦Ht‚åHu_1Hvd’HwmHx„(HynHzœÃH{X^H|[H}N H~SÁI!OI"ecI#hQI$UÓI%N'I&dI'ššI(bkI)ZÂI*t_I+‚rI,m©I-hîI.PçI/ƒŽI0xI1g@I2R9I3l™I4~±I5P»I6UeI7q^I8{[I9fRI:sÊI;‚ëIR I?q}I@ˆkIA•êIB–UICdÅIDaIE³IFU„IGlUIHbGII.IJX’IKO$ILUFIMOINfLION IP\IQˆóIRh¢IScNITz IUpçIV‚IWRúIX—öIY\IZTèI[µI\~ÍI]YbI^JI_†ÇI`‚ Ia‚ IbfIcdDId\IeaQIfm‰Igy>Ih‹¾Iix7Iju3IkT{IlO8ImŽ«InmñIoZ Ip~ÅIqy^IrlˆIs[¡ItZvIuuIv€¾IwaNIxnIyXðIzuI{u%I|rrI}SGI~~óJ!wJ"vÛJ#RiJ$€ÜJ%W#J&^J'Y1J(rîJ)e½J*nJ+‹×J,\8J-†qJ.SAJ/wóJ0bþJ1eöJ2NÀJ3˜ßJ4†€J5[žJ6‹ÆJ7SòJ8wâJ9OJ:\NJ;švJy:J?XëJ@NJAgÿJBN‹JCbíJDŠ“JEJFR¿JGf/JHUÜJIVlJJJKNÕJLOJM‘ÊJN™pJOlJP^JQ`CJR[¤JS‰ÆJT‹ÕJUe6JVbKJW™–JX[ˆJY[ÿJZcˆJ[U.J\S×J]v&J^Q}J_…,J`g¢Jah³JbkŠJcb’Jd“JeSÔJf‚JgmÑJhuJiNfJjNJk[pJlqŸJm…¯Jnf‘JofÙJprJq‡JržÍJsŸ Jt\^Jug/JvðJwhJxg_Jyb JzzÖJ{X…J|^¶J}epJ~o1K!`UK"R7K#€ K$dTK%ˆpK&u)K'^K(hK)bôK*—K+SÌK,r=K-ŒK.l4K/waK0zK1T.K2w¬K3˜zK4‚K5‹ôK6xUK7gK8pÁK9e¯K:d•K;V6K<`K=yÁK>SøK?NK@k{KA€†KB[úKCUãKDVÛKEO:KFOSùL?p­L@ldLAXXLBd*LCXLDhàLE›LFULG|ÖLHPLIŽºLJmÌLKŸLLpëLMcLNm›LOnÔLP~æLQ„LRhCLSLTmØLU–vLV‹¨LWYWLXryLY…äLZ~L[u¼L\ŠŠL]h¯L^RTL_Ž"L`•LacÐLb˜˜LcŽDLdU|LeOSLffÿLgVLh`ÕLim•LjRCLk\ILlY)LmmûLnXkLou0LpuLq`lLr‚LsFLtcLugaLvâLww:LxóLy4Lz”ÁL{^L|S…L}T,L~pÃM!l@M"^÷M#P\M$N­M%^­M&c:M'‚GM(M)hPM*‘nM+w³M,T M-”ÜM._dM/zåM0hvM1cEM2{RM3~ßM4uÛM5PwM6b•M7Y4M8M9QøM:yÃM;zMM?m‚M@\`MAWMBTMCQTMDnMMEVâMFc¨MG˜“MHMI‡MJ‰*MKMLTMM\oMNÀMObÖMPbXMQ1MRž5MS–@MTšnMUš|MVi-MWY¥MXbÓMYU>MZcM[TÇM\†ÙM]mN3~¬N4g*N5…N6TsN7uON8€ÃN9U‚N:›ON;OMN\ N?apN@SkNAvNBn)NC†ŠNDe‡NE•ûNF~¹NGT;NHz3NI} NJ•îNKUáNLÁNMtîNNcNO‡NPm¡NQzNRbNSe¡NTSgNUcáNVlƒNW]ëNXT\NY”¨NZNLN[laN\‹ìN]\KN^eàN_‚œN`h§NaT>NbT4NckËNdkfNeN”NfcBNgSHNh‚NiO NjO®NkW^Nlb Nm–þNnfdNoriNpRÿNqR¡Nr`ŸNs‹ïNtfNuq™NvgNw‰NxxRNywýNzfpN{V;N|T8N}•!N~rzO!zO"`oO#^ O$`‰O%O&YO'`ÜO(q„O)pïO*nªO+lPO,r€O-j„O.ˆ­O/^-O0N`O1Z³O2UœO3”ãO4mO5|ûO6–™O7bO8~ÆO9wŽO:†~O;S#O<—O=–O>f‡O?\áO@O OAríOBN OCS¦ODYOETOFc€OG•(OHQHOINÙOJœœOK~¤OLT¸OM$ONˆTOO‚7OP•òOQmŽOR_&OSZÌOTf>OU–iOVs°OWs.OXS¿OYzOZ™…O[¡O\[ªO]–wO^–PO_~¿O`vøOaS¢Ob•vOc™™Od{±Oe‰DOfnXOgNaOhÔOiyeOj‹æOk`óOlTÍOmN«On˜yOo]÷OpjaOqPÏOrTOsŒaOt„'Oux]Ov—OwRJOxTîOyV£Oz•O{mˆO|[µO}mÆO~fSP!\P"[]P#h!P$€–P%UxP&{P'eHP(iTP)N›P*kGP+‡NP,—‹P-SOP.cP/d:P0ªP1eœP2€ÁP3ŒP4Q™P5h°P6SxP7‡ùP8aÈP9lÄP:lûP;Œ"P<\QP=…ªP>‚¯P?• P@k#PA›PBe°PC_ûPD_ÃPEOáPFˆEPGfPHePIs)PJ`úPKQtPLRPMW‹PN_bPO¢PPˆLPQ‘’PR^xPSgOPT`'PUYÓPVQDPWQöPX€øPYSPZlyP[–ÄP\qŠP]OP^OîP_žP`g=PaUÅPb•PcyÀPdˆ–Pe~ãPfXŸPgb Ph—Pi†ZPjVPk˜{Pl_Pm‹¸Pn„ÄPo‘WPpSÙPqeíPr^Psu\Pt`dPu}nPvZPw~êPx~íPyiPzU§P{[£P|`¬P}eËP~s„Q! Q"vcQ#w)Q$~ÚQ%—tQ&…›Q'[fQ(ztQ)–êQ*ˆ@Q+RËQ,qQ-_ªQ.eìQ/‹âQ0[ûQ1šoQ2]áQ3k‰Q4l[Q5‹­Q6‹¯Q7 Q8ÅQ9S‹Q:b¼Q;ž&Q<ž-Q=T@Q>N+Q?‚½Q@rYQA†œQB]QCˆYQDm¯QE–ÅQFTÑQGNšQH‹¶QIq QJT½QK– QLpßQMmùQNvÐQON%QPxQQ‡QR\©QS^öQTŠQU˜œQV–QWpŽQXl¿QYYDQZc©Q[wQ{€Q|pQ}Y–Q~tvR!dGR"\'R#eR$z‘R%Œ#R&YÚR'T¬R(‚R)ƒoR*‰R+€R,i0R-VNR.€6R/r7R0‘ÎR1Q¶R2N_R3˜uR4c–R5NR6SöR7fóR8KR9YR:m²R;NRcÖR?”ñR@ORAO RBˆcRC˜RDY7REWRFyûRGNêRH€ðRIu‘RJl‚RK[œRLYèRM_]RNiRO†RPPRQ]òRRNYRSwãRTNåRU‚zRVb‘RWfRX‘RY\yRZN¿R[_yR\ÆR]8R^€„R_u«R`N¦RaˆÔRbaRckÅRd_ÆReNIRfvÊRgn¢Rh‹ãRi‹®RjŒ Rk‹ÑRl_RmüRnÌRo~ÎRpƒ5RqƒkRrVàRsk·Rt—óRu–4RvYûRwTRx”öRymëRz[ÅR{™nR|\9R}_R~–S!SpS"‚ñS#j1S$ZtS%žpS&^”S'(S(ƒ¹S)„$S*„%S+ƒgS,‡GS-ÎS.bS/vÈS0_qS1˜–S2xlS3f S4TßS5båS6OcS7ÃS8uÈS9^¸S:–ÍS;Ž S<†ùS=TS>lóS?mŒS@l8SA`SBRÇSCu(SD^}SEOSF` SG_çSH\$SIu1SJ®SK”ÀSLr¹SMl¹SNn8SO‘ISPg SQSËSRSóSSOQST‘ÉSU‹ñSVSÈSW^|SXÂSYmäSZNŽS[vÂS\i†S]†^S^aS_‚S`OYSaOÞSb>Scœ|Sda SenSfnSg–…ShNˆSiZ1Sj–èSkNSl\Smy¹Sn[‡So‹íSp½Sqs‰SrWßSs‚‹StÁSuTSvGSwU»Sx\êSy_¡SzaS{k2S|rñS}€²S~ЉT!mtT"[ÓT#ˆÕT$˜„T%ŒkT&šmT'ž3T(n T)Q¤T*QCT+W£T,ˆT-SŸT.côT/•T0VíT1TXT2WT3s?T4nT5T6ÜT7‚ÑT8a?T9`(T:–bT;fðT<~¦T=ŠT>ÃT?”¥T@\³TA|¤TBgTC`¦TD–TE€TFN‘TGçTHSTI–hTJQATKÐTL…tTM‘]TNfUTO—õTP[UTQSTRx8TSgBTTh=TUTÉTVp~TW[°TX}TYQTZW(T[T±T\eT]f‚T^^T_CT`Ta„lTbmTc|ßTdQÿTe…ûTfg£TgeéTho¡Ti†¤TjŽTkVjTl Tmv‚TnpvToqåTp#TqbéTrRTslýTtzÙU?n[U@~ýUAjUBzàUC_pUDo3UE_ UFcŒUGm¨UHgVUINUJ^UK&ULN×UM€ÀUNv4UO–œUPbÛUQf-URb~USl¼UTuUUqgUViUWQFUX€‡UYSìUZnU[b˜U\TòU]†ðU^™U_€U`•Ua…UbÙUcmYUdsÍUeeŸUfwUguUhx'UiûUjUk”ˆUlO¦Umg•Unu¹Uo‹ÊUp—Uqc/Ur•GUs–5Ut„¸Uuc#UvwAUw_UxrðUyN‰Uz`U{etU|bïU}kcU~e?V!^'V"uÇV#ÑV$‹ÁV%‚V&gV'e/V(T1V)‡V*wåV+€¢V,V-lAV.NKV/~ÇV0€LV1vôV2i V3k–V4bgV5P_×V?cV@c·VAóVBôVCnVD^VE\ÙVFR6VGfzVHyéVIzVJ(VKp™VLuÔVMnÞVNl»VOz’VPN-VQvÅVR_àVS”ŸVTˆwVU~ÈVVyÍVW€¿VX‘ÍVYNòVZOV[‚V\ThV]]ÞV^m2V_‹ÌV`|¥VatVb€˜Vc^VdT’Vev±Vf[™VgfbÙW?SSW@hLWAt"WBƒWC‘LWDUDWEw@WFp|WGmJWHQyWIT¨WJDWKYÿWLnËWMmÄWN[\WO}+WPNÔWQ|}WRnÓWS[PWTêWUn WV[WWW›WXhÕWYŽ*WZ[—W[~üW\`;W]~µW^¹W_pW`YOWacÍWbyßWc³WdSRWeeÏWfyVWg‹ÅWh–;Wi~ÄWj”»Wk~‚WlV4Wm‘‰WngWojWp\ WquWrf(Ws]æWtOPWugÞWvPZWwO\WxWPWy^§X!NX"N X#Q@X$NX%^ÿX&SEX'NX(N˜X)NX*›2X+[lX,ViX-N(X.yºX/N?X0SX1NGX2Y-X3r;X4SnX5lX6VßX7€äX8™—X9kÓX:w~X;ŸXŸX?N\X@NiXAN“XB‚ˆXC[[XDUlXEVXFNÄXGSXHSXIS£XJS¥XKS®XL—eXM]XNSXOSõXPS&XQS.XRS>XS\XTSfXUScXVRXWRXXRXYR-XZR3X[R?X\R@X]RLX^R^X_RaX`R\Xa„¯XbR}XcR‚XdRXeRXfR“XgQ‚XhTXiN»XjNÃXkNÉXlNÂXmNèXnNáXoNëXpNÞXqOXrNóXsO"XtOdXuNõXvO%XwO'XxO XyO+XzO^X{OgX|e8X}OZX~O]Y!O_Y"OWY#O2Y$O=Y%OvY&OtY'O‘Y(O‰Y)OƒY*OY+O~Y,O{Y-OªY.O|Y/O¬Y0O”Y1OæY2OèY3OêY4OÅY5OÚY6OãY7OÜY8OÑY9OßY:OøY;P)YP,Y?PY@P.YAP-YBOþYCPYDP YEP%YFP(YGP~YHPCYIPUYJPHYKPNYLPlYMP{YNP¥YOP§YPP©YQPºYRPÖYSQYTPíYUPìYVPæYWPîYXQYYQ YZNÝY[l=Y\OXY]OeY^OÎY_Ÿ Y`lFYa|tYbQnYc]ýYdžÉYe™˜YfQYgYYhRùYiS YjŠYkSYlQëYmYYnQUYoN YpQVYqN³YrˆnYsˆ¤YtNµYuYvˆÒYwy€Yx[4YyˆYz¸Y{Q«Y|Q±Y}Q½Y~Q¼Z!QÇZ"Q–Z#Q¢Z$Q¥Z%‹ Z&‹¦Z'‹§Z(‹ªZ)‹´Z*‹µZ+‹·Z,‹ÂZ-‹ÃZ.‹ËZ/‹ÏZ0‹ÎZ1‹ÒZ2‹ÓZ3‹ÔZ4‹ÖZ5‹ØZ6‹ÙZ7‹ÜZ8‹ßZ9‹àZ:‹äZ;‹èZ<‹éZ=‹îZ>‹ðZ?‹óZ@‹öZA‹ùZB‹üZC‹ÿZDŒZEŒZFŒZGŒZHŒ ZIŒZJŒZKŒZLŒZMŒZNŒZOŒZPŒZQŒZRŒZSŒZTŒ ZUŒ!ZVŒ%ZWŒ'ZXŒ*ZYŒ+ZZŒ.Z[Œ/Z\Œ2Z]Œ3Z^Œ5Z_Œ6Z`SiZaSzZb–Zc–"Zd–!Ze–1Zf–*Zg–=Zh–R¬[?R­[@R¾[ATÿ[BRÐ[CRÖ[DRð[ESß[Fqî[GwÍ[H^ô[IQõ[JQü[K›/[LS¶[M_[NuZ[O]ï[PWL[QW©[RW¡[SX~[TX¼[UXÅ[VXÑ[WW)[XW,[YW*[ZW3[[W9[\W.[]W/[^W\[_W;[`WB[aWi[bW…[cWk[dW†[eW|[fW{[gWh[hWm[iWv[jWs[kW­[lW¤[mWŒ[nW²[oWÏ[pW§[qW´[rW“[sW [tWÕ[uWØ[vWÚ[wWÙ[xWÒ[yW¸[zWô[{Wï[|Wø[}Wä[~WÝ\!X \"X \#Wý\$Wí\%X\&X\'X\(XD\)X \*Xe\+Xl\,X\-X‰\.Xš\/X€\0™¨\1Ÿ\2aÿ\3‚y\4‚}\5‚\6‚\7‚Š\8‚¨\9‚„\:‚Ž\;‚‘\<‚—\=‚™\>‚«\?‚¸\@‚¾\A‚°\B‚È\C‚Ê\D‚ã\E‚˜\F‚·\G‚®\H‚Ë\I‚Ì\J‚Á\K‚©\L‚´\M‚¡\N‚ª\O‚Ÿ\P‚Ä\Q‚Î\R‚¤\S‚á\Tƒ \U‚÷\V‚ä\Wƒ\Xƒ\Y‚Ü\Z‚ô\[‚Ò\\‚Ø\]ƒ \^‚û\_‚Ó\`ƒ\aƒ\bƒ\cƒ\dƒ\e‚à\f‚Õ\gƒ\hƒQ\iƒ[\jƒ\\kƒ\lƒ’\mƒ<\nƒ4\oƒ1\pƒ›\qƒ^\rƒ/\sƒO\tƒG\uƒC\vƒ_\wƒ@\xƒ\yƒ`\zƒ-\{ƒ:\|ƒ3\}ƒf\~ƒe]!ƒh]"ƒ]#ƒi]$ƒl]%ƒj]&ƒm]'ƒn](ƒ°])ƒx]*ƒ³]+ƒ´],ƒ ]-ƒª].ƒ“]/ƒœ]0ƒ…]1ƒ|]2ƒ¶]3ƒ©]4ƒ}]5ƒ¸]6ƒ{]7ƒ˜]8ƒž]9ƒ¨]:ƒº];ƒ¼]<ƒÁ]=„]>ƒå]?ƒØ]@X]A„]B„ ]CƒÝ]Dƒý]EƒÖ]F„]G„8]H„]I„]JƒÔ]Kƒß]L„]M„]Nƒø]Oƒù]Pƒê]QƒÅ]RƒÀ]S„&]Tƒð]Uƒá]V„\]W„Q]X„Z]Y„Y]Z„s][„‡]\„ˆ]]„z]^„‰]_„x]`„<]a„F]b„i]c„v]d„Œ]e„Ž]f„1]g„m]h„Á]i„Í]j„Ð]k„æ]l„½]m„Ó]n„Ê]o„¿]p„º]q„à]r„¡]s„¹]t„´]u„—]v„å]w„ã]x… ]yu ]z…8]{„ð]|…9]}…]~…:^!…V^"…;^#„ÿ^$„ü^%…Y^&…H^'…h^(…d^)…^^*…z^+w¢^,…C^-…r^.…{^/…¤^0…¨^1…‡^2…^3…y^4…®^5…œ^6……^7…¹^8…·^9…°^:…Ó^;…Á^<…Ü^=…ÿ^>†'^?†^@†)^A†^B†<^C^þ^D_^EY<^FYA^G€7^HYU^IYZ^JYX^KS^L\"^M\%^N\,^O\4^PbL^Qbj^RbŸ^Sb»^TbÊ^UbÚ^Vb×^Wbî^Xc"^Ybö^Zc9^[cK^\cC^]c­^^cö^_cq^`cz^acŽ^bc´^ccm^dc¬^ecŠ^fci^gc®^hc¼^icò^jcø^kcà^lcÿ^mcÄ^ncÞ^ocÎ^pdR^qcÆ^rc¾^sdE^tdA^ud ^vd^wd ^xd ^yd&^zd!^{d^^|d„^}dm^~d–_!dz_"d·_#d¸_$d™_%dº_&dÀ_'dÐ_(d×_)dä_*dâ_+e _,e%_-e._._ _/_Ò_0u_1__2S__3Sñ_4Sý_5Sé_6Sè_7Sû_8T_9T_:T_;TK_TT_?TV_@TC_AT!_BTW_CTY_DT#_ET2_FT‚_GT”_HTw_ITq_JTd_KTš_LT›_MT„_NTv_OTf_PT_QTÐ_RT­_STÂ_TT´_UTÒ_VT§_WT¦_XTÓ_YTÔ_ZTr_[T£_\TÕ_]T»_^T¿__TÌ_`TÙ_aTÚ_bTÜ_cT©_dTª_eT¤_fTÝ_gTÏ_hTÞ_iU_jTç_kU _lTý_mU_nTó_oU"_pU#_qU_rU_sU'_tU*_uUg_vU_wUµ_xUI_yUm_zUA_{UU_|U?_}UP_~U<`!U7`"UV`#Uu`$Uv`%Uw`&U3`'U0`(U\`)U‹`*UÒ`+Uƒ`,U±`-U¹`.Uˆ`/U`0UŸ`1U~`2UÖ`3U‘`4U{`5Uß`6U½`7U¾`8U”`9U™`:Uê`;U÷`UÑ`?Uë`@Uì`AUÔ`BUæ`CUÝ`DUÄ`EUï`FUå`GUò`HUó`IUÌ`JUÍ`KUè`LUõ`MUä`N”`OV`PV`QV `RV`SV$`TV#`UUþ`VV`WV'`XV-`YVX`ZV9`[VW`\V,`]VM`^Vb`_VY``V\`aVL`bVT`cV†`dVd`eVq`fVk`gV{`hV|`iV…`jV“`kV¯`lVÔ`mV×`nVÝ`oVá`pVõ`qVë`rVù`sVÿ`tW`uW `vW `wW`x^`y^`z^`{^`|^1`}^;`~^\Ëa?\åa@]aA]aB]'aC]&aD].aE]$aF]aG]aH]aI]XaJ]>aK]4aL]=aM]laN][aO]oaP]]aQ]kaR]KaS]JaT]iaU]taV]‚aW]™aX]aYŒsaZ]·a[]Åa\_sa]_wa^_‚a__‡a`_‰aa_Œab_•ac_™ad_œae_¨af_­ag_µah_¼aiˆbaj_aakr­alr°amr´anr·aor¸aprÃaqrÁarrÎasrÍatrÒaurèavrïawréaxròayrôazr÷a{sa|róa}sa~rúb!rûb"sb#sb$s!b%s b&sb'sb(sb)s"b*s9b+s%b,s,b-s8b.s1b/sPb0sMb1sWb2s`b3slb4sob5s~b6‚b7Y%b8˜çb9Y$b:Yb;™cb<™gb=™hb>™ib?™jb@™kbA™lbB™tbC™wbD™}bE™€bF™„bG™‡bH™ŠbI™bJ™bK™‘bL™“bM™”bN™•bO^€bP^‘bQ^‹bR^–bS^¥bT^ bU^¹bV^µbW^¾bX^³bYSbZ^Òb[^Ñb\^Ûb]^èb^^êb_ºb`_Äba_Ébb_Öbc_Ïbd`be_îbf`bg_ábh_äbi_þbj`bk`bl_êbm_íbn_øbo`bp`5bq`&br`bs`bt` bu`)bv`+bw` bx`?by`!bz`xb{`yb|`{b}`zb~`Bc!`jc"`}c#`–c$`šc%`­c&`c'`ƒc(`’c)`Œc*`›c+`ìc,`»c-`±c.`Ýc/`Øc0`Æc1`Úc2`´c3a c4a&c5ac6a#c7`ôc8ac9ac:a+c;aJca”c?a§c@a·cAaÔcBaõcC_ÝcD–³cE•écF•ëcG•ñcH•ócI•õcJ•öcK•ücL•þcM–cN–cO–cP–cQ– cR– cS– cT– cU–cV–cW–cX–cY–cZ–c[–c\N,c]r?c^bc_l5c`lTcal\cblJccl£cdl…celcfl”cglŒchlhcilicjltcklvcll†cml©cnlÐcolÔcpl­cql÷crløcslñctl×cul²cvlàcwlÖcxlúcylëczlîc{l±c|lÓc}lïc~lþd!m9d"m'd#m d$mCd%mHd&md'md(md)md*m+d+mMd,m.d-m5d.md/mOd0mRd1mTd2m3d3m‘d4mod5mžd6m d7m^d8m“d9m”d:m\d;m`dnd?mÇd@mÅdAmÞdBndCm¿dDmàdEndFmædGmÝdHmÙdIndJm«dKn dLm®dMn+dNnndOnNdPnkdQn²dRn_dSn†dTnSdUnTdVn2dWn%dXnDdYnßdZn±d[n˜d\nàd]o-d^nâd_n¥d`n§dan½dbn»dcn·ddn×den´dfnÏdgndhnÂdinŸdjobdkoFdloGdmo$dnodonùdpo/dqo6droKdsotdto*duo dvo)dwo‰dxodyoŒdzoxd{ord|o|d}ozd~oÑe!oÉe"o§e#o¹e$o¶e%oÂe&oáe'oîe(oÞe)oàe*oïe+pe,p#e-pe.p9e/p5e0pOe1p^e2[€e3[„e4[•e5[“e6[¥e7[¸e8u/e9šže:d4e;[äe<[îe=‰0e>[ðe?ŽGe@‹eA¶eBÓeCÕeDåeEîeFäeGéeHæeIóeJèeKeLeM eN&eOeP eQeR!eS5eT6eU-eV/eWDeXQeYReZPe[he\Xe]be^[e_f¹e`tea}eb‚ecˆedƒee‹ef_Peg_Weh_Vei_Xej\;ekT«el\Pem\Yen[qeo\cep\feq¼er_*es_)et_-eu‚tev_Zbf?Zuf@€ìfAZªfBZ›fCZwfDZzfEZ¾fFZëfGZ²fHZÒfIZÔfJZ¸fKZàfLZãfMZñfNZÖfOZæfPZØfQZÜfR[ fS[fT[fU[2fV[7fW[@fX\fY\fZ[Zf[[ef\[sf][Qf^[Sf_[bf`šufašwfbšxfcšzfdšfeš}ffš€fgšfhš…fišˆfjšŠfkšflš’fmš“fnš–foš˜fpš›fqšœfršfsšŸftš fuš¢fvš£fwš¥fxš§fy~Ÿfz~¡f{~£f|~¥f}~¨f~~©g!~­g"~°g#~¾g$~Àg%~Ág&~Âg'~Ég(~Ëg)~Ìg*~Ðg+~Ôg,~×g-~Ûg.~àg/~ág0~èg1~ëg2~îg3~ïg4~ñg5~òg6 g7~ög8~úg9~ûg:~þg;g<g=g>g?g@ gA gBgCgDgEgFgGgHgIgJ!gK"gL#gM$gN%gO&gP'gQ*gR+gS,gT-gU/gV0gW1gX2gY3gZ5g[^zg\ug]]Ûg^u>g_•g`sŽgas‘gbs®gcs¢gdsŸgesÏgfsÂggsÑghs·gis³gjsÀgksÉglsÈgmsågnsÙgo˜|gpt gqségrsçgssÞgtsºgusògvtgwt*gxt[gyt&gzt%g{t(g|t0g}t.g~t,h!th"th#tAh$t\h%tWh&tUh'tYh(twh)tmh*t~h+tœh,tŽh-t€h.th/t‡h0t‹h1tžh2t¨h3t©h4th5t§h6tÒh7tºh8—êh9—ëh:—ìh;gLhgHh?gih@g¥hAg‡hBgjhCgshDg˜hEg§hFguhGg¨hHgžhIg­hJg‹hKgwhLg|hMgðhNh hOgØhPh hQgéhRg°hSh hTgÙhUgµhVgÚhWg³hXgÝhYhhZgÃh[g¸h\gâh]hh^gÁh_gýh`h2hah3hbh`hchahdhNhehbhfhDhghdhhhƒhihhjhUhkhfhlhAhmhghnh@hoh>hphJhqhIhrh)hshµhthhuhthvhwhwh“hxhkhyhÂhzinh{hüh|ih}i h~hùi!i$i"hði#i i$ii%iWi&hãi'ii(iqi)i9i*i`i+iBi,i]i-i„i.iki/i€i0i˜i1ixi2i4i3iÌi4i‡i5iˆi6iÎi7i‰i8ifi9ici:iyi;i›ii«i?i­i@iÔiAi±iBiÁiCiÊiDißiEi•iFiàiGiiHiÿiIj/iJiíiKjiLjiMjeiNiòiOjDiPj>iQj iRjPiSj[iTj5iUjŽiVjyiWj=iXj(iYjXiZj|i[j‘i\ji]j©i^j—i_j«i`s7iasRibkick‚idk‡iek„ifk’igk“ihkiikšijk›ikk¡ilkªimkinmioqipriqsiruisvitxiuwivyiwzix|iy~izi{‚i|„i}‡i~‹j!j"Žj#j$˜j%šj&ŽÎj'b j(bj)bj*bj+b"j,b!j-b%j.b$j/b,j0çj1tïj2tôj3tÿj4uj5uj6uj7e4j8eîj9eïj:eðj;f jfj?fj@fjAp…jBf÷jCfjDf4jEf1jFf6jGf5jH€jIf_jJfTjKfAjLfOjMfVjNfajOfWjPfwjQf„jRfŒjSf§jTfjUf¾jVfÛjWfÜjXfæjYféjZ2j[3j\6j];j^=j_@j`EjaFjbHjcIjdGjeMjfUjgYjh‰Çji‰Êjj‰Ëjk‰Ìjl‰Îjm‰Ïjn‰Ðjo‰ÑjprnjqrŸjrr]jsrfjtrojur~jvrjwr„jxr‹jyrjzrj{r’j|cj}c2j~c°k!d?k"dØk#€k$kêk%kók&kýk'kõk(kùk)lk*lk+lk,l k-lk.lk/lk0lk1l!k2l)k3l$k4l*k5l2k6e5k7eUk8ekk9rMk:rRk;rVkRk?€Ÿk@€œkA€“kB€¼kCg kD€½kE€±kF€«kG€­kH€´kI€·kJ€çkK€èkL€ékM€êkN€ÛkO€ÂkP€ÄkQ€ÙkR€ÍkS€×kTgkU€ÝkV€ëkW€ñkX€ôkY€íkZ k[k\€òk]€ük^gk_k`ŒZka6kbkc,kdke2kfHkgLkhSkitkjYkkZklqkm`kniko|kp}kqmkrgksXMktZµkuˆkv‚kw‘kxnÕky£kzªk{Ìk|g&k}Êk~»l!Ál"¦l#k$l$k7l%k9l&kCl'kFl(kYl)˜Ñl*˜Òl+˜Ól,˜Õl-˜Ùl.˜Úl/k³l0_@l1kÂl2‰ól3el4ŸQl5e“l6e¼l7eÆl8eÄl9eÃl:eÌl;eÎlp€l?pœl@p–lAplBp»lCpÀlDp·lEp«lFp±lGpèlHpÊlIqlJqlKqlLq/lMq1lNqslOq\lPqhlQqElRqrlSqJlTqxlUqzlVq˜lWq³lXqµlYq¨lZq l[qàl\qÔl]qçl^qùl_rl`r(lapllbqlcqfldq¹leb>lfb=lgbClhbHlibIljy;lky@llyFlmyIlny[loy\lpySlqyZlryblsyWlty`luyolvyglwyzlxy…lyyŠlzyšl{y§l|y³l}_Ñl~_Ðm!`x-m?xm@xmAx9mBx:mCx;mDxmExyn?n@~nAvÍnBvånCˆ2nD”…nE”†nF”‡nG”‹nH”ŠnI”ŒnJ”nK”nL”nM””nN”—nO”•nP”šnQ”›nR”œnS”£nT”¤nU”«nV”ªnW”­nX”¬nY”¯nZ”°n[”²n\”´n]”¶n^”·n_”¸n`”¹na”ºnb”¼nc”½nd”¿ne”Änf”Èng”Énh”Êni”Ënj”Ìnk”Ínl”Înm”Ðnn”Ñno”Ònp”Õnq”Önr”×ns”Ùnt”Ønu”Ûnv”Þnw”ßnx”àny”ânz”än{”ån|”çn}”èn~”êo!”éo"”ëo#”îo$”ïo%”óo&”ôo'”õo(”÷o)”ùo*”üo+”ýo,”ÿo-•o.•o/•o0•o1• o2• o3• o4•o5•o6•o7•o8•o9•o:•o;•o<•o=•o>•o?•o@•"oA•*oB•+oC•)oD•,oE•1oF•2oG•4oH•6oI•7oJ•8oK•oM•?oN•BoO•5oP•DoQ•EoR•FoS•IoT•LoU•NoV•OoW•RoX•SoY•ToZ•Vo[•Wo\•Xo]•Yo^•[o_•^o`•_oa•]ob•aoc•bod•doe•eof•fog•goh•hoi•ioj•jok•kol•lom•oon•qoo•rop•soq•:orwçoswìot–ÉouyÕovyíowyãoxyëoyzoz]Go{zo|zo}zo~zp!z9p"z7p#zQp$žÏp%™¥p&zpp'vˆp(vŽp)v“p*v™p+v¤p,tÞp-tàp.u,p/ž p0ž"p1ž(p2ž)p3ž*p4ž+p5ž,p6ž2p7ž1p8ž6p9ž8p:ž7p;ž9p<ž:p=ž>p>žAp?žBp@žDpAžFpBžGpCžHpDžIpEžKpFžLpGžNpHžQpIžUpJžWpKžZpLž[pMž\pNž^pOžcpPžfpQžgpRžhpSžipTžjpUžkpVžlpWžqpXžmpYžspZu’p[u”p\u–p]u p^up_u¬p`u£pau³pbu´pcu¸pduÄpeu±pfu°pguÃphuÂpiuÖpjuÍpkuãpluèpmuæpnuäpouëppuçpqvpruñpsuüptuÿpuvpvvpwvpxv pyvpzv p{v%p|vp}vp~vq!vq"vq,v3q-vMq.v^q/vTq0v\q1vVq2vkq3voq4Êq5zæq6zxq7zyq8z€q9z†q:zˆq;z•qz¬q?z¨q@z­qAz³qBˆdqCˆiqDˆrqEˆ}qFˆqGˆ‚qHˆ¢qIˆÆqJˆ·qKˆ¼qLˆÉqMˆâqNˆÎqOˆãqPˆåqQˆñqR‰qSˆüqTˆèqUˆþqVˆðqW‰!qX‰qY‰qZ‰q[‰ q\‰4q]‰+q^‰6q_‰Aq`‰fqa‰{qbu‹qc€åqdv²qev´qfwÜqg€qh€qi€qj€qk€ ql€"qm€%qn€&qo€'qp€)qq€(qr€1qs€ qt€5qu€Cqv€Fqw€Mqx€Rqy€iqz€qq{‰ƒq|˜xq}˜€q~˜ƒr!˜‰r"˜Œr#˜r$˜r%˜”r&˜šr'˜›r(˜žr)˜Ÿr*˜¡r+˜¢r,˜¥r-˜¦r.†Mr/†Tr0†lr1†nr2†r3†zr4†|r5†{r6†¨r7†r8†‹r9†¬r:†r;†§r<†£r=†ªr>†“r?†©r@†¶rA†ÄrB†µrC†ÎrD†°rE†ºrF†±rG†¯rH†ÉrI†ÏrJ†´rK†érL†ñrM†òrN†írO†órP†ÐrQ‡rR†ÞrS†ôrT†ßrU†ØrV†ÑrW‡rX‡rY†ørZ‡r[‡ r\‡ r]‡ r^‡#r_‡;r`‡ra‡%rb‡.rc‡rd‡>re‡Hrf‡4rg‡1rh‡)ri‡7rj‡?rk‡‚rl‡"rm‡}rn‡~ro‡{rp‡`rq‡prr‡Lrs‡nrt‡‹ru‡Srv‡crw‡|rx‡dry‡Yrz‡er{‡“r|‡¯r}‡¨r~‡Òs!‡Æs"‡ˆs#‡…s$‡­s%‡—s&‡ƒs'‡«s(‡ås)‡¬s*‡µs+‡³s,‡Ës-‡Ós.‡½s/‡Ñs0‡Às1‡Ês2‡Ûs3‡ês4‡às5‡îs6ˆs7ˆs8‡þs9ˆ s:ˆs;ˆ!s<ˆ9s=ˆ6s?Bs@DsAEsB‚sCzúsDzýsE{sF{sG{sH{sI{ sJ{+sK{sL{GsM{8sN{*sO{sP{.sQ{1sR{ sS{%sT{$sU{3sV{>sW{sX{XsY{ZsZ{Es[{us\{Ls]{]s^{`s_{ns`{{sa{bsb{rsc{qsd{se{¦sf{§sg{¸sh{¬si{sj{¨sk{…sl{ªsm{œsn{¢so{«sp{´sq{Ñsr{Áss{Ìst{Ýsu{Úsv{åsw{æsx{êsy| sz{þs{{üs||s}|s~| t!|t"|*t#|&t$|8t%|At&|@t'þt(‚t)‚t*‚t+ìt,ˆDt-‚!t.‚"t/‚#t0‚-t1‚/t2‚(t3‚+t4‚8t5‚;t6‚3t7‚4t8‚>t9‚Dt:‚It;‚Kt<‚Ot=‚Zt>‚_t?‚ht@ˆ~tAˆ…tBˆˆtCˆØtDˆßtE‰^tFtGŸtH§tI¯tJ°tK²tL||tMeItN|‘tO|tP|œtQ|žtR|¢tS|²tT|¼tU|½tV|ÁtW|ÇtX|ÌtY|ÍtZ|Èt[|Åt\|×t]|èt^‚nt_f¨t`¿taÎtbÕtcåtdáteætfétgîthóti|øtj}wtk}¦tl}®tm~Gtn~›tož¸tpž´tqstr„ts”tt‘tu±tvgtwmtxŒGtyŒItz‘Jt{‘Pt|‘Nt}‘Ot~‘du!‘bu"‘au#‘pu$‘iu%‘ou&‘}u'‘~u(‘ru)‘tu*‘yu+‘Œu,‘…u-‘u.‘u/‘‘u0‘¢u1‘£u2‘ªu3‘­u4‘®u5‘¯u6‘µu7‘´u8‘ºu9ŒUu:ž~u;¸u<ëu=Žu>ŽYu?Žiu@µuA¿uB¼uCºuDÄuEÖuF×uGÚuHÞuIÎuJÏuKÛuLÆuMìuN÷uOøuPãuQùuRûuSäuTŽ uUýuVŽuWŽuXŽuYŽ,uZŽ.u[Ž#u\Ž/u]Ž:u^Ž@u_Ž9u`Ž5uaŽ=ubŽ1ucŽIudŽAueŽBufŽQugŽRuhŽJuiŽpujŽvukŽ|ulŽoumŽtunŽ…uoŽupŽ”uqŽurŽœusŽžutŒxuuŒ‚uvŒŠuwŒ…uxŒ˜uyŒ”uze›u{‰Öu|‰Þu}‰Úu~‰Üv!‰åv"‰ëv#‰ïv$Š>v%‹&v&—Sv'–év(–óv)–ïv*—v+—v,—v-—v.—v/—*v0—-v1—0v2—>v3Ÿ€v4Ÿƒv5Ÿ…v6Ÿ†v7Ÿ‡v8Ÿˆv9Ÿ‰v:ŸŠv;ŸŒv<žþv=Ÿ v>Ÿ v?–¹v@–¼vA–½vB–ÎvC–ÒvDw¿vE–àvF’ŽvG’®vH’ÈvI“>vJ“jvK“ÊvL“vM”>vN”kvOœvPœ‚vQœ…vRœ†vSœ‡vTœˆvUz#vVœ‹vWœŽvXœvYœ‘vZœ’v[œ”v\œ•v]œšv^œ›v_œžv`œŸvaœ vbœ¡vcœ¢vdœ£veœ¥vfœ¦vgœ§vhœ¨viœ©vjœ«vkœ­vlœ®vmœ°vnœ±voœ²vpœ³vqœ´vrœµvsœ¶vtœ·vuœºvvœ»vwœ¼vxœ½vyœÄvzœÅv{œÆv|œÇv}œÊv~œËw!œÌw"œÍw#œÎw$œÏw%œÐw&œÓw'œÔw(œÕw)œ×w*œØw+œÙw,œÜw-œÝw.œßw/œâw0—|w1—…w2—‘w3—’w4—”w5—¯w6—«w7—£w8—²w9—´w:š±w;š°w<š·w=žXw>š¶w?šºw@š¼wAšÁwBšÀwCšÅwDšÂwEšËwFšÌwGšÑwH›EwI›CwJ›GwK›IwL›HwM›MwN›QwO˜èwP™ wQ™.wR™UwS™TwTšßwUšáwVšæwWšïwXšëwYšûwZšíw[šùw\›w]›w^›w_›w`›#waž½wbž¾wc~;wdž‚wež‡wfžˆwgž‹whž’wi“ÖwjžwkžŸwlžÛwmžÜwnžÝwožàwpžßwqžâwržéwsžçwtžåwužêwvžïwwŸ"wxŸ,wyŸ/wzŸ9w{Ÿ7w|Ÿ=w}Ÿ>w~ŸDscreen-5.0.2/tty.h0000664000175000017500000000116115224432722012436 0ustar alexalex#ifndef SCREEN_TTY_H #define SCREEN_TTY_H #include "screen.h" int OpenTTY (char *, char *); int CloseTTY (int); void InitTTY (struct mode *, int); void GetTTY (int, struct mode *); void SetTTY (int, struct mode *); void SetMode (struct mode *, struct mode *, int, int); void SetFlow (bool); void SendBreak (Window *, int, int); int TtyGrabConsole (int, bool, char *); char *TtyGetModemStatus (int, char *); void brktty (int); int fgtty(int fd); int CheckTtyname (char *); char *GetPtsPathOrSymlink (int); /* global variables */ extern bool separate_sids; extern int breaktype; #endif /* SCREEN_TTY_H */ screen-5.0.2/tty.c0000664000175000017500000006556315224432722012451 0ustar alexalex/* Copyright (c) 2008, 2009 * Juergen Weigert (jnweiger@immd4.informatik.uni-erlangen.de) * Michael Schroeder (mlschroe@immd4.informatik.uni-erlangen.de) * Micah Cowan (micah@cowan.name) * Sadrul Habib Chowdhury (sadrul@users.sourceforge.net) * Copyright (c) 1993-2002, 2003, 2005, 2006, 2007 * Juergen Weigert (jnweiger@immd4.informatik.uni-erlangen.de) * Michael Schroeder (mlschroe@immd4.informatik.uni-erlangen.de) * Copyright (c) 1987 Oliver Laumann * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3, or (at your option) * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program (see the file COPYING); if not, see * https://www.gnu.org/licenses/, or contact Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02111-1301 USA * **************************************************************** */ #include "config.h" #include "tty.h" #include #include #include #include #include #include #include #include #include #include /* For SRIOCSREDIR on Solaris */ #if defined(_sun_) # include #endif #include "screen.h" #include "fileio.h" #include "misc.h" #include "pty.h" #include "telnet.h" #include "tty.h" static void consredir_readev_fn(Event *, void *); static struct baud_values *lookup_baud (int); bool separate_sids = true; static void DoSendBreak(int, int, int); static void SigAlrmDummy(int); static int SttyMode(struct mode *, char *); static int SetBaud (struct mode *, int, int); /* Frank Schulz (fschulz@pyramid.com): * I have no idea why VSTART is not defined and my fix is probably not * the cleanest, but it works. */ #if !defined(VSTART) && defined(_VSTART) #define VSTART _VSTART #endif #if !defined(VSTOP) && defined(_VSTOP) #define VSTOP _VSTOP #endif #ifndef O_NOCTTY #define O_NOCTTY 0 #endif #ifndef TTYVMIN #define TTYVMIN 1 #endif #ifndef TTYVTIME #define TTYVTIME 0 #endif static void SigAlrmDummy( __attribute__ ((unused)) int sigsig) { return; } /* * Carefully open a character device. Not used to open display ttys. * The second parameter is parsed for a few stty style options. */ int OpenTTY(char *line, char *opt) { int f; struct mode Mode; void (*sigalrm) (int); sigalrm = xsignal(SIGALRM, SigAlrmDummy); alarm(2); /* this open only succeeds, if real uid is allowed */ if ((f = secopen(line, O_RDWR | O_NONBLOCK | O_NOCTTY, 0)) == -1) { if (errno == EINTR) Msg(0, "Cannot open line '%s' for R/W: open() blocked, aborted.", line); else Msg(errno, "Cannot open line '%s' for R/W", line); alarm(0); xsignal(SIGALRM, sigalrm); return -1; } if (!isatty(f)) { Msg(0, "'%s' is not a tty", line); alarm(0); xsignal(SIGALRM, sigalrm); close(f); return -1; } /* * We come here exclusively. This is to stop all kermit and cu type things * accessing the same tty line. * Perhaps we should better create a lock in some /usr/spool/locks directory? */ #if defined(TIOCEXCL) && defined(TIOCNXCL) errno = 0; if (ioctl(f, TIOCEXCL, NULL) < 0) Msg(errno, "%s: ioctl TIOCEXCL failed", line); #endif /* TIOCEXCL && TIOCNXCL */ /* * We create a sane tty mode. We do not copy things from the display tty */ InitTTY(&Mode, W_TYPE_PLAIN); if (SttyMode(&Mode, opt)) { Msg(errno, "%s: stty failed - invalid option?", line); alarm(0); xsignal(SIGALRM, sigalrm); close(f); return -1; } SetTTY(f, &Mode); #if defined(TIOCMSET) { int mcs = 0; ioctl(f, TIOCMGET, &mcs); mcs |= TIOCM_RTS; ioctl(f, TIOCMSET, &mcs); } #endif brktty(f); alarm(0); xsignal(SIGALRM, sigalrm); return f; } int CloseTTY(int fd) { #if defined(TIOCEXCL) && defined(TIOCNXCL) (void)ioctl(fd, TIOCNXCL, NULL); #endif return close(fd); } /* * Tty mode handling */ void InitTTY(struct mode *m, int ttyflag) { memset((char *)m, 0, sizeof(struct mode)); /* struct termios tio * defaults, as seen on SunOS 4.1.3 */ #if defined(BRKINT) m->tio.c_iflag |= BRKINT; #endif /* BRKINT */ #if defined(IGNPAR) m->tio.c_iflag |= IGNPAR; #endif /* IGNPAR */ /* #if defined(ISTRIP) * m->tio.c_iflag |= ISTRIP; * #endif * may be needed, let's try. jw. */ #if defined(IXON) m->tio.c_iflag |= IXON; #endif /* IXON */ /* #if defined(IMAXBEL) * m->tio.c_iflag |= IMAXBEL; * #endif * sorry, this one is ridiculous. jw */ if (!ttyflag) { /* may not even be good for ptys.. */ #if defined(ICRNL) m->tio.c_iflag |= ICRNL; #endif /* ICRNL */ #if defined(ONLCR) m->tio.c_oflag |= ONLCR; #endif /* ONLCR */ #if defined(TAB3) m->tio.c_oflag |= TAB3; #endif /* TAB3 */ #if defined(OXTABS) m->tio.c_oflag |= OXTABS; #endif /* OXTABS */ /* #if defined(PARENB) * m->tio.c_cflag |= PARENB; * #endif * nah! jw. */ #if defined(OPOST) m->tio.c_oflag |= OPOST; #endif /* OPOST */ } /* * Or-ing the speed into c_cflags is dangerous. * It breaks on bsdi, where c_ispeed and c_ospeed are extra longs. * * #if defined(B9600) * m->tio.c_cflag |= B9600; * #endif * #if defined(IBSHIFT) && defined(B9600) * m->tio.c_cflag |= B9600 << IBSHIFT; * #endif * * We hope that we have the posix calls to do it right: * If these are not available you might try the above. */ #if defined(B9600) cfsetospeed(&m->tio, B9600); #endif /* B9600 */ #if defined(B9600) cfsetispeed(&m->tio, B9600); #endif /* B9600 */ #if defined(CS8) m->tio.c_cflag |= CS8; #endif /* CS8 */ #if defined(CREAD) m->tio.c_cflag |= CREAD; #endif /* CREAD */ #if defined(CLOCAL) m->tio.c_cflag |= CLOCAL; #endif /* CLOCAL */ #if defined(ECHOCTL) m->tio.c_lflag |= ECHOCTL; #endif /* ECHOCTL */ #if defined(ECHOKE) m->tio.c_lflag |= ECHOKE; #endif /* ECHOKE */ if (!ttyflag) { #if defined(ISIG) m->tio.c_lflag |= ISIG; #endif /* ISIG */ #if defined(ICANON) m->tio.c_lflag |= ICANON; #endif /* ICANON */ #if defined(ECHO) m->tio.c_lflag |= ECHO; #endif /* ECHO */ } #if defined(ECHOE) m->tio.c_lflag |= ECHOE; #endif /* ECHOE */ #if defined(ECHOK) m->tio.c_lflag |= ECHOK; #endif /* ECHOK */ #if defined(IEXTEN) m->tio.c_lflag |= IEXTEN; #endif /* IEXTEN */ #if defined(VINTR) #if (VINTR < MAXCC) m->tio.c_cc[VINTR] = Ctrl('C'); #endif #endif /* VINTR */ #if defined(VQUIT) #if (VQUIT < MAXCC) m->tio.c_cc[VQUIT] = Ctrl('\\'); #endif #endif /* VQUIT */ #if defined(VERASE) #if (VERASE < MAXCC) m->tio.c_cc[VERASE] = 0x7f; /* DEL */ #endif #endif /* VERASE */ #if defined(VKILL) #if (VKILL < MAXCC) m->tio.c_cc[VKILL] = Ctrl('U'); #endif #endif /* VKILL */ #if defined(VEOF) #if (VEOF < MAXCC) m->tio.c_cc[VEOF] = Ctrl('D'); #endif #endif /* VEOF */ #if defined(VEOL) #if (VEOL < MAXCC) m->tio.c_cc[VEOL] = VDISABLE; #endif #endif /* VEOL */ #if defined(VEOL2) #if (VEOL2 < MAXCC) m->tio.c_cc[VEOL2] = VDISABLE; #endif #endif /* VEOL2 */ #if defined(VSWTCH) #if (VSWTCH < MAXCC) m->tio.c_cc[VSWTCH] = VDISABLE; #endif #endif /* VSWTCH */ #if defined(VSTART) #if (VSTART < MAXCC) m->tio.c_cc[VSTART] = Ctrl('Q'); #endif #endif /* VSTART */ #if defined(VSTOP) #if (VSTOP < MAXCC) m->tio.c_cc[VSTOP] = Ctrl('S'); #endif #endif /* VSTOP */ #if defined(VSUSP) #if (VSUSP < MAXCC) m->tio.c_cc[VSUSP] = Ctrl('Z'); #endif #endif /* VSUSP */ #if defined(VDSUSP) #if (VDSUSP < MAXCC) m->tio.c_cc[VDSUSP] = Ctrl('Y'); #endif #endif /* VDSUSP */ #if defined(VREPRINT) #if (VREPRINT < MAXCC) m->tio.c_cc[VREPRINT] = Ctrl('R'); #endif #endif /* VREPRINT */ #if defined(VDISCARD) #if (VDISCARD < MAXCC) m->tio.c_cc[VDISCARD] = Ctrl('O'); #endif #endif /* VDISCARD */ #if defined(VWERASE) #if (VWERASE < MAXCC) m->tio.c_cc[VWERASE] = Ctrl('W'); #endif #endif /* VWERASE */ #if defined(VLNEXT) #if (VLNEXT < MAXCC) m->tio.c_cc[VLNEXT] = Ctrl('V'); #endif #endif /* VLNEXT */ #if defined(VSTATUS) #if (VSTATUS < MAXCC) m->tio.c_cc[VSTATUS] = Ctrl('T'); #endif #endif /* VSTATUS */ if (ttyflag) { m->tio.c_cc[VMIN] = TTYVMIN; m->tio.c_cc[VTIME] = TTYVTIME; } #if defined(TIOCKSET) m->m_jtchars.t_ascii = 'J'; m->m_jtchars.t_kanji = 'B'; m->m_knjmode = KM_ASCII | KM_SYSSJIS; #endif } void SetTTY(int fd, struct mode *mp) { errno = 0; tcsetattr(fd, TCSADRAIN, &mp->tio); #if defined(TIOCKSET) ioctl(fd, TIOCKSETC, &mp->m_jtchars); ioctl(fd, TIOCKSET, &mp->m_knjmode); #endif if (errno) Msg(errno, "SetTTY (fd %d): ioctl failed", fd); } void GetTTY(int fd, struct mode *mp) { errno = 0; tcgetattr(fd, &mp->tio); #if defined(TIOCKSET) ioctl(fd, TIOCKGETC, &mp->m_jtchars); ioctl(fd, TIOCKGET, &mp->m_knjmode); #endif if (errno) Msg(errno, "GetTTY (fd %d): ioctl failed", fd); } /* * needs interrupt = iflag and flow = d->d_flow */ void SetMode(struct mode *op, struct mode *np, int flow, int interrupt) { *np = *op; #ifdef CYTERMIO np->m_mapkey = NOMAPKEY; np->m_mapscreen = NOMAPSCREEN; np->tio.c_line = 0; #endif #if defined(ICRNL) np->tio.c_iflag &= ~ICRNL; #endif /* ICRNL */ #if defined(ISTRIP) np->tio.c_iflag &= ~ISTRIP; #endif /* ISTRIP */ #if defined(ONLCR) np->tio.c_oflag &= ~ONLCR; #endif /* ONLCR */ np->tio.c_lflag &= ~(ICANON | ECHO); /* * From Andrew Myers (andru@tonic.lcs.mit.edu) * to avoid ^V^V-Problem on OSF1 */ #if defined(IEXTEN) np->tio.c_lflag &= ~IEXTEN; #endif /* IEXTEN */ /* * Unfortunately, the master process never will get SIGINT if the real * terminal is different from the one on which it was originally started * (process group membership has not been restored or the new tty could not * be made controlling again). In my solution, it is the attacher who * receives SIGINT (because it is always correctly associated with the real * tty) and forwards it to the master [kill(MasterPid, SIGINT)]. * Marc Boucher (marc@CAM.ORG) */ if (interrupt) np->tio.c_lflag |= ISIG; else np->tio.c_lflag &= ~ISIG; /* * careful, careful catche monkey.. * never set VMIN and VTIME to zero, if you want blocking io. * * We may want to do a VMIN > 0, VTIME > 0 read on the ptys too, to * reduce interrupt frequency. But then we would not know how to * handle read returning 0. jw. */ np->tio.c_cc[VMIN] = 1; np->tio.c_cc[VTIME] = 0; if (!interrupt || !flow) np->tio.c_cc[VINTR] = VDISABLE; np->tio.c_cc[VQUIT] = VDISABLE; if (flow == 0) { #if defined(VSTART) #if (VSTART < MAXCC) np->tio.c_cc[VSTART] = VDISABLE; #endif #endif /* VSTART */ #if defined(VSTOP) #if (VSTOP < MAXCC) np->tio.c_cc[VSTOP] = VDISABLE; #endif #endif /* VSTOP */ np->tio.c_iflag &= ~IXON; } #if defined(VDISCARD) #if (VDISCARD < MAXCC) np->tio.c_cc[VDISCARD] = VDISABLE; #endif #endif /* VDISCARD */ #if defined(VLNEXT) #if (VLNEXT < MAXCC) np->tio.c_cc[VLNEXT] = VDISABLE; #endif #endif /* VLNEXT */ #if defined(VSTATUS) #if (VSTATUS < MAXCC) np->tio.c_cc[VSTATUS] = VDISABLE; #endif #endif /* VSTATUS */ #if defined(VSUSP) #if (VSUSP < MAXCC) np->tio.c_cc[VSUSP] = VDISABLE; #endif #endif /* VSUSP */ /* Set VERASE to DEL, rather than VDISABLE, to avoid libvte "autodetect" issues. */ #if defined(VERASE) #if (VERASE < MAXCC) np->tio.c_cc[VERASE] = 0x7f; #endif #endif /* VERASE */ #if defined(VKILL) #if (VKILL < MAXCC) np->tio.c_cc[VKILL] = VDISABLE; #endif #endif /* VKILL */ #if defined(VDSUSP) #if (VDSUSP < MAXCC) np->tio.c_cc[VDSUSP] = VDISABLE; #endif #endif /* VDSUSP */ #if defined(VREPRINT) #if (VREPRINT < MAXCC) np->tio.c_cc[VREPRINT] = VDISABLE; #endif #endif /* VREPRINT */ #if defined(VWERASE) #if (VWERASE < MAXCC) np->tio.c_cc[VWERASE] = VDISABLE; #endif #endif /* VWERASE */ } /* operates on display */ void SetFlow(bool on) { if (D_flow == on) return; if (on) { D_NewMode.tio.c_cc[VINTR] = iflag ? D_OldMode.tio.c_cc[VINTR] : VDISABLE; #if defined(VSTART) #if (VSTART < MAXCC) D_NewMode.tio.c_cc[VSTART] = D_OldMode.tio.c_cc[VSTART]; #endif #endif /* VSTART */ #if defined(VSTOP) #if (VSTOP < MAXCC) D_NewMode.tio.c_cc[VSTOP] = D_OldMode.tio.c_cc[VSTOP]; #endif #endif /* VSTOP */ D_NewMode.tio.c_iflag |= D_OldMode.tio.c_iflag & IXON; } else { D_NewMode.tio.c_cc[VINTR] = VDISABLE; #if defined(VSTART) #if (VSTART < MAXCC) D_NewMode.tio.c_cc[VSTART] = VDISABLE; #endif #endif /* VSTART */ #if defined(VSTOP) #if (VSTOP < MAXCC) D_NewMode.tio.c_cc[VSTOP] = VDISABLE; #endif #endif /* VSTOP */ D_NewMode.tio.c_iflag &= ~IXON; } #ifdef TCOON if (!on) tcflow(D_userfd, TCOON); #endif tcsetattr(D_userfd, TCSANOW, &D_NewMode.tio); D_flow = on; } /* parse commands from opt and modify m */ static int SttyMode(struct mode *m, char *opt) { static const char sep[] = " \t:;,"; if (!opt) return 0; while (*opt) { while (strchr(sep, *opt)) opt++; if (*opt >= '0' && *opt <= '9') { if (SetBaud(m, atoi(opt), atoi(opt))) return -1; } else if (!strncmp("cs7", opt, 3)) { m->tio.c_cflag &= ~CSIZE; m->tio.c_cflag |= CS7; } else if (!strncmp("cs8", opt, 3)) { m->tio.c_cflag &= ~CSIZE; m->tio.c_cflag |= CS8; } else if (!strncmp("istrip", opt, 6)) { m->tio.c_iflag |= ISTRIP; } else if (!strncmp("-istrip", opt, 7)) { m->tio.c_iflag &= ~ISTRIP; } else if (!strncmp("ixon", opt, 4)) { m->tio.c_iflag |= IXON; } else if (!strncmp("-ixon", opt, 5)) { m->tio.c_iflag &= ~IXON; } else if (!strncmp("ixoff", opt, 5)) { m->tio.c_iflag |= IXOFF; } else if (!strncmp("-ixoff", opt, 6)) { m->tio.c_iflag &= ~IXOFF; } else if (!strncmp("crtscts", opt, 7)) { #if defined(CRTSCTS) m->tio.c_cflag |= CRTSCTS; #endif } else if (!strncmp("-crtscts", opt, 8)) { #if defined(CRTSCTS) m->tio.c_cflag &= ~CRTSCTS; #endif } else { return -1; } while (*opt && !strchr(sep, *opt)) opt++; } return 0; } /* * Job control handling * * Somehow the ultrix session handling is broken, so use * the bsdish variant. */ void brktty(int fd) { if (separate_sids) setsid(); /* will break terminal affiliation */ ioctl(fd, TIOCSCTTY, NULL); } int fgtty(int fd) { int mypid; mypid = getpid(); ioctl(fd, TIOCSCTTY, NULL); if (separate_sids) if (tcsetpgrp(fd, mypid)) return -1; return 0; } /* * The alm boards on our sparc center 1000 have a lousy driver. * We cannot generate long breaks unless we use the most ugly form * of ioctls. jw. */ int breaktype = 2; /* * type: * 0: TIOCSBRK / TIOCCBRK * 1: TCSBRK * 2: tcsendbreak() * n: approximate duration in 1/4 seconds. */ static void DoSendBreak(int fd, int n, int type) { switch (type) { case 2: /* tcsendbreak() =============================== */ #ifdef HAVE_SUPER_TCSENDBREAK /* There is one rare case that I have tested, where tcsendbreak works * really great: this was an alm driver that came with SunOS 4.1.3 * If you have this one, define the above symbol. * here we can use the second parameter to specify the duration. */ if (tcsendbreak(fd, n) < 0) Msg(errno, "cannot send BREAK (tcsendbreak)"); #else /* * here we hope, that multiple calls to tcsendbreak() can * be concatenated to form a long break, as we do not know * what exact interpretation the second parameter has: * * - sunos 4: duration in quarter seconds * - sunos 5: 0 a short break, nonzero a tcdrain() * - hpux, irix: ignored * - mot88: duration in milliseconds * - aix: duration in milliseconds, but 0 is 25 milliseconds. */ if (!n) n++; for (int i = 0; i < n; i++) if (tcsendbreak(fd, 0) < 0) { Msg(errno, "cannot send BREAK (tcsendbreak SVR4)"); return; } #endif break; case 1: /* TCSBRK ======================================= */ #ifdef TCSBRK if (!n) n++; /* * Here too, we assume that short breaks can be concatenated to * perform long breaks. But for SOLARIS, this is not true, of course. */ for (int i = 0; i < n; i++) if (ioctl(fd, TCSBRK, NULL) < 0) { Msg(errno, "Cannot send BREAK (TCSBRK)"); return; } #else /* TCSBRK */ Msg(0, "TCSBRK not available, change breaktype"); #endif /* TCSBRK */ break; case 0: /* TIOCSBRK / TIOCCBRK ========================== */ #if defined(TIOCSBRK) && defined(TIOCCBRK) /* * This is very rude. Screen actively celebrates the break. * But it may be the only save way to issue long breaks. */ if (ioctl(fd, TIOCSBRK, NULL) < 0) { Msg(errno, "Can't send BREAK (TIOCSBRK)"); return; } usleep(1000 * (n ? n * 250 : 250)); if (ioctl(fd, TIOCCBRK, NULL) < 0) { Msg(errno, "BREAK stuck!!! -- HELP! (TIOCCBRK)"); return; } #else /* TIOCSBRK && TIOCCBRK */ Msg(0, "TIOCSBRK/CBRK not available, change breaktype"); #endif /* TIOCSBRK && TIOCCBRK */ break; default: /* unknown ========================== */ Msg(0, "Internal SendBreak error: method %d unknown", type); } } /* * Send a break for n * 0.25 seconds. Tty must be PLAIN. * The longest possible break allowed here is 15 seconds. */ void SendBreak(Window * wp, int n, int closeopen) { void (*sigalrm) (int); #ifdef ENABLE_TELNET if (wp->w_type == W_TYPE_TELNET) { TelBreak(wp); return; } #endif if (wp->w_type != W_TYPE_PLAIN) return; (void)tcflush(wp->w_ptyfd, TCIOFLUSH); if (closeopen) { /* if we got exclusive access on tty, remove it */ #if defined(TIOCEXCL) && defined(TIOCNXCL) errno = 0; if (ioctl(wp->w_ptyfd, TIOCNXCL, NULL) < 0) Msg(errno, "%s: ioctl TIOCNXCL failed", wp->w_tty); #endif /* TIOCEXCL && TIOCNXCL */ close(wp->w_ptyfd); usleep(1000 * (n ? n * 250 : 250)); if ((wp->w_ptyfd = OpenTTY(wp->w_tty, wp->w_cmdargs[1])) < 1) { Msg(0, "Ouch, cannot reopen line %s, please try harder", wp->w_tty); return; } (void)fcntl(wp->w_ptyfd, F_SETFL, FNBLOCK); } else { sigalrm = xsignal(SIGALRM, SigAlrmDummy); alarm(15); DoSendBreak(wp->w_ptyfd, n, breaktype); alarm(0); xsignal(SIGALRM, sigalrm); } } /* * Console grabbing */ static Event consredir_ev; static int consredirfd[2] = { -1, -1 }; static void consredir_readev_fn(Event * event, void *data) { char *p, *n, buf[256]; size_t l; (void)data; /* unused */ if (!console_window || (l = read(consredirfd[0], buf, ARRAY_SIZE(buf))) <= 0) { close(consredirfd[0]); close(consredirfd[1]); consredirfd[0] = consredirfd[1] = -1; evdeq(event); return; } for (p = n = buf; l > 0; n++, l--) if (*n == '\n') { if (n > p) WriteString(console_window, p, n - p); WriteString(console_window, "\r\n", 2); p = n + 1; } if (n > p) WriteString(console_window, p, n - p); } int TtyGrabConsole(int fd, bool on, char *rc_name) { Display *d; #ifdef SRIOCSREDIR int cfd; #else struct mode new1, new2; char *slave; #endif (void)fd; /* unused */ if (on) { if (displays == NULL) { Msg(0, "I need a display"); return -1; } for (d = displays; d; d = d->d_next) if (strcmp(d->d_usertty, "/dev/console") == 0) break; if (d) { Msg(0, "too dangerous - screen is running on /dev/console"); return -1; } } if (consredirfd[0] >= 0) { evdeq(&consredir_ev); close(consredirfd[0]); close(consredirfd[1]); consredirfd[0] = consredirfd[1] = -1; } if (!on) return 0; #ifdef SRIOCSREDIR if ((cfd = secopen("/dev/console", O_RDWR | O_NOCTTY, 0)) == -1) { Msg(errno, "/dev/console"); return -1; } if (pipe(consredirfd)) { Msg(errno, "pipe"); close(cfd); consredirfd[0] = consredirfd[1] = -1; return -1; } if (ioctl(cfd, SRIOCSREDIR, consredirfd[1])) { Msg(errno, "SRIOCSREDIR ioctl"); close(cfd); close(consredirfd[0]); close(consredirfd[1]); consredirfd[0] = consredirfd[1] = -1; return -1; } close(cfd); #else /* special linux workaround for a too restrictive kernel */ if ((consredirfd[0] = OpenPTY(&slave)) < 0) { Msg(errno, "%s: could not open detach pty master", rc_name); return -1; } if ((consredirfd[1] = open(slave, O_RDWR | O_NOCTTY)) < 0) { Msg(errno, "%s: could not open detach pty slave", rc_name); close(consredirfd[0]); return -1; } InitTTY(&new1, 0); SetMode(&new1, &new2, 0, 0); SetTTY(consredirfd[1], &new2); if (UserContext() == 1) UserReturn(ioctl(consredirfd[1], TIOCCONS, (char *)&on)); if (UserStatus()) { Msg(errno, "%s: ioctl TIOCCONS failed", rc_name); close(consredirfd[0]); close(consredirfd[1]); return -1; } #endif consredir_ev.fd = consredirfd[0]; consredir_ev.type = EV_READ; consredir_ev.handler = consredir_readev_fn; evenq(&consredir_ev); return 0; } /* * Read modem control lines of a physical tty and write them to buf * in a readable format. * Will not write more than 256 characters to buf. * Returns buf; */ char *TtyGetModemStatus(int fd, char *buf) { char *p = buf; #ifdef TIOCGSOFTCAR unsigned int softcar; #endif #if defined(TIOCMGET) || defined(TIOCMODG) unsigned int mflags; #else #ifdef MCGETA /* this is yet another interface, found on hpux. grrr */ mflag mflags; #if defined(MDTR) #define TIOCM_DTR MDTR #endif /* MDTR */ #if defined(MRTS) #define TIOCM_RTS MRTS #endif /* MRTS */ #if defined(MDSR) #define TIOCM_DSR MDSR #endif /* MDSR */ #if defined(MDCD) #define TIOCM_CAR MDCD #endif /* MDCD */ #if defined(MRI) #define TIOCM_RNG MRI #endif /* MRI */ #if defined(MCTS) #define TIOCM_CTS MCTS #endif /* MCTS */ #endif #endif #if defined(CLOCAL) || defined(CRTSCTS) struct mode mtio; /* screen.h */ #endif #if defined(CRTSCTS) || defined(TIOCM_CTS) int rtscts; #endif int clocal; #if defined(CLOCAL) || defined(CRTSCTS) GetTTY(fd, &mtio); #endif clocal = 0; #ifdef CLOCAL if (mtio.tio.c_cflag & CLOCAL) { clocal = 1; *p++ = '{'; } #endif #ifdef TIOCM_CTS #ifdef CRTSCTS if (!(mtio.tio.c_cflag & CRTSCTS)) rtscts = 0; else #endif /* CRTSCTS */ rtscts = 1; #endif /* TIOCM_CTS */ #ifdef TIOCGSOFTCAR if (ioctl(fd, TIOCGSOFTCAR, (char *)&softcar) < 0) softcar = 0; #endif #if defined(TIOCMGET) || defined(TIOCMODG) || defined(MCGETA) #ifdef TIOCMGET if (ioctl(fd, TIOCMGET, (char *)&mflags) < 0) #else #ifdef TIOCMODG if (ioctl(fd, TIOCMODG, (char *)&mflags) < 0) #else if (ioctl(fd, MCGETA, &mflags) < 0) #endif #endif { #ifdef TIOCGSOFTCAR sprintf(p, "NO-TTY? %s", softcar ? "(CD)" : "CD"); #else sprintf(p, "NO-TTY?"); #endif p += strlen(p); } else { char *s; #ifdef FANCY_MODEM #ifdef TIOCM_LE if (!(mflags & TIOCM_LE)) for (s = "!LE "; *s; *p++ = *s++) ; #endif #endif /* FANCY_MODEM */ #ifdef TIOCM_RTS s = "!RTS "; if (mflags & TIOCM_RTS) s++; while (*s) *p++ = *s++; #endif #ifdef TIOCM_CTS s = "!CTS "; if (!rtscts) { *p++ = '('; s = "!CTS) "; } if (mflags & TIOCM_CTS) s++; while (*s) *p++ = *s++; #endif #ifdef TIOCM_DTR s = "!DTR "; if (mflags & TIOCM_DTR) s++; while (*s) *p++ = *s++; #endif #ifdef TIOCM_DSR s = "!DSR "; if (mflags & TIOCM_DSR) s++; while (*s) *p++ = *s++; #endif #if defined(TIOCM_CD) || defined(TIOCM_CAR) s = "!CD "; #ifdef TIOCGSOFTCAR if (softcar) { *p++ = '('; s = "!CD) "; } #endif #ifdef TIOCM_CD if (mflags & TIOCM_CD) s++; #else if (mflags & TIOCM_CAR) s++; #endif while (*s) *p++ = *s++; #endif #if defined(TIOCM_RI) || defined(TIOCM_RNG) #ifdef TIOCM_RI if (mflags & TIOCM_RI) #else if (mflags & TIOCM_RNG) #endif for (s = "RI "; *s; *p++ = *s++) ; #endif #ifdef FANCY_MODEM #ifdef TIOCM_ST s = "!ST "; if (mflags & TIOCM_ST) s++; while (*s) *p++ = *s++; #endif #ifdef TIOCM_SR s = "!SR "; if (mflags & TIOCM_SR) s++; while (*s) *p++ = *s++; #endif #endif /* FANCY_MODEM */ if (p > buf && p[-1] == ' ') p--; *p = '\0'; } #else #ifdef TIOCGSOFTCAR sprintf(p, " %s", softcar ? "(CD)", "CD"); p += strlen(p); #endif #endif if (clocal) *p++ = '}'; *p = '\0'; return buf; } static struct baud_values btable[] = { #if defined(B4000000) {4000000, B4000000}, #endif #if defined(B3500000) {3500000, B3500000}, #endif #if defined(B3000000) {3000000, B3000000}, #endif #if defined(B2500000) {2500000, B2500000}, #endif #if defined(B2000000) {2000000, B2000000}, #endif #if defined(B1500000) {1500000, B1500000}, #endif #if defined(B1152000) {1152000, B1152000}, #endif #if defined(B1000000) {1000000, B1000000}, #endif #if defined(B921600) {921600, B921600}, #endif #if defined(B576000) {576000, B576000}, #endif #if defined(B500000) {500000, B500000}, #endif #if defined(B460800) {460800, B460800}, #endif #if defined(B230400) {230400, B230400}, #endif #if defined(B115200) {115200, B115200}, #endif #if defined(B57600) {57600, B57600}, #endif #if defined(EXTB) {38400, EXTB}, #endif #if defined(B38400) {38400, B38400}, #endif #if defined(EXTA) {19200, EXTA}, #endif #if defined(B19200) {19200, B19200}, #endif #if defined(B9600) {9600, B9600}, #endif #if defined(B7200) {7200, B7200}, #endif #if defined(B4800) {4800, B4800}, #endif #if defined(B3600) {3600, B3600}, #endif #if defined(B2400) {2400, B2400}, #endif #if defined(B1800) {1800, B1800}, #endif #if defined(B1200) {1200, B1200}, #endif #if defined(B900) {900, B900}, #endif #if defined(B600) {600, B600}, #endif #if defined(B300) {300, B300}, #endif #if defined(B200) {200, B200}, #endif #if defined(B150) {150, B150}, #endif #if defined(B134) {134, B134}, #endif #if defined(B110) {110, B110}, #endif #if defined(B75) {75, B75}, #endif #if defined(B50) {50, B50}, #endif #if defined(B0) {0, B0}, #endif {-1, -1} }; /* * baud may either be a bits-per-second value or a symbolic * value as returned by cfget?speed() */ static struct baud_values *lookup_baud(int baud) { for (struct baud_values *p = btable; p->bps >= 0; p++) if (baud == p->bps || baud == p->sym) return p; return NULL; } /* * change the baud rate in a mode structure. * ibaud and obaud are given in bit/second, or at your option as * termio B... symbols as defined in e.g. suns sys/ttydev.h * -1 means don't change. */ static int SetBaud(struct mode *m, int ibaud, int obaud) { struct baud_values *ip, *op; if ((!(ip = lookup_baud(ibaud)) && ibaud != -1) || (!(op = lookup_baud(obaud)) && obaud != -1)) return -1; if (ip) cfsetispeed(&m->tio, ip->sym); if (op) cfsetospeed(&m->tio, op->sym); return 0; } int CheckTtyname(char *tty) { struct stat st; char realbuf[PATH_MAX]; const char *real; int rc; real = realpath(tty, realbuf); if (!real) return -1; realbuf[ARRAY_SIZE(realbuf) - 1] = 0; if (lstat(real, &st) || !S_ISCHR(st.st_mode) || (st.st_nlink > 1 && strncmp(real, "/dev", 4))) rc = -1; else rc = 0; return rc; } /* len(/proc/self/fd/) + len(max 64 bit int) */ #define MAX_PTS_SYMLINK (14 + 21) char *GetPtsPathOrSymlink(int fd) { int ret; char *tty_name; static char tty_symlink[MAX_PTS_SYMLINK]; errno = 0; tty_name = ttyname(fd); if (!tty_name && errno == ENODEV) { ret = snprintf(tty_symlink, MAX_PTS_SYMLINK, "/proc/self/fd/%d", fd); if (ret < 0 || ret >= MAX_PTS_SYMLINK) return NULL; /* We are setting errno to ENODEV to allow callers to check * whether the pts device exists in another namespace. */ errno = ENODEV; return tty_symlink; } return tty_name; } screen-5.0.2/tests/0000775000175000017500000000000015224432722012610 5ustar alexalexscreen-5.0.2/tests/test-winmsgcond.c0000664000175000017500000001201115224432722016074 0ustar alexalex/* Copyright (c) 2013 * Mike Gerwitz (mtg@gnu.org) * * This file is part of GNU screen. * * GNU screen is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3, or (at your option) * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program (see the file COPYING); if not, see * . * **************************************************************** */ #include #include "../winmsgcond.h" #include "signature.h" #include "macros.h" SIGNATURE_CHECK(wmc_init, void, (WinMsgCond *, int)); SIGNATURE_CHECK(wmc_set, void, (WinMsgCond *)); SIGNATURE_CHECK(wmc_clear, void, (WinMsgCond *)); SIGNATURE_CHECK(wmc_is_active, bool, (const WinMsgCond *)); SIGNATURE_CHECK(wmc_is_set, bool, (const WinMsgCond *)); SIGNATURE_CHECK(wmc_else, int, (WinMsgCond *, int, bool *)); SIGNATURE_CHECK(wmc_end, int, (const WinMsgCond *, int, bool *)); SIGNATURE_CHECK(wmc_deinit, void, (WinMsgCond *)); int main(void) { /* simple test with no "else" */ { WinMsgCond wmc; int pos = 0; bool chg; wmc_init(&wmc, pos); ASSERT(wmc_is_active(&wmc) == true); /* from the above init, we should be false by default and therefore the * original pointer should be returned (non-match), intended to wipe out * changes to the buffer */ ASSERT(wmc_is_set(&wmc) == false); ASSERT(wmc_end(&wmc, pos + 1, &chg) == pos); ASSERT(chg); /* the above should also work without any chg pointer */ ASSERT(wmc_end(&wmc, pos + 1, NULL) == pos); /* but if we set the flag, then the given position should be returned, * indicating that it should be kept */ wmc_set(&wmc); ASSERT(wmc_is_set(&wmc) == true); ASSERT(wmc_end(&wmc, pos + 1, &chg) == pos + 1); ASSERT(!chg); /* we should be able to subsequently clear the flag and once again have * the original position returned */ wmc_clear(&wmc); ASSERT(wmc_is_set(&wmc) == false); ASSERT(wmc_end(&wmc, pos + 1, &chg) == pos); ASSERT(chg); /* after we deinitialize, we should not be considered active and sets * should be ignored */ wmc_deinit(&wmc); ASSERT(wmc_is_active(&wmc) == false); ASSERT(wmc_is_set(&wmc) == false); ASSERT(wmc_end(&wmc, pos + 1, &chg) == 0); ASSERT(chg); wmc_set(&wmc); ASSERT(wmc_is_set(&wmc) == false); ASSERT(wmc_end(&wmc, pos + 1, &chg) == 0); ASSERT(chg); wmc_clear(&wmc); ASSERT(wmc_end(&wmc, pos + 1, &chg) == 0); ASSERT(chg); /* after deinitializing when active, ending should not return given * pointer (that is, ensure we're cleared) */ wmc_init(&wmc, pos); wmc_set(&wmc); ASSERT(wmc_end(&wmc, pos + 1, &chg) == pos + 1); ASSERT(!chg); wmc_deinit(&wmc); ASSERT(wmc_is_set(&wmc) == false); ASSERT(wmc_end(&wmc, pos + 1, &chg) == 0); ASSERT(chg); } /* "else" condition */ { WinMsgCond wmc; int pos = 0; int epos = pos + 2; bool chg; /* if the first condition is never set, then the else condition shall * always be true */ wmc_init(&wmc, pos); ASSERT(wmc_else(&wmc, epos, &chg) == pos); ASSERT(chg); ASSERT(wmc_end(&wmc, epos + 1, &chg) == epos + 1); ASSERT(!chg); /* the above should also work without a change ptr */ wmc_init(&wmc, pos); ASSERT(wmc_else(&wmc, epos, NULL) == pos); ASSERT(wmc_end(&wmc, epos + 1, NULL) == epos + 1); /* furthermore, it cannot be set to false (that doesn't make sense---we * are an "else" block */ wmc_clear(&wmc); ASSERT(wmc_end(&wmc, epos + 1, &chg) == epos + 1); ASSERT(!chg); /* deinit should still clear us */ wmc_deinit(&wmc); ASSERT(wmc_is_active(&wmc) == false); ASSERT(wmc_is_set(&wmc) == false); ASSERT(wmc_end(&wmc, epos + 1, &chg) == 0); ASSERT(chg); /* in the case of a truthful first condition, "else" shall never * match */ wmc_init(&wmc, pos); wmc_set(&wmc); wmc_else(&wmc, epos, NULL); ASSERT(wmc_is_set(&wmc) == false); ASSERT(wmc_end(&wmc, epos + 1, &chg) == epos); ASSERT(chg); /* and deinit shall still work the same */ wmc_deinit(&wmc); ASSERT(wmc_end(&wmc, epos + 1, &chg) == 0); ASSERT(chg); } /* the true usefulness of the change ptr comes into play when there are no * offset differences between the if and else branches, but the distinction * is still meaningful */ { WinMsgCond wmc; int pos = 0; bool chg; /* encounter "else" at the same position; we should still have a change, * because the if branch is not true */ wmc_init(&wmc, pos); wmc_else(&wmc, pos, &chg); ASSERT(chg); wmc_end(&wmc, pos, &chg); ASSERT(!chg); /* similarly, test the reverse---else branch taken */ wmc_init(&wmc, pos); wmc_set(&wmc); wmc_else(&wmc, pos, &chg); ASSERT(!chg); wmc_end(&wmc, pos, &chg); ASSERT(chg); } return 0; } screen-5.0.2/tests/test-winmsgbuf.c0000664000175000017500000003334715224432722015744 0ustar alexalex/* Copyright (c) 2013 * Mike Gerwitz (mtg@gnu.org) * * This file is part of GNU screen. * * GNU screen is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3, or (at your option) * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program (see the file COPYING); if not, see * . * **************************************************************** */ #include "../winmsgbuf.h" #include "signature.h" #include "macros.h" SIGNATURE_CHECK(wmb_create, WinMsgBuf *, ()); SIGNATURE_CHECK(wmb_expand, size_t, (WinMsgBuf *, size_t)); SIGNATURE_CHECK(wmb_rendadd, void, (WinMsgBuf *, uint64_t, int)); SIGNATURE_CHECK(wmb_size, size_t, (const WinMsgBuf *)); SIGNATURE_CHECK(wmb_contents, const char *, (const WinMsgBuf *)); SIGNATURE_CHECK(wmb_reset, void, (WinMsgBuf *)); SIGNATURE_CHECK(wmb_free, void, (WinMsgBuf *)); SIGNATURE_CHECK(wmbc_create, WinMsgBufContext *, (WinMsgBuf *)); SIGNATURE_CHECK(wmbc_rewind, void, (WinMsgBufContext *)); SIGNATURE_CHECK(wmbc_fastfw0, void, (WinMsgBufContext *)); SIGNATURE_CHECK(wmbc_fastfw_end, void, (WinMsgBufContext *)); SIGNATURE_CHECK(wmbc_putchar, void, (WinMsgBufContext *, char)); SIGNATURE_CHECK(wmbc_strncpy, const char *, (WinMsgBufContext *, const char *, size_t)); SIGNATURE_CHECK(wmbc_strcpy, const char *, (WinMsgBufContext *, const char *)); SIGNATURE_CHECK(wmbc_printf, int, (WinMsgBufContext *, const char *, ...)); SIGNATURE_CHECK(wmbc_offset, size_t, (WinMsgBufContext *)); SIGNATURE_CHECK(wmbc_bytesleft, size_t, (WinMsgBufContext *)); SIGNATURE_CHECK(wmbc_mergewmb, const char *, (WinMsgBufContext *, WinMsgBuf *)); SIGNATURE_CHECK(wmbc_finish, const char *, (WinMsgBufContext *)); SIGNATURE_CHECK(wmbc_free, void, (WinMsgBufContext *)); int main(void) { { WinMsgBuf *wmb = wmb_create(); /* we should start off with a null-terminated buffer */ ASSERT(wmb_size(wmb) > 0); ASSERT(*wmb_contents(wmb) == '\0'); /* TODO: rendition state */ /* buffer shall be expandable to accommodate a minimum number of bytes */ size_t old = wmb_size(wmb); size_t want = old + 3; ASSERT_REALLOC(>= want, ASSERT(wmb_expand(wmb, want) >= want)); /* buffer will not expand if unneeded */ size_t new = wmb_size(wmb); ASSERT_NOALLOC(ASSERT(wmb_expand(wmb, want) == new)); ASSERT_NOALLOC(ASSERT(wmb_expand(wmb, want - 1) == new)); ASSERT_NOALLOC(ASSERT(wmb_expand(wmb, 0) == new);); /* if buffer expansion fails, the original size shall be retained */ ASSERT_GCC(FAILLOC(wmb_expand(wmb, new + 5)) == new); /* resetting should put us back to our starting state, but should do * nothing with the buffer size */ wmb_reset(wmb); ASSERT(*wmb_contents(wmb) == '\0'); ASSERT(wmb_size(wmb) == new); /* TODO: rendition state */ wmb_free(wmb); } /* wmb_create should return NULL on allocation failure */ { ASSERT_GCC(FAILLOC(wmb_create()) == NULL); } /* scenerio: writing to single buffer via separate contexts---while * maintaining separate pointers between them---and retrieving a final * result */ { WinMsgBuf *wmb = wmb_create(); WinMsgBufContext *wmbc = wmbc_create(wmb); WinMsgBufContext *wmbc2 = wmbc_create(wmb); /* the offset at this point should be 0 (beginning of buffer) */ ASSERT(wmbc_offset(wmbc) == 0); ASSERT(wmbc_offset(wmbc2) == 0); ASSERT(wmbc_bytesleft(wmbc) == wmb_size(wmb)); ASSERT(wmbc_bytesleft(wmbc2) == wmb_size(wmb)); /* putting a character should increase the offset and decrease the * number of bytes remaining */ char c = 'c'; wmbc_putchar(wmbc, c); ASSERT(wmbc_offset(wmbc) == 1); ASSERT(wmbc_bytesleft(wmbc) == wmb_size(wmb) - 1); /* multiple contexts should move independently of one-another */ ASSERT(wmbc_offset(wmbc2) == 0); ASSERT(wmbc_bytesleft(wmbc2) == wmb_size(wmb)); /* the contents of the buffer should reflect the change */ ASSERT(*wmb_contents(wmb) == c); ASSERT(*wmbc_finish(wmbc) == c); /* the second context is still at the first position, so it should * overwrite the first character */ char c2 = 'd'; wmbc_putchar(wmbc2, c2); ASSERT(wmbc_offset(wmbc2) == 1); ASSERT(*wmb_contents(wmb) == c2); ASSERT(*wmbc_finish(wmbc) == c2); ASSERT(*wmbc_finish(wmbc2) == c2); /* wmbc_finish should terminate the string; we will add a character at * the second index to ensure that it is added */ char cx = 'x'; wmbc_putchar(wmbc2, cx); ASSERT(wmbc_offset(wmbc2) == 2); ASSERT(wmb_contents(wmb)[1] == cx); ASSERT(wmbc_finish(wmbc)[1] == '\0'); ASSERT(wmb_contents(wmb)[1] == '\0'); /* furthermore, finishing should not adjust the offset, so that we can * continue where we left off */ ASSERT(wmbc_offset(wmbc) == 1); wmbc_putchar(wmbc, cx); ASSERT(wmb_contents(wmb)[1] == cx); wmbc_free(wmbc2); wmbc_free(wmbc); wmb_free(wmb); } /* scenerio: write bytes and move around the buffer */ { WinMsgBuf *wmb = wmb_create(); WinMsgBufContext *wmbc = wmbc_create(wmb); /* initialize buffer to contain the string "foo" */ wmbc_putchar(wmbc, 'f'); wmbc_putchar(wmbc, 'o'); wmbc_putchar(wmbc, 'o'); wmbc_putchar(wmbc, '\0'); /* before continuing, just make sure we are where we expect to be (test * sanity check) */ ASSERT(wmbc_offset(wmbc) == 4); /* rewind to the beginning */ wmbc_rewind(wmbc); ASSERT(wmbc_offset(wmbc) == 0); /* we should be able to now affect the first character */ char c = 'm'; ASSERT(*wmb_contents(wmb) == 'f'); /* sanity check */ wmbc_putchar(wmbc, c); ASSERT(*wmb_contents(wmb) == c); /* fast-forward to the null byte (which should bring our pointer to a * single byte before our position after having written "foo") */ ASSERT(wmbc_offset(wmbc) == 1); /* sanity check */ wmbc_fastfw0(wmbc); ASSERT(wmbc_offset(wmbc) == 3); /* that should allow us to continue where we left off, similar to how * wmbc_finish allows us to continue */ ASSERT(wmb_contents(wmb)[3] != c); /* test case sanity check */ wmbc_putchar(wmbc, c); ASSERT(wmb_contents(wmb)[3] == c); /* we should also be able to fast-forward to the very end of the buffer * (that is, the next write would trigger an expansion); this is of * limited use externally */ wmbc_fastfw_end(wmbc); ASSERT(wmbc_offset(wmbc) == wmb_size(wmb)); ASSERT(wmbc_bytesleft(wmbc) == 0); wmbc_free(wmbc); wmb_free(wmb); } /* scenerio: write past end of buffer to trigger buffer expansion rather * than overflow */ { WinMsgBuf *wmb = wmb_create(); WinMsgBufContext *wmbc = wmbc_create(wmb); size_t szstart = wmb_size(wmb); /* fast-forward to end of buffer and write a character, which shall * trigger expansion */ char c = 'c'; wmbc_fastfw_end(wmbc); wmbc_putchar(wmbc, c); ASSERT(wmb_size(wmb) > szstart); ASSERT(wmb_contents(wmb)[wmbc_offset(wmbc) - 1] == c); /* if expansion fails, then the character will not be written and shall * be silently ignored; this has the effect of truncating the string * (and should only ever happen in terrible conditions) */ size_t sznew = wmb_size(wmb); char cfail = wmb_contents(wmb)[sznew - 1] + 1; wmbc_fastfw_end(wmbc); ASSERT(wmbc_offset(wmbc) > szstart); /* sanity check */ FAILLOC_VOID(wmbc_putchar(wmbc, cfail)); /* fail expansion */ ASSERT_GCC(wmb_size(wmb) == sznew); /* should not have written char at last position */ ASSERT_GCC(wmb_contents(wmb)[sznew - 1] != cfail); ASSERT_GCC(wmbc_offset(wmbc) == sznew); wmbc_free(wmbc); wmb_free(wmb); } /* scenerio: copy strings into buffer, also attempting to expand buffer */ { WinMsgBuf *wmb = wmb_create(); WinMsgBufContext *wmbc = wmbc_create(wmb); /* attempt complete string copy (just like strcpy, a pointer is returned * to the first copied character in the destination) */ const char str[] = "test string"; ASSERT(*wmbc_strcpy(wmbc, str) == str[0]); ASSERT(wmbc_offset(wmbc) == strlen(str)); ASSERT(STREQ(wmbc_finish(wmbc), str)); /* how about a partial string copy (which does not contain a null byte)? */ size_t n = 4; wmbc_rewind(wmbc); ASSERT(*wmbc_strncpy(wmbc, str, n) == str[0]); ASSERT(wmbc_offset(wmbc) == n); ASSERT(STREQ(wmbc_finish(wmbc), "test")); /* finish adds null byte */ /* if we cannot fit any more contents, then the buffer should be * expanded in both instances (look at that---a safe strcpy) */ size_t szfirst = wmb_size(wmb); wmbc_fastfw_end(wmbc); /* first try strcpy */ wmbc_strcpy(wmbc, str); size_t szsecond = wmb_size(wmb); ASSERT(szsecond > szfirst); ASSERT(wmbc_offset(wmbc) == szfirst + strlen(str)); /* then strncpy */ wmbc_fastfw_end(wmbc); wmbc_strncpy(wmbc, str, n); ASSERT(wmb_size(wmb) > szsecond); ASSERT(wmbc_offset(wmbc) == szsecond + n); /* if the buffer cannot be expanded, nothing shall be copied (similar to * putchar); importantly, we cannot return a pointer to the buffer * position that would represent the first character copied, because it * is outside the bounds of the buffer */ size_t szmax = wmb_size(wmb); char last = wmb_contents(wmb)[szmax - 1]; wmbc_fastfw_end(wmbc); /* strcpy */ ASSERT(FAILLOC(wmbc_strcpy(wmbc, str)) == NULL); ASSERT_GCC(wmb_size(wmb) == szmax); ASSERT_GCC(wmb_contents(wmb)[szmax - 1] == last); /* strncpy */ ASSERT(FAILLOC(wmbc_strncpy(wmbc, str, n)) == NULL); ASSERT_GCC(wmb_size(wmb) == szmax); ASSERT_GCC(wmb_contents(wmb)[szmax - 1] == last); wmbc_free(wmbc); wmb_free(wmb); } /* scenerio: formatted strings into buffer, also triggering expansion */ { WinMsgBuf *wmb = wmb_create(); WinMsgBufContext *wmbc = wmbc_create(wmb); /* we will not be testing whether sprintf-style formatting works (since * that would be testing vsnprintf), but make sure that it actually does * something */ char *expect = "test: foo"; ASSERT(wmbc_printf(wmbc, "test: %s", "foo") == (int)strlen(expect)); ASSERT(STREQ(wmbc_finish(wmbc), expect)); ASSERT(wmbc_offset(wmbc) == strlen(expect)); /* even though sprintf produces a null-terminated string, we do not make * use of the null byte, so we should be able to treat multiple calls as * concatenation */ char *add = "bar"; size_t szadd = strlen(add); char *expect2 = malloc(strlen(expect) + szadd + 1); strcpy(expect2, expect); strcat(expect2, add); ASSERT(wmbc_printf(wmbc, "%s", add) == (int)szadd); ASSERT(STREQ(wmbc_finish(wmbc), expect2)); ASSERT(wmbc_offset(wmbc) == strlen(expect2)); /* should trigger expansion if we do not have enough room */ size_t szfirst = wmb_size(wmb); wmbc_fastfw_end(wmbc); ASSERT(wmbc_offset(wmbc) == szfirst); /* sanity check */ ASSERT(wmbc_printf(wmbc, "%s", add) == (int)szadd); ASSERT(wmb_size(wmb) > szfirst); ASSERT(STREQ(&wmbc_finish(wmbc)[szfirst], add)); ASSERT(wmbc_offset(wmbc) == szfirst + szadd); /* if the buffer cannot be expanded, then we should write only the * number of bytes that could fit */ size_t szsecond = wmb_size(wmb); wmbc_fastfw_end(wmbc); wmbc->p--; /* :x */ ASSERT_GCC(FAILLOC(wmbc_printf(wmbc, "%s", add)) == 1); ASSERT_GCC(wmbc_offset(wmbc) == wmb_size(wmb)); ASSERT_GCC(wmb_size(wmb) == szsecond); /* sanity check */ wmbc_free(wmbc); wmb_free(wmb); free(expect2); } /* scenerio: merging the contents of two separate buffers, also * triggering expansion */ { WinMsgBuf *wmb1 = wmb_create(); WinMsgBuf *wmb2 = wmb_create(); WinMsgBufContext *wmbc1 = wmbc_create(wmb1); WinMsgBufContext *wmbc2 = wmbc_create(wmb2); /* populate both buffers; by this point, we know that everything is * working properly, so no need to assert on these */ char *str2 = "bar"; wmbc_strcpy(wmbc1, "foo"); wmbc_strcpy(wmbc2, str2); /* if we merge the second into the first, we'd expect the equivalent * of string concatenation (note that the buffer is expected to be * null-terminated!) */ const char *expected = "foobar"; /* technically we don't need to finish here because we wrote a null * byte, but this is depending on implementation details; for * safety, we should always ensure we have a null byte */ wmbc_finish(wmbc2); ASSERT(*wmbc_mergewmb(wmbc1, wmb2) == *str2); ASSERT(STREQ(wmbc_finish(wmbc1), expected)); /* we futher expect to have advanced the pointer by the length of * the merged buffer, sans the terminating null byte */ ASSERT(wmbc_offset(wmbc1) == strlen(expected)); /* TODO: rendition state */ /* if we now attempt to merge past the end of the buffer, we would * expect that expansion will take place */ size_t szfirst = wmb_size(wmb1); wmbc_fastfw_end(wmbc1); ASSERT(wmbc_offset(wmbc1) == szfirst); /* sanity check */ /* this line did actually catch a bug due to realloc */ ASSERT(*wmbc_mergewmb(wmbc1, wmb2) == *str2); ASSERT(wmb_size(wmb1) > szfirst); ASSERT(STREQ(&wmbc_finish(wmbc1)[szfirst], str2)); /* if the buffer cannot be expanded, then we should simply not copy * the buffer contents */ size_t szsecond = wmb_size(wmb1); wmbc_fastfw_end(wmbc1); ASSERT(wmbc_offset(wmbc1) == szsecond); /* sanity check */ ASSERT_GCC(FAILLOC(wmbc_mergewmb(wmbc1, wmb2) == NULL)); ASSERT_GCC(wmb_size(wmb1) == szsecond); wmbc_free(wmbc2); wmbc_free(wmbc1); wmb_free(wmb2); wmb_free(wmb1); } /* context creation issues */ { WinMsgBuf *wmb = wmb_create(); /* wmbc_create() should return NULL on allocation failure */ ASSERT_GCC(FAILLOC(wmbc_create(wmb)) == NULL); /* it should also return NULL if no buffer is provided (this could * happen on an unchecked (*gasp*) wmb_create() failure */ ASSERT(wmbc_create(NULL) == NULL); wmb_free(wmb); } return 0; } screen-5.0.2/tests/signature.h0000664000175000017500000000371315224432722014766 0ustar alexalex/* Macro for checking that a function declaration is compliant. Copyright (C) 2009-2013 Free Software Foundation, Inc. This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ #ifndef SIGNATURE_CHECK /* Check that the function FN takes the specified arguments ARGS with a return type of RET. This header is designed to be included after and the one system header that is supposed to contain the function being checked, but prior to any other system headers that are necessary for the unit test. Therefore, this file does not include any system headers, nor reference anything outside of the macro arguments. For an example, if foo.h should provide: extern int foo (char, float); then the unit test named test-foo.c would start out with: #include #include #include "signature.h" SIGNATURE_CHECK (foo, int, (char, float)); #include ... */ # define SIGNATURE_CHECK(fn, ret, args) \ SIGNATURE_CHECK1 (fn, ret, args, __LINE__) /* Necessary to allow multiple SIGNATURE_CHECK lines in a unit test. Note that the checks must not occupy the same line. */ # define SIGNATURE_CHECK1(fn, ret, args, id) \ SIGNATURE_CHECK2 (fn, ret, args, id) /* macroexpand line */ # define SIGNATURE_CHECK2(fn, ret, args, id) \ static ret (* __attribute__((unused)) signature_check ## id) args = fn #endif /* SIGNATURE_CHECK */ screen-5.0.2/tests/mallocmock.c0000664000175000017500000000313115224432722015073 0ustar alexalex/* Copyright (c) 2013 * Mike Gerwitz (mtg@gnu.org) * * This file is part of GNU screen. * * GNU screen is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3, or (at your option) * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program (see the file COPYING); if not, see * . * **************************************************************** */ #include "config.h" #include #include extern void *__libc_malloc(size_t); extern void *__libc_realloc(void *, size_t); /* Total number of bytes requested via *alloc */ size_t _mallocmock_malloc_size = 0; size_t _mallocmock_realloc_size = 0; /* Cause calls to return NULL */ bool _mallocmock_fail = false; #ifdef _GNU_SOURCE /* glibc declares this as a weak symbol, so we can override it */ void *malloc(size_t size) { if (_mallocmock_fail) return NULL; _mallocmock_malloc_size += size; return __libc_malloc(size); } void *realloc(void *ptr, size_t size) { if (_mallocmock_fail) return NULL; _mallocmock_realloc_size += size; return __libc_realloc(ptr, size); } void mallocmock_reset() { _mallocmock_malloc_size = 0; _mallocmock_realloc_size = 0; } #endif screen-5.0.2/tests/macros.h0000664000175000017500000001120115224432722014240 0ustar alexalex/* Common macros used by gnulib tests. Modified from its original by the GNU screen project. Copyright (C) 2006-2013 Free Software Foundation, Inc. This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ /* This file contains macros that are used by many gnulib tests. Put here only frequently used macros, say, used by 10 tests or more. */ #include #include #include /* Define ASSERT_STREAM before including this file if ASSERT must target a stream other than stderr. */ #ifndef ASSERT_STREAM # define ASSERT_STREAM stderr #endif /* ASSERT (condition); verifies that the specified condition is fulfilled. If not, a message is printed to ASSERT_STREAM if defined (defaulting to stderr if undefined) and the program is terminated with an error code. This macro has the following properties: - The programmer specifies the expected condition, not the failure condition. This simplifies thinking. - The condition is tested always, regardless of compilation flags. (Unlike the macro from .) - On Unix platforms, the tester can debug the test program with a debugger (provided core dumps are enabled: "ulimit -c unlimited"). - For the sake of platforms where no debugger is available (such as some mingw systems), an error message is printed on the error stream that includes the source location of the ASSERT invocation. */ #define ASSERT(expr) \ do \ { \ if (!(expr)) \ { \ fprintf (ASSERT_STREAM, "%s:%d: assertion '%s' failed\n", \ __FILE__, __LINE__, #expr); \ fflush (ASSERT_STREAM); \ abort (); \ } \ } \ while (0) /* SIZEOF (array) returns the number of elements of an array. It works for arrays that are declared outside functions and for local variables of array type. It does *not* work for function parameters of array type, because they are actually parameters of pointer type. */ #define SIZEOF(array) (sizeof (array) / sizeof (array[0])) /* STREQ (str1, str2) Return true if two strings compare equal. */ #define STREQ(a, b) (strcmp (a, b) == 0) /* Some numbers in the interval [0,1). */ extern const float randomf[1000]; extern const double randomd[1000]; extern const long double randoml[1000]; /* GNU supports malloc hooks; otherwise, assertions will be skipped (but calls * will still be run for side-effects) */ #ifdef _GNU_SOURCE extern size_t _mallocmock_malloc_size; extern size_t _mallocmock_realloc_size; extern bool _mallocmock_fail; void mallocmock_reset(); #define ASSERT_ALLOC(type, cmp, x) \ MALLOC_RESET_COUNT(); x; ASSERT(_mallocmock_##type##_size cmp) #define ASSERT_MALLOC(cmp, x) ASSERT_ALLOC(malloc, cmp, x); #define ASSERT_REALLOC(cmp, x) ASSERT_ALLOC(realloc, cmp, x); #define MALLOC_RESET_COUNT() mallocmock_reset() #define ASSERT_NOALLOC(x) \ MALLOC_RESET_COUNT(); \ x; \ ASSERT(_mallocmock_malloc_size == 0); \ ASSERT(_mallocmock_realloc_size == 0); /* Use only with ASSERT_GCC */ #define FAILLOC(x) ({ \ _mallocmock_fail = true; \ __typeof__ (x) __ret = (x); \ _mallocmock_fail = false; \ __ret; \ }) #define FAILLOC_VOID(x) \ _mallocmock_fail = true; \ x; \ _mallocmock_fail = false; #define ASSERT_GCC(x) ASSERT(x) #else #define ASSERT_MALLOC(cmp, x) x #define ASSERT_REALLOC(cmp, x) x #define ASSERT_NOALLOC(cmp, x) x #define MALLOC_RESET_COUNT() #define FAILLOC(x) /* no portable equivalent! */ #define FAILLOC_VOID(x) /* no portable equivalent! */ #define ASSERT_GCC(x) #endif screen-5.0.2/tests/integration-detach.c0000664000175000017500000000771315224432722016535 0ustar alexalex#define _GNU_SOURCE #define _XOPEN_SOURCE 600 #include #include #include #include #include #include #include #include #include #include "macros.h" #define STATE_WAIT_RETRIES 100 #define EXIT_WAIT_RETRIES 50 static int run_command(const char *cmd, char *output, size_t output_size) { FILE *fp; size_t used = 0; int status; int ch; ASSERT(output_size > 0); output[0] = '\0'; fp = popen(cmd, "r"); ASSERT(fp != NULL); while ((ch = fgetc(fp)) != EOF) { if (used + 1 < output_size) output[used++] = (char)ch; } output[used] = '\0'; status = pclose(fp); ASSERT(status != -1); ASSERT(WIFEXITED(status)); return WEXITSTATUS(status); } static bool have_script(void) { char output[16]; return run_command("command -v script >/dev/null 2>&1", output, sizeof(output)) == 0; } static bool session_has_state(const char *session, const char *state) { char cmd[256]; char output[4096]; char *line; char *saveptr; snprintf(cmd, sizeof(cmd), "LC_ALL=C ./screen -ls 2>&1"); if (run_command(cmd, output, sizeof(output)) > 1) return false; for (line = strtok_r(output, "\n", &saveptr); line; line = strtok_r(NULL, "\n", &saveptr)) { char *session_pos = strstr(line, session); if (session_pos && strstr(session_pos, state)) return true; } return false; } static bool wait_for_state(const char *session, const char *state, int retries) { struct timespec delay; delay.tv_sec = 0; delay.tv_nsec = 100000000; while (retries-- > 0) { if (session_has_state(session, state)) return true; nanosleep(&delay, NULL); } return false; } static pid_t spawn_attached_client(const char *session) { char attach_cmd[256]; pid_t pid; snprintf(attach_cmd, sizeof(attach_cmd), "./screen -r %s", session); pid = fork(); if (pid < 0) return -1; if (pid == 0) { if (setenv("TERM", "xterm", 1) != 0) _exit(127); execlp("script", "script", "-q", "-c", attach_cmd, "/dev/null", (char *)NULL); _exit(127); } return pid; } static void cleanup_session(const char *session) { char cmd[256]; char output[4096]; snprintf(cmd, sizeof(cmd), "./screen -S %s -X quit 2>&1", session); (void)run_command(cmd, output, sizeof(output)); } int main(void) { char cmd[256]; char output[4096]; char session[64]; pid_t attached_pid; int result; int status; int retries; struct timespec delay; attached_pid = -1; result = 1; if (!have_script()) { fprintf(stderr, "SKIP: script not available\n"); return 77; } ASSERT(setenv("TERM", "xterm", 1) == 0); snprintf(session, sizeof(session), "detach-fix-%ld", (long)getpid()); delay.tv_sec = 0; delay.tv_nsec = 100000000; snprintf(cmd, sizeof(cmd), "./screen -dmS %s sh -c 'sleep 30' 2>&1", session); ASSERT(run_command(cmd, output, sizeof(output)) == 0); attached_pid = spawn_attached_client(session); if (attached_pid < 0) { fprintf(stderr, "failed to spawn attached client\n"); goto cleanup; } if (!wait_for_state(session, "Attached", STATE_WAIT_RETRIES)) { fprintf(stderr, "session did not reach Attached state\n"); goto cleanup; } snprintf(cmd, sizeof(cmd), "./screen -d %s 2>&1", session); ASSERT(run_command(cmd, output, sizeof(output)) == 0); ASSERT(strstr(output, "Cannot find terminfo entry for ''") == NULL); if (!wait_for_state(session, "Detached", STATE_WAIT_RETRIES)) { fprintf(stderr, "session did not reach Detached state\n"); goto cleanup; } retries = EXIT_WAIT_RETRIES; while (retries-- > 0) { if (waitpid(attached_pid, &status, WNOHANG) == attached_pid) break; nanosleep(&delay, NULL); } if (retries < 0) { kill(attached_pid, SIGTERM); fprintf(stderr, "attached client did not exit after remote detach\n"); goto cleanup; } ASSERT(WIFEXITED(status) || WIFSIGNALED(status)); result = 0; cleanup: if (attached_pid > 0 && waitpid(attached_pid, &status, WNOHANG) == 0) { kill(attached_pid, SIGTERM); waitpid(attached_pid, &status, 0); } cleanup_session(session); return result; } screen-5.0.2/tests/.gitignore0000664000175000017500000000002015224432722014570 0ustar alexalex* !.* !*.c !*.h screen-5.0.2/terminfo/0000775000175000017500000000000015224432722013271 5ustar alexalexscreen-5.0.2/terminfo/tetris.c0000664000175000017500000000267415224432722014760 0ustar alexalexlong h[4];t(){h[3]-=h[3]/3000;setitimer(0,h,0);}c,d,l,v[]={(int)t,0,2},w,s,I,K =0,i=276,j,k,q[276],Q[276],*n=q,*m,x=17,f[]={7,-13,-12,1,8,-11,-12,-1,9,-1,1, 12,3,-13,-12,-1,12,-1,11,1,15,-1,13,1,18,-1,1,2,0,-12,-1,11,1,-12,1,13,10,-12, 1,12,11,-12,-1,1,2,-12,-1,12,13,-12,12,13,14,-11,-1,1,4,-13,-12,12,16,-11,-12, 12,17,-13,1,-1,5,-12,12,11,6,-12,12,24};u(){for(i=11;++i<264;)if((k=q[i])-Q[i] ){Q[i]=k;if(i-++I||i%12<1)printf("\033[%d;%dH",(I=i)/12,i%12*2+28);printf( "\033[%dm "+(K-k?0:5),k);K=k;}Q[263]=c=getchar();}G(b){for(i=4;i--;)if(q[i?b+ n[i]:b])return 0;return 1;}g(b){for(i=4;i--;q[i?x+n[i]:x]=b);}main(C,V,a)char* *V,*a;{h[3]=1000000/(l=C>1?atoi(V[1]):2);for(a=C>2?V[2]:"jkl pq";i;i--)*n++=i< 25||i%12<2?7:0;srand(getpid());system("stty cbreak -echo stop u");sigvec(14,v, 0);t();puts("\033[H\033[J");for(n=f+rand()%7*4;;g(7),u(),g(0)){if(c<0){if(G(x+ 12))x+=12;else{g(7);++w;for(j=0;j<252;j=12*(j/12+1))for(;q[++j];)if(j%12==10){ for(;j%12;q[j--]=0);u();for(;--j;q[j+12]=q[j]);u();}n=f+rand()%7*4;G(x=17)||(c =a[5]);}}if(c==*a)G(--x)||++x;if(c==a[1])n=f+4**(m=n),G(x)||(n=m);if(c==a[2])G (++x)||--x;if(c==a[3])for(;G(x+12);++w)x+=12;if(c==a[4]||c==a[5]){s=sigblock( 8192);printf("\033[H\033[J\033[0m%d\n",w);if(c==a[5])break;for(j=264;j--;Q[j]= 0);while(getchar()-a[4]);puts("\033[H\033[J\033[7m");sigsetmask(s);}}d=popen( "stty -cbreak echo stop \023;sort -mnr -o HI - HI;cat HI","w");fprintf(d, "%4d from level %1d by %s\n",w,l,getlogin());pclose(d);} screen-5.0.2/terminfo/test.txt0000664000175000017500000011376315224432722015024 0ustar alexalex <(A)0[?4h[?5l lqqqqqqqqqwwwqqqqqqqqqk sssssssssssssssssssssssssssss xMerry Chrxxxmas * Merx \ / xry Christxxx * Merry x pr rp xChristmasxxxMerry Chrx oqrs srqo xistmas * xxxry Christx ooppqqwqwqqppoo tqqqqqqqqqjxmqqqqqqqqqu x x tqqqqqqqqqq`qqqqqqqqqqu x x tqqqqqqqqqkxlqqqqqqqqqu x x xry Christxxx * Merry x x x xChristmasxxxMerry Chrx x x xistmas * xxxry Christx x x xmas * MerxxxChristmasx srqqj mqqrs mqqqqqqqqqvvvqqqqqqqqqj  rqpo opqr  lmxx lqmqx x lqwmqvx xx x lqwqmqvqx x x x lqwqmqvqx x x x lqwqmqvqx x x x lqwqmqvqx x x x lqwqmqvqx x x x lqwqmqvqx x x x lqwqmqvqx x x x // // //  / / //  / /// //  //// //  //// // /  //// / /  // / // // / // / //s/ //  sssssssssss / / //  // / ss  / //  //  // rrrrrrrrrrr / /s //  // qqqqqqqqq //  //  // srqqqqqqqqqrs   //  /// srrs //  //// // rrqqqqrr /  //// / / ppppppp  // / // rrqqrr // / // / rqppppqr //s/ //  rqpppooooooopppqr / / //  // / qppoooooooooooppq  / //  //  // sssssssooo ooo. o f / /s //  //.f ssss .f //  //  // f ssssrrrrqqqqqrrrrsssss s   //  ///. . . sssrrrrqqqqqqqqqrrrrsssf f . f //  //// / f . rrrqqqqpppppppppqqqqrss. . o f /  //// / /f .f qqqppppooooooooopppqrss .f . s// / // f f sssssssssqppoooo oopqrss.o . // / // /f f. . ssrrrrrrrrrsqpooo opqrssf f f . f //s/ // f o o f . ssssssrrrrssssss   f o o .. . o f s/ //  /  . o o ff .f srrrrrrqqqqqqqqqqqqqqrrssrqf o o .  .f . / //  / mqvqqqqqq lqwqqqqqq x x x x . o f rqqqqqqppppppppppppppq mqvqqqqq lqwqqqqq x x x xf .o . o /s /  mqvqqqq lqwqqqq x x x x f f [14;51 qppppppoooooooooooooo mqvqqq lqwqqq x x x xf  .f f . f s /  mqvqq lqwqq x x x x. o f o o f f poooooo  mqvq lqwq x x x x o o of o o . rrrrrrrrrrrrrrrrrrrrrrrrrrrrr   mqv lqw x x x xo  mq lq x  x  . o o of o o .  .f .  m l x x. o o f o . . . o ff f     f o o f . ff .o . o #3 Cheers! #4 Cheers!   . o o . o f  f f . . . f . o . f o ff  .f f . f  f f f . o f o o f f .  o o of o o .. . o f o o o . o o ff .f  . o o of o o .  .f . . o o f o . . . o ff f f o o f . ff .o . o  . o o . o f  f f . . . f . o . f o ff  .f f . f  f f f . o f o o f f .  o o of o o .. . o f o o o . o o ff .f  . o o of o o .  .f . . o o f o . . . o ff f f o o f . ff .o . o  . o o . o f  f f . . . f . o . f o ff  .f f . f  f f f . o f o o f f .  o o of o o .. . o f o o o . o o ff .f  . o o of o o .  .f . . o o f o . . . o ff f f o o f . ff .o . o  . o o . o f  f f . . . f . o . f o ff  .f f . f  f f f . o f o o f f .  o o of o o .. . o f o o o . o o ff .f  . o o of o o .  .f . . o o f o . . . o ff f f o o f . ff .o . o  . o o . o f  f f . . . f . o . f o ff  .f f . f  f f f . o f o o f f .  o o of o o .. . o f o o o . o o ff .f  . o o of o o .  .f . . o o f o . . . o ff f f o o f . ff .o . o  . o o . o f  f f . . . f . o . f o ff  .f f . f  f f f . o f o o f f .  o o of o o .. . o f o o o . o o ff .f  . o o of o o .  .f . . o o f o . . . o ff f f o o f . ff .o . o  . o o . o f  f f . . . #5 #5 f . o . f o ff  .f f . f  f f f . o f o o f f .  /ooooooooooooooo\  o o of o o .. . o f  / sss sss \ o o o . o o ff .f  x (sOs) (sOs) x  . o o of o o .  .f .  x ` x . o o f o . . . o ff f  \ \sssssssss/ / f o o f . ff .o . o  \ /  . o o . o f  f f . . .  \sssssssssss/ f . o . f o ff  .f f . f  ooppqqrrsss  f f f . o f o o f f .  ooppqqrrsss  o o of o o .. . o f  ooppqqrrsss o o o . o o ff .f  ooppqqrrsss  . o o of o o .  .f .  ooppqqrrsss . o o f o . . . o ff f  ooppqqrrsss f o o f . ff .o . o  ooppqqrrsss . o o . o f  f f . . . M x ` x f . o . f o ff  .f f . f M x (sOs) (sOs) x  f f f . o f o o f f . M / sss sss \  o o of o o .. . o f M /ooooooooooooooo\ o o o . o o ff .f M  . o o of o o .  .f . M . o o f o . . . o ff f M f o o f . ff .o . o M  . o o . o f  f f . . .  \ / f . o . f o ff  .f f . f  \sssssssssss/  f f f . o f o o f f .  ooppqqrrsss  o o of o o .. . o f  ooppqqrrsss o o o . o o ff .f  ooppqqrrsss  . o o of o o .  .f .  ooppqqrrsss . o o f o . . . o ff f  ooppqqrrsssf o o f . ff .o . o M / sss sss \  . o o . o f  f f . . . M /ooooooooooooooo\ f . o . f o ff  .f f . f M  f f f . o f o o f f . M  o o of o o .. . o f  ooppqqrrsss o o o . o o ff .f  ooppqqrrsss  . o o of o o .  .f .  ooppqqrrsss . o o f o . . . o ff f  ooppqqrrsssf o o f . ff .o . o M /ooooooooooooooo\  . o o . o f  f f . . . M f . o . f o ff  .f f . f M  f f f . o f o o f f . M  o o of o o .. . o f  \sssssssssss/ o o o . o o ff .f  ooppqqrrsss  . o o of o o .  .f .  ooppqqrrsss . o o f o . . . o ff f f o o f . ff .o . o Jin  . o o . o f  f f . . . gle f . o . f o ff  .f f . f  f f f . o f o o f f .  o o of o o .. . o f o o o . o o ff .f Bells,  . o o of o o .  .f . . o o f o . . . o ff f f o o f . ff .o . o  . o o . o f  f f . . . f . o . f o ff  .f f . f  f f f . o f o o f f .  o o of o o .. . o f o o o . o o ff .f Jin  . o o of o o .  .f . gle . o o f o . . . o ff f f o o f . ff .o . o  . o o . o f  f f . . . f . o . f o ff  .f f . f Bells,  f f f . o f o o f f .  o o of o o .. . o f o o o . o o ff .f  . o o of o o .  .f . . o o f o . . . o ff f f o o f . ff .o . o  . o o . o f  f f . . . f . o . f o ff  .f f . f Jin  f f f . o f o o f f . gle  o o of o o .. . o f o o o . o o ff .f  . o o of o o .  .f . . o o f o . . . o ff f all f o o f . ff .o . o  . o o . o f  f f . . . f . o . f o ff  .f f . f  f f f . o f o o f f . the  o o of o o .. . o f o o o . o o ff .f  . o o of o o .  .f . . o o f o . . . o ff f way, f o o f . ff .o . o  . o o . o f  f f . . . f . o . f o ff  .f f . f  f f f . o f o o f f .  o o of o o .. . o f o o o . o o ff .f  . o o of o o .  .f . . o o f o . . . o ff f Oh! f o o f . ff .o . o  . o o . o f  f f . . . f . o . f o ff  .f f . f  f f f . o f o o f f . What  o o of o o .. . o f o o o . o o ff .f  . o o of o o .  .f . . o o f o . . . o ff f fun f o o f . ff .o . o  . o o . o f  f f . . . f . o . f o ff  .f f . f  f f f . o f o o f f . it  o o of o o .. . o f is o o o . o o ff .f  . o o of o o .  .f . . o o f o . . . o ff f f o o f . ff .o . o to  . o o . o f  f f . . . f . o . f o ff  .f f . f  f f f . o f o o f f .  o o of o o .. . o f ride, o o o . o o ff .f  . o o of o o .  .f . . o o f o . . . o ff f f o o f . ff .o . o  . o o . o f  f f . . . f . o . f o ff  .f f . f  f f f . o f o o f f .  o o of o o .. . o f On o o o . o o ff .f a  . o o of o o .  .f . . o o f o . . . o ff f f o o f . ff .o . o  . o o . o f  f f . . . one- f . o . f o ff  .f f . f horse  f f f . o f o o f f .  o o of o o .. . o f o o o . o o ff .f  . o o of o o .  .f . . o o f o . . . o ff f f o o f . ff .o . o  . o o . o f  f f . . . f . o . f o ff  .f f . f op  f f f . o f o o f f . en  o o of o o .. . o f o o o . o o ff .f  . o o of o o .  .f . . o o f o . . . o ff f f o o f . ff .o . o  . o o . o f  f f . . . f . o . f o ff  .f f . f  f f f . o f o o f f . sleigh.  o o of o o .. . o f o o o . o o ff .f  . o o of o o .  .f . . o o f o . . . o ff f f o o f . ff .o . o  . o o . o f  f f . . . f . o . f o ff  .f f . f  f f f . o f o o f f .  o o of o o .. . o f o o o . o o ff .f  . o o of o o .  .f . . o o f o . . . o ff f f o o f . ff .o . o  . o o . o f  f f . . . f . o . f o ff  .f f . f  f f f . o f o o f f .  o o of o o .. . o f o o o . o o ff .f  . o o of o o .  .f . . o o f o . . . o ff f f o o f . ff .o . o  . o o . o f  f f . . . f . o . f o ff  .f f . f  f f f . o f o o f f .  o o of o o .. . o f o o o . o o ff f  f f f . o f o o f f .  o o of o o .. . o f o o o . o o ff .f  . o o of o o .  .f . . o o f o . . . o ff f f o o f . ff .o . o  . o o . o f  f f . . . f . o . f o ff  .f f . f  f f f . o f o o f f .  o o of o o .. . o f o o o . o o ff .f  . o o of o o .  .f . . o o f o . . . o ff f f o o f . ff .o . o  . o o . o f  f f . . . f . o . f o ff  .f f . f  f f f . o f o o f f .  o o of o o .. . o f o o o . o o ff .f  . o o of o o .  .f . . o o f o . . . o ff f f o o f . ff .o . o  . o o . o f  f f . . . f . o . f o ff  .f f . f  f f f . o f o o f f .  o o of o o .. . o f o o o . o o ff .f  . o o of o o .  .f . . o o f o . . . o ff f f o o f . ff .o . o  . o o . o f  f f . . . f . o . f o ff  .f f . f  f f f . o f o o f f .  o o of o o .. . o f o o o . o o ff .f  . o o of o o .  .f . . o o f o . . . o ff f f o o f . ff .o . o  . o o . o f  f f . . . f . o . f o ff  .f f . f  f f f . o f o o f f .  o o of o o .. . o f o o o . o o ff f  o o of o o  . o o o   f o o     o o o . o o ff f  f f f . o f o o f f .  o o of o o .. . o f o o o . o o ff .f  . o o of o o .  .f . . o o f o . . . o ff f f o o f . ff .o . o  . o o . o f  f f . . . f . o . f o ff  .f f . f  f f f . o f o o f f .  o o of o o .. . o f o o o . o o ff .f  . o o of o o .  .f . . o o f o . . . o ff f f o o f . ff .o . o  . o o . o f  f f . . . f . o . f o ff  .f f . f  f f f . o f o o f f .  o o of o o .. . o f o o o . o o ff .f  . o o of o o .  .f . . o o f o . . . o ff f f o o f . ff .o . o  . o o . o f  f f . . . f . o . f o ff  .f f . f  f f f . o f o o f f .  o o of o o .. . o f o o o . o o ff .f  . o o of o o .  .f . . o o f o . . . o ff f f o o f . ff .o . o  . o o . o f  f f . . . f . o . f o ff  .f f . f  f f f . o f o o f f .  o o of o o .. . o f o o o . o o ff .f  . o o of o o .  .f . . o o f o . . . o ff f f o o f . ff .o . o  . o o . o f  f f . . . f . o . f o ff  .f f . f  f f f . o f o o f f .  o o of o o .. . o f o o o . o o ff f  o o of o o  . o o o   f o o     Merry Christmas  -  o o o . o o ff .f  . o o of o o .  .f . . o o f o . . . o ff f f o o f . ff .o . o  . o o . o f  f f . . . f . o . f o ff  .f f . f  f f f . o f o o f f .  o o of o o .. . o f o o o . o o ff .f  . o o of o o .  .f . . o o f o . . . o ff f f o o f . ff .o . o  . o o . o f  f f . . . f . o . f o ff  .f f . f  f f f . o f o o f f .  o o of o o .. . o f o o o . o o ff f  o o of o o  . o o o   f o o     o o o . o o ff f  f f f . o f o o f f .  o o of o o .. . o f o o o . o o ff .f  . o o of o o .  .f . . o o f o . . . o ff f f o o f . ff .o . o  . o o . o f  f f . . . f . o . f o ff  .f f . f  f f f . o f o o f f .  o o of o o .. . o f o o o . o o ff .f  . o o of o o .  .f . . o o f o . . . o ff f f o o f . ff .o . o  . o o . o f  f f . . . f . o . f o ff  .f f . f  f f f . o f o o f f .  o o of o o .. . o f o o o . o o ff .f  . o o of o o .  .f . . o o f o . . . o ff f f o o f . ff .o . o  . o o . o f  f f . . . f . o . f o ff  .f f . f  f f f . o f o o f f .  o o of o o .. . o f o o o . o o ff .f  . o o of o o .  .f . . o o f o . . . o ff f f o o f . ff .o . o  . o o . o f  f f . . . f . o . f o ff  .f f . f  f f f . o f o o f f .  o o of o o .. . o f o o o . o o ff .f  . o o of o o .  .f . . o o f o . . . o ff f f o o f . ff .o . o  . o o . o f  f f . . . f . o . f o ff  .f f . f  f f f . o f o o f f .  o o of o o .. . o f o o o . o o ff f  o o of o o  . o o o   f o o     [?4l screen-5.0.2/terminfo/screeninfo.src0000664000175000017500000000772415224432722016147 0ustar alexalexscreen|VT 100/ANSI X3.64 virtual terminal, am, km, mir, msgr, xenl, cols#80, it#8, lines#24, colors#8, pairs#64, bel=^G, blink=\E[5m, bold=\E[1m, cbt=\E[Z, clear=\E[H\E[J, cr=\r, csr=\E[%i%p1%d;%p2%dr, cub=\E[%p1%dD, cub1=\b, cud=\E[%p1%dB, cud1=\n, cuf=\E[%p1%dC, cuf1=\E[C, cup=\E[%i%p1%d;%p2%dH, cuu=\E[%p1%dA, cuu1=\EM, dch=\E[%p1%dP, dch1=\E[P, ech=\E[%p1%dX, dl=\E[%p1%dM, dl1=\E[M, ed=\E[J, el=\E[K, el1=\E[1K, enacs=\E(B\E)0, home=\E[H, ht=\t, hts=\EH, ich=\E[%p1%d@, il=\E[%p1%dL, il1=\E[L, ind=\n, is2=\E)0, kcub1=\EOD, kcud1=\EOB, kcuf1=\EOC, kcuu1=\EOA, kdch1=\E[3~, kf1=\EOP, kf10=\E[21~, kf11=\E[23~, kf12=\E[24~, kf2=\EOQ, kf3=\EOR, kf4=\EOS, kf5=\E[15~, kf6=\E[17~, kf7=\E[18~, kf8=\E[19~, kf9=\E[20~, khome=\E[1~, kend=\E[4~, kich1=\E[2~, knp=\E[6~, kpp=\E[5~, nel=\EE, rc=\E8, rev=\E[7m, ri=\EM, rmcup=\E[?1049l, rmir=\E[4l, rmkx=\E[?1l\E>, rmso=\E[23m, rmul=\E[24m, rs2=\Ec, sc=\E7, sgr0=\E[m, smcup=\E[?1049h, smir=\E[4h, smkx=\E[?1h\E=, smso=\E[3m, smul=\E[4m, tbc=\E[3g, smacs=^N, rmacs=^O, flash=\Eg, civis=\E[?25l, cnorm=\E[34h\E[?25h, cvvis=\E[34l, op=\E[39;49m, setab=\E[4%p1%dm, setaf=\E[3%p1%dm, acsc=``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~..--++\054\054hhII00, screen-bce|VT 100/ANSI X3.64 virtual terminal with bce, am, bce, km, mir, msgr, xenl, cols#80, it#8, lines#24, colors#8, pairs#64, bel=^G, blink=\E[5m, bold=\E[1m, cbt=\E[Z, clear=\E[H\E[J, cr=\r, csr=\E[%i%p1%d;%p2%dr, cub=\E[%p1%dD, cub1=\b, cud=\E[%p1%dB, cud1=\n, cuf=\E[%p1%dC, cuf1=\E[C, cup=\E[%i%p1%d;%p2%dH, cuu=\E[%p1%dA, cuu1=\EM, dch=\E[%p1%dP, dch1=\E[P, ech=\E[%p1%dX, dl=\E[%p1%dM, dl1=\E[M, ed=\E[J, el=\E[K, el1=\E[1K, enacs=\E(B\E)0, home=\E[H, ht=\t, hts=\EH, ich=\E[%p1%d@, il=\E[%p1%dL, il1=\E[L, ind=\n, is2=\E)0, kcub1=\EOD, kcud1=\EOB, kcuf1=\EOC, kcuu1=\EOA, kdch1=\E[3~, kf1=\EOP, kf10=\E[21~, kf11=\E[23~, kf12=\E[24~, kf2=\EOQ, kf3=\EOR, kf4=\EOS, kf5=\E[15~, kf6=\E[17~, kf7=\E[18~, kf8=\E[19~, kf9=\E[20~, khome=\E[1~, kend=\E[4~, kich1=\E[2~, knp=\E[6~, kpp=\E[5~, nel=\EE, rc=\E8, rev=\E[7m, ri=\EM, rmcup=\E[?1049l, rmir=\E[4l, rmkx=\E[?1l\E>, rmso=\E[23m, rmul=\E[24m, rs2=\Ec, sc=\E7, sgr0=\E[m, smcup=\E[?1049h, smir=\E[4h, smkx=\E[?1h\E=, smso=\E[3m, smul=\E[4m, tbc=\E[3g, smacs=^N, rmacs=^O, flash=\Eg, civis=\E[?25l, cnorm=\E[34h\E[?25h, cvvis=\E[34l, op=\E[39;49m, setab=\E[4%p1%dm, setaf=\E[3%p1%dm, acsc=``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~..--++\054\054hhII00, screen-s|VT 100/ANSI X3.64 virtual terminal with hardstatus line, am, bce, hs, km, mir, msgr, xenl, cols#80, it#8, lines#24, colors#8, pairs#64, bel=^G, blink=\E[5m, bold=\E[1m, cbt=\E[Z, clear=\E[H\E[J, cr=\r, csr=\E[%i%p1%d;%p2%dr, cub=\E[%p1%dD, cub1=\b, cud=\E[%p1%dB, cud1=\n, cuf=\E[%p1%dC, cuf1=\E[C, cup=\E[%i%p1%d;%p2%dH, cuu=\E[%p1%dA, cuu1=\EM, dch=\E[%p1%dP, dch1=\E[P, ech=\E[%p1%dX, dl=\E[%p1%dM, dl1=\E[M, ed=\E[J, el=\E[K, el1=\E[1K, enacs=\E(B\E)0, home=\E[H, ht=\t, hts=\EH, ich=\E[%p1%d@, il=\E[%p1%dL, il1=\E[L, ind=\n, is2=\E)0, kcub1=\EOD, kcud1=\EOB, kcuf1=\EOC, kcuu1=\EOA, kdch1=\E[3~, kf1=\EOP, kf10=\E[21~, kf11=\E[23~, kf12=\E[24~, kf2=\EOQ, kf3=\EOR, kf4=\EOS, kf5=\E[15~, kf6=\E[17~, kf7=\E[18~, kf8=\E[19~, kf9=\E[20~, khome=\E[1~, kend=\E[4~, kich1=\E[2~, knp=\E[6~, kpp=\E[5~, nel=\EE, rc=\E8, rev=\E[7m, ri=\EM, rmcup=\E[?1049l, rmir=\E[4l, rmkx=\E[?1l\E>, rmso=\E[23m, rmul=\E[24m, rs2=\Ec, sc=\E7, sgr0=\E[m, smcup=\E[?1049h, smir=\E[4h, smkx=\E[?1h\E=, smso=\E[3m, smul=\E[4m, tbc=\E[3g, smacs=^N, rmacs=^O, flash=\Eg, tsl=\E_, fsl=\E\\, dsl=\E_\E\\, civis=\E[?25l, cnorm=\E[34h\E[?25h, cvvis=\E[34l, op=\E[39;49m, setab=\E[4%p1%dm, setaf=\E[3%p1%dm, acsc=``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~..--++\054\054hhII00, screen-256color|VT 100/ANSI X3.64 virtual terminal, ccc, colors#256, pairs#32767, initc=\E]4;%p1%d;rgb\:%p2%{255}%*%{1000}%/%2.2X/%p3%{255}%*%{1000}%/%2.2X/%p4%{255}%*%{1000}%/%2.2X\E\\, setab=\E[48;5;%p1%dm, setaf=\E[38;5;%p1%dm, setb=\E[48;5;%p1%dm, setf=\E[38;5;%p1%dm, use=screen, screen-5.0.2/terminfo/screencap0000664000175000017500000000222315224432722015156 0ustar alexalexSC|screen|VT 100/ANSI X3.64 virtual terminal:\ :am:xn:ms:mi:G0:km:\ :DO=\E[%dB:LE=\E[%dD:RI=\E[%dC:UP=\E[%dA:bs:bt=\E[Z:\ :cb=\E[1K:cd=\E[J:ce=\E[K:cl=\E[H\E[J:cm=\E[%i%d;%dH:ct=\E[3g:\ :do=^J:nd=\E[C:pt:rc=\E8:rs=\Ec:sc=\E7:st=\EH:up=\EM:\ :le=^H:bl=^G:cr=^M:it#8:ho=\E[H:nw=\EE:ta=^I:is=\E)0:\ :li#24:co#80:us=\E[4m:ue=\E[24m:so=\E[3m:se=\E[23m:\ :mb=\E[5m:md=\E[1m:mr=\E[7m:me=\E[m:sr=\EM:al=\E[L:\ :AL=\E[%dL:dl=\E[M:DL=\E[%dM:cs=\E[%i%d;%dr:dc=\E[P:\ :DC=\E[%dP:im=\E[4h:ei=\E[4l:IC=\E[%d@:\ :ks=\E[?1h\E=:ke=\E[?1l\E>:vb=\Eg:\ :ku=\EOA:kd=\EOB:kr=\EOC:kl=\EOD:\ :k1=\EOP:k2=\EOQ:k3=\EOR:k4=\EOS:k5=\E[15~:k6=\E[17~:\ :k7=\E[18~:k8=\E[19~:k9=\E[20~:k;=\E[21~:F1=\E[23~:F2=\E[24~:\ :kh=\E[1~:kI=\E[2~:kD=\E[3~:kH=\E[4~:@7=\E[4~:kP=\E[5~:\ :kN=\E[6~:eA=\E(B\E)0:as=^N:ae=^O:ti=\E[?1049h:te=\E[?1049l:\ :vi=\E[?25l:ve=\E[34h\E[?25h:vs=\E[34l:\ :Co#8:pa#64:AF=\E[3%dm:AB=\E[4%dm:op=\E[39;49m:AX:\ :ac=``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~..--++,,hhII00: SB|screen-bce|VT 100/ANSI X3.64 virtual terminal with bce:\ :ut:tc=screen: SH|screen-s|VT 100/ANSI X3.64 virtual terminal with hardstatus line:\ :ts=\E_:fs=\E\\:ds=\E_\E\\:tc=screen: screen-5.0.2/terminfo/checktc.c0000664000175000017500000001055215224432722015044 0ustar alexalex#include char *CL, *CM, *CS, *SR; int CO, LI, AM, XN; char *tgetstr(), *getenv(); void PutStr(), CPutStr(), CCPutStr(), GotoPos(), RETURN(); main() { char *term, *s; char tcbuf[1024]; char tcstr[1024], *tp; if ((term = getenv("TERM")) == 0) { fprintf(stderr, "No $TERM set\n"); exit(1); } switch (tgetent(tcbuf, term)) { case -1: fprintf(stderr, "Could not open termcap file\n"); exit(1); case 0: fprintf(stderr, "I don't know what a '%s' terminal is.\n", term); exit(1); } tp = tcstr; if ((CL = tgetstr("cl", &tp)) == 0) { fprintf(stderr, "cl capability required\n"); exit(1); } if ((CM = tgetstr("cm", &tp)) == 0) { fprintf(stderr, "cm capability required\n"); exit(1); } if ((s = getenv("COLUMNS"))) CO = atoi(s); if ((s = getenv("LINES"))) LI = atoi(s); if (CO == 0) CO = tgetnum("co"); if (LI == 0) LI = tgetnum("li"); if (CO == 0) CO = 80; if (LI == 0) LI = 24; GotoPos(5, 1); printf("******* cl capability does not work !!! *******"); GotoPos(5, 2); PutStr(CL); printf("******* cl capability does not home cursor *******"); GotoPos(0, 0); printf(" "); GotoPos(5, 4); printf("******* cm capability does not work !!! *******"); GotoPos(5, 4); printf(" "); GotoPos(CO/2-12, LI/2); printf("Your terminal size is"); GotoPos(CO/2-3, LI/2+1); printf("%dx%d", CO, LI); GotoPos(CO/2-2, 0); printf("top"); GotoPos(CO/2-3, LI-1); printf("bottom"); GotoPos(0, LI/2-2);printf("l"); GotoPos(0, LI/2-1);printf("e"); GotoPos(0, LI/2+0);printf("f"); GotoPos(0, LI/2+1);printf("t"); GotoPos(CO-1, LI/2-2);printf("r"); GotoPos(CO-1, LI/2-1);printf("i"); GotoPos(CO-1, LI/2+0);printf("g"); GotoPos(CO-1, LI/2+1);printf("h"); GotoPos(CO-1, LI/2+2);printf("t"); GotoPos(CO/2-15, LI/2+3); RETURN(); AM = tgetflag("am"); printf("Termcap: terminal does %sauto-wrap", AM ? "" : "not "); GotoPos(0, 5); if (AM) { printf(" am capability set, but terminal does not wrap"); GotoPos(CO-1, 3); } else { printf(" am capability not set, but terminal does wrap"); GotoPos(CO-1, 4); } printf(" \n "); GotoPos(0, 10); RETURN(); if (AM) { XN = tgetflag("xn"); printf("Termcap: terminal has %smagic margins", XN ? "" : "no "); GotoPos(0, 5); if ((XN = tgetflag("xn"))) { printf(" xn capability set, but terminal has no magic-margins"); GotoPos(CO-1, 4); } else { printf(" xn capability not set, but terminal has magic-margins"); GotoPos(CO-1, 3); } printf(" \n"); printf(" "); GotoPos(0, 10); RETURN(); if (XN) { GotoPos(0, 6); printf(" last col in last row is not usable"); GotoPos(CO-1, LI-1); printf(" "); GotoPos(0, 6); printf(" "); GotoPos(0, 0); printf("testing magic margins in last row"); GotoPos(0, 10); RETURN(); } } if ((CS = tgetstr("cs", &tp))) { printf("Termcap: terminal has scrollregions"); GotoPos(0, 5); printf(" cs capability set, but doesn't work"); CCPutStr(CS, 4, 5); GotoPos(0, 5); printf("\n\n"); CCPutStr(CS, 0, LI-1); GotoPos(0, 10); RETURN(); } if ((SR = tgetstr("sr", &tp))) { GotoPos(0, 5); printf(" sr capability set, but doesn't work"); GotoPos(0, 0); PutStr(SR); GotoPos(0, 6); printf(" "); GotoPos(0, 0); printf("Termcap: terminal can scroll backwards"); GotoPos(0, 10); RETURN(); } } void putcha(c) char c; { putchar(c); } void PutStr(s) char *s; { tputs(s, 1, putcha); fflush(stdout); } void CPutStr(s, c) char *s; int c; { tputs(tgoto(s, 0, c), 1, putcha); fflush(stdout); } void CCPutStr(s, x, y) char *s; int x, y; { tputs(tgoto(s, y, x), 1, putcha); fflush(stdout); } void GotoPos(x,y) int x,y; { tputs(tgoto(CM, x, y), 1, putcha); fflush(stdout); } void RETURN() { printf("Press to continue"); fflush(stdout); while(getchar() != '\n'); PutStr(CL); } screen-5.0.2/terminfo/README0000664000175000017500000000110215224432722014143 0ustar alexalex This directory contains various file for termcap/terminfo installation and testing: screencap Termcap entry for screen. Add it to /etc/termcap. On NetBSD, you should run /usr/bin/cap_mkdb afterwards. screeninfo.src Terminfo entry. Use 'tic screeninfo.src' to install (Sun: /usr/5bin/tic). checktc.c Termcap/info test program. Checks margin handling and other things. 8bits Some chars from the ISO 8859-1 charset. test.txt Test file for alternate charset. tetris.c The popular game, by John Tromp. This is one of the winners of the 1989 IOCCC contest. screen-5.0.2/terminfo/8bits0000664000175000017500000000132015224432722014241 0ustar alexalex We test some umlauts and other characters coded in the ISO 8859-1 (Latin 1) standard: umlaut A Ä umlaut a ä umlaut O Ö umlaut o ö umlaut U Ü umlaut u ü sharp s ß paragraph § e + / é e + \ è e + ^ ê a + \ à u + \ ù degree ° log. not ¬ + over - ± << « >> » fraction 1/2 ½ fraction 1/4 ¼ power of 2 ² middle dot · --- screen-5.0.2/termcap.h0000664000175000017500000000070415224432722013253 0ustar alexalex#ifndef SCREEN_TERMCAP_H #define SCREEN_TERMCAP_H #include int InitTermcap (int, int); char *MakeTermcap (bool); char *gettermcapstring (char *); int remap (int, int); void CheckEscape (void); int CreateTransTable (char *); void FreeTransTable (void); /* global variables */ extern char screenterm[]; extern char Term[]; extern char Termcap[]; extern char *extra_incap; extern char *extra_outcap; #endif /* SCREEN_TERMCAP_H */ screen-5.0.2/termcap.c0000664000175000017500000006410015224432722013246 0ustar alexalex/* Copyright (c) 2008, 2009 * Juergen Weigert (jnweiger@immd4.informatik.uni-erlangen.de) * Michael Schroeder (mlschroe@immd4.informatik.uni-erlangen.de) * Micah Cowan (micah@cowan.name) * Sadrul Habib Chowdhury (sadrul@users.sourceforge.net) * Copyright (c) 1993-2002, 2003, 2005, 2006, 2007 * Juergen Weigert (jnweiger@immd4.informatik.uni-erlangen.de) * Michael Schroeder (mlschroe@immd4.informatik.uni-erlangen.de) * Copyright (c) 1987 Oliver Laumann * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3, or (at your option) * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program (see the file COPYING); if not, see * https://www.gnu.org/licenses/, or contact Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02111-1301 USA * **************************************************************** */ #include "config.h" #include "termcap.h" #include #include /* to get index() declaration on Solaris */ #if defined(_sun_) # include #endif #include "screen.h" #include "encoding.h" #include "kmapdef.h" #include "misc.h" #include "process.h" #include "resize.h" static void AddCap(char *); static void MakeString(char *, char *, int, char *); static char *findcap(char *, char **, int); static int copyarg(char **, char *); static int e_tgetent(char *, char *); static char *e_tgetstr(char *, char **); static int e_tgetflag(char *); static int e_tgetnum(char *); static int findseq_ge(char *, int, unsigned char **); static void setseqoff(unsigned char *, int, int); static int addmapseq(char *, int, int); static int remmapseq(char *, int); char Termcap[TERMCAP_BUFSIZE + 8]; /* new termcap +8:"TERMCAP=" */ static int Termcaplen; static int tcLineLen; char Term[MAXSTR + 5]; /* +5: "TERM=" */ char screenterm[MAXTERMLEN + 1]; /* new $TERM, usually "screen" */ char *extra_incap, *extra_outcap; static const char TermcapConst[] = "DO=\\E[%dB:LE=\\E[%dD:RI=\\E[%dC:\ UP=\\E[%dA:bs:bt=\\E[Z:cd=\\E[J:ce=\\E[K:cl=\\E[H\\E[J:cm=\\E[%i%d;%dH:\ ct=\\E[3g:do=^J:nd=\\E[C:pt:rc=\\E8:rs=\\Ec:sc=\\E7:st=\\EH:up=\\EM:\ le=^H:bl=^G:cr=^M:it#8:ho=\\E[H:nw=\\EE:ta=^I:is=\\E)0:"; char *gettermcapstring(char *s) { int i; if (display == NULL || s == NULL) return NULL; for (i = 0; i < T_N; i++) { if (term[i].type != T_STR) continue; if (strcmp(term[i].tcname, s) == 0) return D_tcs[i].str; } return NULL; } /* * Compile the terminal capabilities for a display. * Input: tgetent(, D_termname) extra_incap, extra_outcap. * Effect: display initialisation. */ int InitTermcap(int width, int height) { char *s; int i; char tbuf[TERMCAP_BUFSIZE], *tp; int t, xue, xse, xme; memset(tbuf, 0, ARRAY_SIZE(tbuf)); if (*D_termname == 0 || e_tgetent(tbuf, D_termname) != 1) { Msg(0, "Cannot find terminfo entry for '%s'.", D_termname); return -1; } if ((D_tentry = malloc(TERMCAP_BUFSIZE + (extra_incap ? strlen(extra_incap) + 1 : 0))) == NULL) { Msg(0, "%s", strnomem); return -1; } /* * loop through all needed capabilities, record their values in the display */ tp = D_tentry; for (i = 0; i < T_N; i++) { switch (term[i].type) { case T_FLG: D_tcs[i].flg = e_tgetflag(term[i].tcname); break; case T_NUM: D_tcs[i].num = e_tgetnum(term[i].tcname); break; case T_STR: D_tcs[i].str = e_tgetstr(term[i].tcname, &tp); /* no empty strings, please */ if (D_tcs[i].str && *D_tcs[i].str == 0) D_tcs[i].str = NULL; break; default: Panic(0, "Illegal tc type in entry #%d", i); /*NOTREACHED*/} } /* * Now a good deal of sanity checks on the retrieved capabilities. */ if (D_HC) { Msg(0, "You can't run screen on a hardcopy terminal."); return -1; } if (D_OS) { Msg(0, "You can't run screen on a terminal that overstrikes."); return -1; } if (!D_CL) { Msg(0, "Clear screen capability required."); return -1; } if (!D_CM) { Msg(0, "Addressable cursor capability required."); return -1; } if ((s = getenv("COLUMNS")) && (i = atoi(s)) > 0) D_CO = i; if ((s = getenv("LINES")) && (i = atoi(s)) > 0) D_LI = i; if (width) D_CO = width; if (height) D_LI = height; if (D_CO <= 0) D_CO = 80; if (D_LI <= 0) D_LI = 24; if (D_CTF) { /* standard fixes for xterms etc */ /* assume color for everything that looks ansi-compatible */ if (!D_CAF && D_ME && (strstr(D_ME, "\033[m") || strstr(D_ME, "\033[0m"))) { D_CAF = "\033[3%p1%dm"; D_CAB = "\033[4%p1%dm"; } if (D_OP && strstr(D_OP, "\033[39;49m")) D_CAX = 1; if (D_OP && (strstr(D_OP, "\033[m") || strstr(D_OP, "\033[0m"))) D_OP = NULL; /* ISO2022 */ if ((D_EA && strstr(D_EA, "\033(B")) || (D_AS && strstr(D_AS, "\033(0"))) D_CG0 = 1; if (strstr(D_termname, "xterm") || strstr(D_termname, "rxvt") || (D_CKM && (strstr(D_CKM, "\033[M") || strstr(D_CKM, "\033[<")))) { D_CXT = 1; kmapdef[0] = D_CKM ? SaveStr(D_CKM) : NULL; } /* "be" seems to be standard for xterms... */ if (D_CXT) D_BE = 1; } if (nwin_options.flowflag == nwin_undef.flowflag) nwin_default.flowflag = D_CNF ? FLOW_OFF : D_NX ? FLOW_ON : FLOW_AUTOFLAG; D_CLP |= (!D_AM || D_XV || D_XN); if (!D_BL) D_BL = "\007"; if (!D_BC) { if (D_BS) D_BC = "\b"; else D_BC = D_LE; } if (!D_CR) D_CR = "\r"; if (!D_NL) D_NL = "\n"; /* * Set up attribute handling. * This is rather complicated because termcap has different * attribute groups. */ if (D_UG > 0) D_US = D_UE = NULL; if (D_SG > 0) D_SO = D_SE = NULL; /* Unfortunately there is no 'mg' capability. * For now we think that mg > 0 if sg and ug > 0. */ if (D_UG > 0 && D_SG > 0) D_MH = D_MD = D_MR = D_MB = D_ME = NULL; xue = ATYP_U; xse = ATYP_S; xme = ATYP_M; if (D_SO && D_SE == NULL) { Msg(0, "Warning: 'so' but no 'se' capability."); if (D_ME) xse = xme; else D_SO = NULL; } if (D_US && D_UE == NULL) { Msg(0, "Warning: 'us' but no 'ue' capability."); if (D_ME) xue = xme; else D_US = NULL; } if ((D_MH || D_MD || D_MR || D_MB) && D_ME == NULL) { Msg(0, "Warning: 'm?' but no 'me' capability."); D_MH = D_MD = D_MR = D_MB = NULL; } /* * Does ME also reverse the effect of SO and/or US? This is not * clearly specified by the termcap manual. Anyway, we should at * least look whether ME and SE/UE are equal: */ if (D_UE && D_SE && strcmp(D_SE, D_UE) == 0) xse = xue; if (D_SE && D_ME && strcmp(D_ME, D_SE) == 0) xse = xme; if (D_UE && D_ME && strcmp(D_ME, D_UE) == 0) xue = xme; for (i = 0; i < NATTR; i++) { D_attrtab[i] = D_tcs[T_ATTR + i].str; D_attrtyp[i] = i == ATTR_SO ? xse : (i == ATTR_US ? xue : xme); } /* Set up missing entries (attributes are priority ordered) */ s = NULL; t = 0; for (i = 0; i < NATTR; i++) if ((s = D_attrtab[i])) { t = D_attrtyp[i]; break; } for (i = 0; i < NATTR; i++) { if (D_attrtab[i] == NULL) { D_attrtab[i] = s; D_attrtyp[i] = t; } else { s = D_attrtab[i]; t = D_attrtyp[i]; } } if (D_CAF || D_CAB || D_CSF || D_CSB) D_hascolor = 1; if (D_UT) D_BE = 1; /* screen erased with background color */ if (!D_DO) D_DO = D_NL; if (!D_SF) D_SF = D_NL; if (D_IN) D_IC = D_IM = NULL; if (D_EI == NULL) D_IM = NULL; /* some strange termcap entries have IC == IM */ if (D_IC && D_IM && strcmp(D_IC, D_IM) == 0) D_IC = NULL; if (D_KE == NULL) D_KS = NULL; if (D_CVN == NULL) D_CVR = NULL; if (D_VE == NULL) D_VI = D_VS = NULL; if (D_CCE == NULL) D_CCS = NULL; if (D_CG0) { if (D_CS0 == NULL) D_CS0 = "\033(%p1%c"; if (D_CE0 == NULL) D_CE0 = "\033(B"; D_AC = NULL; D_EA = NULL; } else if (D_AC || (D_AS && D_AE)) { /* some kind of graphics */ D_CS0 = (D_AS && D_AE) ? D_AS : ""; D_CE0 = (D_AS && D_AE) ? D_AE : ""; D_CC0 = D_AC; } else { D_CS0 = D_CE0 = ""; D_CC0 = NULL; D_AC = ""; /* enable default string */ } for (i = 0; i < 256; i++) D_c0_tab[i] = i; if (D_AC) { /* init with default string first */ s = "l+m+k+j+u+t+v+w+q-x|n+o~s_p\"r#`+a:f'g#~o.v-^+<,>h#I#0#y"; for (i = (strlen(s) - 2) & ~1; i >= 0; i -= 2) D_c0_tab[(int)(unsigned char)s[i]] = s[i + 1]; } if (D_CC0) for (i = (strlen(D_CC0) - 2) & ~1; i >= 0; i -= 2) D_c0_tab[(int)(unsigned char)D_CC0[i]] = D_CC0[i + 1]; if (D_PF == NULL) D_PO = NULL; if (D_CXC) if (CreateTransTable(D_CXC)) return -1; /* Termcap fields Z0 & Z1 contain width-changing sequences. */ if (D_CZ1 == NULL) D_CZ0 = NULL; CheckScreenSize(0); if (D_TS == NULL || D_FS == NULL || D_DS == NULL) D_HS = 0; if (D_HS) { if (D_WS < 0) D_WS = 0; } D_has_hstatus = hardstatusemu & ~HSTATUS_ALWAYS; if (D_HS && !(hardstatusemu & HSTATUS_ALWAYS)) D_has_hstatus = HSTATUS_HS; if (D_CKJ) { int enc = FindEncoding(D_CKJ); if (enc != -1) D_encoding = enc; } if (!D_tcs[T_NAVIGATE].str && D_tcs[T_NAVIGATE + 1].str) D_tcs[T_NAVIGATE].str = D_tcs[T_NAVIGATE + 1].str; /* kh = @1 */ if (!D_tcs[T_NAVIGATE + 2].str && D_tcs[T_NAVIGATE + 3].str) D_tcs[T_NAVIGATE + 2].str = D_tcs[T_NAVIGATE + 3].str; /* kH = @7 */ D_UPcost = CalcCost(D_UP); D_DOcost = CalcCost(D_DO); D_NLcost = CalcCost(D_NL); D_LEcost = CalcCost(D_BC); D_NDcost = CalcCost(D_ND); D_CRcost = CalcCost(D_CR); D_IMcost = CalcCost(D_IM); D_EIcost = CalcCost(D_EI); if (D_CAN) { D_auto_nuke = true; } if (D_COL > 0) { D_obufmax = D_COL; D_obuflenmax = D_obuflen - D_obufmax; } /* Some xterm entries set F0 and F10 to the same string. Nuke F0. */ if (D_tcs[T_CAPS].str && D_tcs[T_CAPS + 10].str && !strcmp(D_tcs[T_CAPS].str, D_tcs[T_CAPS + 10].str)) D_tcs[T_CAPS].str = NULL; /* Some xterm entries set kD to ^?. Nuke it. */ if (D_tcs[T_NAVIGATE_DELETE].str && !strcmp(D_tcs[T_NAVIGATE_DELETE].str, "\0177")) D_tcs[T_NAVIGATE_DELETE].str = NULL; /* wyse52 entries have kcub1 == kb == ^H. Nuke... */ if (D_tcs[T_CURSOR + 3].str && !strcmp(D_tcs[T_CURSOR + 3].str, "\008")) D_tcs[T_CURSOR + 3].str = NULL; D_nseqs = 0; for (i = 0; i < T_OCAPS - T_CAPS; i++) remap(i, 1); for (i = 0; i < kmap_extn; i++) remap(i + (KMAP_KEYS + KMAP_AKEYS), 1); D_seqp = D_kmaps + 3; D_seql = 0; D_seqh = NULL; D_tcinited = 1; MakeTermcap(0); /* Make sure libterm uses external term properties for our tputs() calls. */ e_tgetent(tbuf, D_termname); CheckEscape(); return 0; } int remap(int n, int map) { char *s = NULL; int fl = 0, domap = 0; struct action *a1, *a2, *tab; int l = 0; struct kmap_ext *kme = NULL; a1 = NULL; if (n >= KMAP_KEYS + KMAP_AKEYS) { kme = kmap_exts + (n - (KMAP_KEYS + KMAP_AKEYS)); s = kme->str; l = kme->fl & ~KMAP_NOTIMEOUT; fl = kme->fl & KMAP_NOTIMEOUT; a1 = &kme->um; } tab = umtab; for (;;) { a2 = NULL; if (n < KMAP_KEYS + KMAP_AKEYS) { a1 = &tab[n]; if (n >= KMAP_KEYS) n -= T_OCAPS - T_CURSOR; s = D_tcs[n + T_CAPS].str; l = s ? strlen(s) : 0; if (n >= T_CURSOR - T_CAPS) a2 = &tab[n + (T_OCAPS - T_CURSOR)]; } if (s == NULL || l == 0) return 0; if (a1 && a1->nr == RC_ILLEGAL) a1 = NULL; if (a2 && a2->nr == RC_ILLEGAL) a2 = NULL; if (a1 && a1->nr == RC_STUFF && a1->args[0] && strcmp(a1->args[0], s) == 0) a1 = NULL; if (a2 && a2->nr == RC_STUFF && a2->args[0] && strcmp(a2->args[0], s) == 0) a2 = NULL; domap |= (a1 || a2); if (tab == umtab) { tab = dmtab; a1 = kme ? &kme->dm : NULL; } else if (tab == dmtab) { tab = mmtab; a1 = kme ? &kme->mm : NULL; } else break; } if (n < KMAP_KEYS) domap = 1; if (map == 0 && domap) return 0; if (map && !domap) return 0; if (map) return addmapseq(s, l, n | fl); else return remmapseq(s, l); } void CheckEscape(void) { Display *odisplay; int i, nr; if (DefaultEsc >= 0) return; odisplay = display; for (display = displays; display; display = display->d_next) { for (i = 0; i < D_nseqs; i += D_kmaps[i + 2] * 2 + 4) { nr = (D_kmaps[i] << 8 | D_kmaps[i + 1]) & ~KMAP_NOTIMEOUT; if (nr < KMAP_KEYS + KMAP_AKEYS) { if (umtab[nr].nr == RC_COMMAND) break; if (umtab[nr].nr == RC_ILLEGAL && dmtab[nr].nr == RC_COMMAND) break; } else { struct kmap_ext *kme = kmap_exts + nr - (KMAP_KEYS + KMAP_AKEYS); if (kme->um.nr == RC_COMMAND) break; if (kme->um.nr == RC_ILLEGAL && kme->dm.nr == RC_COMMAND) break; } } } if (display == NULL) { display = odisplay; return; } SetEscape(NULL, Ctrl('a'), 'a'); if (odisplay->d_user->u_Esc == -1) odisplay->d_user->u_Esc = DefaultEsc; if (odisplay->d_user->u_MetaEsc == -1) odisplay->d_user->u_MetaEsc = DefaultMetaEsc; display = NULL; Msg(0, "Warning: escape char set back to ^A"); display = odisplay; } static int findseq_ge(char *seq, int k, unsigned char **sp) { unsigned char *p; int j, l; p = D_kmaps; while (p - D_kmaps < D_nseqs) { l = p[2]; p += 3; for (j = 0;; j++) { if (j == k || j == l) j = l - k; else if (p[j] != ((unsigned char *)seq)[j]) j = p[j] - ((unsigned char *)seq)[j]; else continue; break; } if (j >= 0) { *sp = p - 3; return j; } p += 2 * l + 1; } *sp = p; return -1; } static void setseqoff(unsigned char *p, int i, int o) { unsigned char *q; int l, k; k = p[2]; if (o < 256) { p[k + 4 + i] = o; return; } /* go for the biggest offset */ for (q = p + k * 2 + 4;; q += l * 2 + 4) { l = q[2]; if ((q + l * 2 - p) / 2 >= 256) { p[k + 4 + i] = (q - p - 4) / 2; return; } } } static int addmapseq(char *seq, int k, int nr) { int i, j, l, mo, m; unsigned char *p, *q; if (k >= 254) return -1; j = findseq_ge(seq, k, &p); if (j == 0) { p[0] = nr >> 8; p[1] = nr; return 0; } i = p - D_kmaps; if (D_nseqs + 2 * k + 4 >= D_aseqs) { D_kmaps = xrealloc((char *)D_kmaps, D_aseqs + 256); D_aseqs += 256; p = D_kmaps + i; } D_seqp = D_kmaps + 3; D_seql = 0; D_seqh = NULL; evdeq(&D_mapev); if (j > 0) memmove((char *)p + 2 * k + 4, (char *)p, D_nseqs - i); p[0] = nr >> 8; p[1] = nr; p[2] = k; memmove((char *)p + 3, seq, k); memset(p + k + 3, 0, k + 1); D_nseqs += 2 * k + 4; if (j > 0) { q = p + 2 * k + 4; l = q[2]; for (i = 0; i < k; i++) { if (p[3 + i] != q[3 + i]) { p[k + 4 + i] = k; break; } setseqoff(p, i, q[l + 4 + i] ? q[l + 4 + i] + k + 2 : 0); } } for (q = D_kmaps; q < p; q += 2 * l + 4) { l = q[2]; for (m = j = 0; j < l; j++) { mo = m; if (!m && q[3 + j] != seq[j]) m = 1; if (q[l + 4 + j] == 0) { if (!mo && m) setseqoff(q, j, (p - q - 4) / 2); } else if (q + q[l + 4 + j] * 2 + 4 > p || (q + q[l + 4 + j] * 2 + 4 == p && !m)) setseqoff(q, j, q[l + 4 + j] + k + 2); } } return 0; } static int remmapseq(char *seq, int k) { int j, l; unsigned char *p, *q; if (k >= 254 || (j = findseq_ge(seq, k, &p)) != 0) return -1; for (q = D_kmaps; q < p; q += 2 * l + 4) { l = q[2]; for (j = 0; j < l; j++) { if (q + q[l + 4 + j] * 2 + 4 == p) setseqoff(q, j, p[k + 4 + j] ? q[l + 4 + j] + p[k + 4 + j] - k : 0); else if (q + q[l + 4 + j] * 2 + 4 > p) q[l + 4 + j] -= k + 2; } } if (D_kmaps + D_nseqs > p + 2 * k + 4) memmove((char *)p, (char *)p + 2 * k + 4, (D_kmaps + D_nseqs) - (p + 2 * k + 4)); D_nseqs -= 2 * k + 4; D_seqp = D_kmaps + 3; D_seql = 0; D_seqh = NULL; evdeq(&D_mapev); return 0; } /* * Appends to the static variable Termcap */ static void AddCap(char *s) { int n; n = strlen(s); if (Termcaplen + n < TERMCAP_BUFSIZE - 1) { strcpy(Termcap + Termcaplen, s); Termcaplen += n; tcLineLen += n; } } /* * Reads a displays capabilities and reconstructs a termcap entry in the * global buffer "Termcap". A pointer to this buffer is returned. */ char *MakeTermcap(bool aflag) { char buf[TERMCAP_BUFSIZE]; char *p, *cp, *s, ch, *tname; int i, width, height; if (display) { width = D_width; height = D_height; tname = D_termname; } else { width = 80; height = 24; tname = "vt100"; } if ((s = getenv("SCREENCAP")) && strlen(s) < TERMCAP_BUFSIZE) { sprintf(Termcap, "TERMCAP=%s", s); strcpy(Term, "TERM=screen"); return Termcap; } Termcaplen = 0; if (*screenterm == '\0' || strlen(screenterm) > MAXSTR - 3) { strncpy(screenterm, "screen", MAXTERMLEN); screenterm[MAXTERMLEN] = '\0'; } do { strcpy(Term, "TERM="); p = Term + 5; if (!aflag && strlen(screenterm) + strlen(tname) < MAXSTR - 1) { sprintf(p, "%s.%s", screenterm, tname); if (e_tgetent(buf, p) == 1) break; } if (nwin_default.bce) { sprintf(p, "%s-bce", screenterm); if (e_tgetent(buf, p) == 1) break; } strcpy(p, screenterm); if (e_tgetent(buf, p) == 1) break; strcpy(p, "vt100"); } while (0); /* Goto free programming... */ tcLineLen = 100; /* Force NL */ if (strlen(Term) > TERMCAP_BUFSIZE - 40) strcpy(Term, "too_long"); sprintf(Termcap, "TERMCAP=SC|%s|VT 100/ANSI X3.64 virtual terminal:", Term + 5); Termcaplen = strlen(Termcap); if (extra_outcap && *extra_outcap) { for (cp = extra_outcap; (p = strchr(cp, ':')); cp = p) { ch = *++p; *p = '\0'; AddCap(cp); *p = ch; } tcLineLen = 100; /* Force NL */ } if (Termcaplen + strlen(TermcapConst) < TERMCAP_BUFSIZE) { strcpy(Termcap + Termcaplen, TermcapConst); Termcaplen += strlen(TermcapConst); } sprintf(buf, "li#%d:co#%d:", height, width); AddCap(buf); AddCap("am:"); if (aflag || (force_vt && !D_COP) || D_CLP || !D_AM) { AddCap("xn:"); AddCap("xv:"); AddCap("LP:"); } if (aflag || (D_CS && D_SR) || D_AL || D_CAL) { AddCap("sr=\\EM:"); AddCap("al=\\E[L:"); AddCap("AL=\\E[%dL:"); } else if (D_SR) AddCap("sr=\\EM:"); if (aflag || D_CS) AddCap("cs=\\E[%i%d;%dr:"); if (aflag || D_CS || D_DL || D_CDL) { AddCap("dl=\\E[M:"); AddCap("DL=\\E[%dM:"); } if (aflag || D_DC || D_CDC) { AddCap("dc=\\E[P:"); AddCap("DC=\\E[%dP:"); } if (aflag || D_CIC || D_IC || D_IM) { AddCap("im=\\E[4h:"); AddCap("ei=\\E[4l:"); AddCap("mi:"); AddCap("IC=\\E[%d@:"); } AddCap("ks=\\E[?1h\\E=:"); AddCap("ke=\\E[?1l\\E>:"); AddCap("vi=\\E[?25l:"); AddCap("ve=\\E[34h\\E[?25h:"); AddCap("vs=\\E[34l:"); AddCap("ti=\\E[?1049h:"); AddCap("te=\\E[?1049l:"); if (display) { if (D_US) { AddCap("us=\\E[4m:"); AddCap("ue=\\E[24m:"); } if (D_CZH) { AddCap("so=\\E[3m:"); AddCap("se=\\E[23m:"); } if (D_SO) { AddCap("so=\\E[7m:"); AddCap("se=\\E[27m:"); } if (D_MB) AddCap("mb=\\E[5m:"); if (D_MD) AddCap("md=\\E[1m:"); if (D_MH) AddCap("mh=\\E[2m:"); if (D_MR) AddCap("mr=\\E[7m:"); if (D_MB || D_MD || D_MH || D_MR) AddCap("me=\\E[m:ms:"); if (D_hascolor) AddCap("Co#8:pa#64:AF=\\E[3%dm:AB=\\E[4%dm:op=\\E[39;49m:AX:"); if (D_VB) AddCap("vb=\\Eg:"); if (D_CG0) AddCap("G0:"); if (D_CC0 || (D_CS0 && *D_CS0)) { AddCap("as=\\E(0:"); AddCap("ae=\\E(B:"); /* avoid `` because some shells dump core... */ AddCap("ac=\\140\\140aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~..--++,,hhII00:"); } if (D_PO) { AddCap("po=\\E[5i:"); AddCap("pf=\\E[4i:"); } if (D_CZ0) { AddCap("Z0=\\E[?3h:"); AddCap("Z1=\\E[?3l:"); } if (D_CWS) AddCap("WS=\\E[8;%d;%dt:"); } for (i = T_CAPS; i < T_ECAPS; i++) { struct action *act; if (i < T_OCAPS) { if (i >= T_KEYPAD) /* don't put keypad codes in TERMCAP */ continue; /* - makes it too big */ #if (TERMCAP_BUFSIZE < 1024) if (i >= T_FEXTRA && i < T_BACKTAB) /* also skip extra vt220 keys */ continue; if (i > T_BACKTAB && i < T_NAVIGATE) /* more vt220 keys */ continue; #endif if (i >= T_CURSOR && i < T_OCAPS) { act = &umtab[i - (T_CURSOR - T_OCAPS + T_CAPS)]; if (act->nr == RC_ILLEGAL) act = &dmtab[i - (T_CURSOR - T_OCAPS + T_CAPS)]; } else { act = &umtab[i - T_CAPS]; if (act->nr == RC_ILLEGAL) act = &dmtab[i - T_CAPS]; } if (act->nr == RC_ILLEGAL && (i == T_NAVIGATE + 1 || i == T_NAVIGATE + 3)) { /* kh -> @1, kH -> @7 */ act = &umtab[i - T_CAPS - 1]; if (act->nr == RC_ILLEGAL) act = &dmtab[i - T_CAPS - 1]; } if (act->nr != RC_ILLEGAL) { if (act->nr == RC_STUFF) { MakeString(term[i].tcname, buf, ARRAY_SIZE(buf), act->args[0]); AddCap(buf); } continue; } } if (display == NULL) continue; switch (term[i].type) { case T_STR: if (D_tcs[i].str == NULL) break; MakeString(term[i].tcname, buf, ARRAY_SIZE(buf), D_tcs[i].str); AddCap(buf); break; case T_FLG: if (D_tcs[i].flg == 0) break; sprintf(buf, "%s:", term[i].tcname); AddCap(buf); break; default: break; } } return Termcap; } #define TERMCAP_MAX_WIDTH 63 void DumpTermcap(int aflag, FILE *f) { const char *p, *pe; int n, col = 0; if ((p = index(MakeTermcap(aflag), '=')) == NULL) return; p++; /* write termcap entry with wrapping */ while ((pe = index(p, ':'))) { n = pe - p + 1; if ((col > 8) && ((col + n) > TERMCAP_MAX_WIDTH)) { fwrite("\\\n\t:", 1, 4, f); col = 8; } fwrite(p, 1, n, f); col += n; p = ++pe; } if(*p) fwrite(p, 1, strlen(p), f); fputc('\n', f); } static void MakeString(char *cap, char *buf, int buflen, char *s) { char *p, *pmax; unsigned int c; p = buf; pmax = p + buflen - (3 + 4 + 2); *p++ = *cap++; *p++ = *cap; *p++ = '='; while ((c = *s++) && (p < pmax)) { switch (c) { case '\033': *p++ = '\\'; *p++ = 'E'; break; case ':': strcpy(p, "\\072"); p += 4; break; case '^': case '\\': *p++ = '\\'; *p++ = c; break; default: if (c >= 200) { sprintf(p, "\\%03o", c & 0377); p += 4; } else if (c < ' ') { *p++ = '^'; *p++ = c + '@'; } else *p++ = c; } } *p++ = ':'; *p = '\0'; } #undef QUOTES #define QUOTES(p) \ (*p == '\\' && (p[1] == '\\' || p[1] == ',' || p[1] == '%')) int CreateTransTable(char *s) { int curchar; char *templ, *arg; int templlen; int templnsub; char *p, *sx; char **ctable; int l, c; if ((D_xtable = calloc(256, sizeof(char **))) == NULL) { Msg(0, "%s", strnomem); return -1; } while (*s) { if (QUOTES(s)) s++; curchar = (unsigned char)*s++; if (curchar == 'B') curchar = 0; /* ASCII */ templ = s; templlen = 0; templnsub = 0; if (D_xtable[curchar] == NULL) { if ((D_xtable[curchar] = calloc(257, sizeof(char *))) == NULL) { Msg(0, "%s", strnomem); FreeTransTable(); return -1; } } ctable = D_xtable[curchar]; for (; *s && *s != ','; s++) { if (QUOTES(s)) s++; else if (*s == '%') { templnsub++; continue; } templlen++; } if (*s++ == 0) break; while (*s && *s != ',') { c = (unsigned char)*s++; if (QUOTES((s - 1))) c = (unsigned char)*s++; else if (c == '%') c = 256; if (ctable[c]) free(ctable[c]); arg = s; l = copyarg(&s, NULL); if (c != 256) l = l * templnsub + templlen; if ((ctable[c] = malloc(l + 1)) == NULL) { Msg(0, "%s", strnomem); FreeTransTable(); return -1; } sx = ctable[c]; for (p = ((c == 256) ? "%" : templ); *p && *p != ','; p++) { if (QUOTES(p)) p++; else if (*p == '%') { s = arg; sx += copyarg(&s, sx); continue; } *sx++ = *p; } *sx = 0; } if (*s == ',') s++; } return 0; } void FreeTransTable(void) { char ***p, **q; int i, j; if ((p = D_xtable) == NULL) return; for (i = 0; i < 256; i++, p++) { if (*p == NULL) continue; q = *p; for (j = 0; j < 257; j++, q++) if (*q) free(*q); free(*p); } free(D_xtable); D_xtable = NULL; } static int copyarg(char **pp, char *s) { int l; char *p; for (l = 0, p = *pp; *p && *p != ','; p++) { if (QUOTES(p)) p++; if (s) *s++ = *p; l++; } if (*p == ',') p++; *pp = p; return l; } /* ** ** Termcap routines that use our extra_incap ** */ static int e_tgetent(char *bp, char *name) { int r; xseteuid(real_uid); xsetegid(real_gid); r = tgetent(bp, name); xseteuid(eff_uid); xsetegid(eff_gid); return r; } /* findcap: * cap = capability we are looking for * tepp = pointer to bufferpointer * n = size of buffer (0 = infinity) */ static char *findcap(char *cap, char **tepp, int n) { char *tep; char c, *p, *cp; int mode; /* mode: 0=LIT 1=^ 2=\x 3,4,5=\nnn */ int num = 0, capl; if (!extra_incap) return NULL; tep = *tepp; capl = strlen(cap); cp = NULL; mode = 0; for (p = extra_incap; *p;) { if (strncmp(p, cap, capl) == 0) { p += capl; c = *p; if (c && c != ':' && c != '@') p++; if (c == 0 || c == '@' || c == '=' || c == ':' || c == '#') cp = tep; } while ((c = *p)) { p++; if (mode == 0) { if (c == ':') break; if (c == '^') mode = 1; if (c == '\\') mode = 2; } else if (mode == 1) { mode = 0; c = c & 0x1f; } else if (mode == 2) { mode = 0; switch (c) { case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': mode = 3; num = 0; break; case 'E': c = 27; break; case 'n': c = '\n'; break; case 'r': c = '\r'; break; case 't': c = '\t'; break; case 'b': c = '\b'; break; case 'f': c = '\f'; break; } } if (mode > 2) { num = num * 8 + (c - '0'); if (mode++ == 5 || (*p < '0' || *p > '9')) { c = num; mode = 0; } } if (mode) continue; if (cp && n != 1) { *cp++ = c; n--; } } if (cp) { *cp++ = 0; *tepp = cp; return tep; } } return NULL; } static char *e_tgetstr(char *cap, char **tepp) { char *tep; if ((tep = findcap(cap, tepp, 0))) return (*tep == '@') ? NULL : tep; return tgetstr(cap, tepp); } static int e_tgetflag(char *cap) { char buf[2], *bufp; char *tep; bufp = buf; if ((tep = findcap(cap, &bufp, 2))) return (*tep == '@') ? 0 : 1; return tgetflag(cap) > 0; } static int e_tgetnum(char *cap) { char buf[20], *bufp; char *tep, c; int res, base = 10; bufp = buf; if ((tep = findcap(cap, &bufp, 20))) { c = *tep; if (c == '@') return -1; if (c == '0') base = 8; res = 0; while ((c = *tep++) >= '0' && c <= '9') res = res * base + (c - '0'); return res; } return tgetnum(cap); } screen-5.0.2/term.sh0000664000175000017500000000616415224432722012760 0ustar alexalex#! /bin/sh if test -z "$AWK"; then AWK=awk fi if test -z "$srcdir"; then srcdir=. fi LC_ALL=C export LC_ALL rm -f term.h cat << EOF > term.h /* * This file is automagically created from term.c -- DO NOT EDIT */ #define T_FLG 0 #define T_NUM 1 #define T_STR 2 extern int tgetent(char *, const char *); extern int tgetflag(char *); extern int tgetnum(char *); extern char *tgetstr(char *, char **); extern char *tgoto(const char *, int, int); extern int tputs(const char *, int, int (*)(int)); extern char *tparm(char *str, ...); struct term { char *tcname; int type; }; union tcu { int flg; int num; char *str; }; extern struct term term[]; EOF # # SCO-Unix sufferers may need to use the following lines: # perl -p < ${srcdir}/term.c \ # -e 's/"/"C/ if /"[A-Z]."/;' \ # -e 'y/[a-z]/[A-Z]/ if /"/;' \ # sed < ${srcdir}/term.c \ -e '/"[A-Z]."/s/"/"C/' \ -e '/"/y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/' \ | $AWK ' /^ [{] ".*KMAPDEF[(].*$/{ if (min == 0) min = s max = s; } /^ [{] ".*KMAPADEF[(].*$/{ if (amin == 0) amin = s amax = s; } /^ [{] ".*KMAPMDEF[(].*$/{ if (mmin == 0) mmin = s mmax = s; } /^ [{] ".*$/{ a=substr($2,2,length($2)-3); b=substr($3,3,3); if (nolist == 0) { printf "#define d_%s d_tcs[%d].%s\n",a,s,b printf "#define D_%s (D_tcs[%d].%s)\n",a,s,b } s++; } /\/* define/{ printf "#define %s %d\n",$3,s } /\/* nolist/{ nolist = 1; } /\/* list/{ nolist = 0; } END { printf "# define KMAPDEFSTART %d\n", min printf "# define NKMAPDEF %d\n", max-min+1 printf "# define KMAPADEFSTART %d\n", amin printf "# define NKMAPADEF %d\n", amax-amin+1 printf "# define KMAPMDEFSTART %d\n", mmin printf "# define NKMAPMDEF %d\n", mmax-mmin+1 } ' | sed -e s/NUM/num/ -e s/STR/str/ -e s/FLG/flg/ \ >> term.h rm -f kmapdef.c cat << EOF > kmapdef.c /* * This file is automagically created from term.c -- DO NOT EDIT */ #include "kmapdef.h" EOF $AWK < ${srcdir}/term.c ' /^ [{] ".*KMAP.*$/{ for (i = 0; i < 3; i++) { q = $(5+i) if (substr(q, 1, 5) == "KMAPD") { if (min == 0) min = s max = s arr[s] = substr(q, 9, length(q)-9) } if (substr(q, 1, 5) == "KMAPA") { if (amin == 0) amin = s amax = s anarr[s] = substr(q, 10, length(q)-10) } if (substr(q, 1, 5) == "KMAPM") { if (mmin == 0) mmin = s mmax = s mnarr[s] = substr(q, 10, length(q)-10) } } } /^ [{] ".*$/{ s++; } END { printf "char *kmapdef[] = {\n" for (s = min; s <= max; s++) { if (arr[s]) printf "%s", arr[s] else printf "0" if (s < max) printf ",\n" else printf "\n" } printf "};\n\n" printf "char *kmapadef[] = {\n" for (s = amin; s <= amax; s++) { if (anarr[s]) printf "%s", anarr[s] else printf "0" if (s < amax) printf ",\n" else printf "\n" } printf "};\n\n" printf "char *kmapmdef[] = {\n" for (s = mmin; s <= mmax; s++) { if (mnarr[s]) printf "%s", mnarr[s] else printf "0" if (s < mmax) printf ",\n" else printf "\n" } printf "};\n" } ' >> kmapdef.c chmod a-w kmapdef.c chmod a-w term.h screen-5.0.2/term.c0000664000175000017500000001732515224432722012571 0ustar alexalex/* Copyright (c) 2008, 2009 * Juergen Weigert (jnweiger@immd4.informatik.uni-erlangen.de) * Michael Schroeder (mlschroe@immd4.informatik.uni-erlangen.de) * Micah Cowan (micah@cowan.name) * Sadrul Habib Chowdhury (sadrul@users.sourceforge.net) * Copyright (c) 1993-2002, 2003, 2005, 2006, 2007 * Juergen Weigert (jnweiger@immd4.informatik.uni-erlangen.de) * Michael Schroeder (mlschroe@immd4.informatik.uni-erlangen.de) * Copyright (c) 1987 Oliver Laumann * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3, or (at your option) * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program (see the file COPYING); if not, see * https://www.gnu.org/licenses/, or contact Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02111-1301 USA * **************************************************************** */ #include "term.h" #define KMAPDEF(s) #define KMAPADEF(s) #define KMAPMDEF(s) struct term term[T_N] = { /* display size */ { "li", T_NUM }, { "co", T_NUM }, /* terminal types*/ { "hc", T_FLG }, { "os", T_FLG }, { "ns", T_FLG }, /* cursor movement */ { "cm", T_STR }, { "ho", T_STR }, { "cr", T_STR }, { "up", T_STR }, { "UP", T_STR }, { "do", T_STR }, { "DO", T_STR }, { "bs", T_FLG }, { "bc", T_STR }, { "le", T_STR }, { "LE", T_STR }, { "nd", T_STR }, { "RI", T_STR }, /* scroll */ { "cs", T_STR }, { "nl", T_STR }, { "sf", T_STR }, { "sr", T_STR }, { "al", T_STR }, { "AL", T_STR }, { "dl", T_STR }, { "DL", T_STR }, /* insert/delete */ { "in", T_FLG }, { "im", T_STR }, { "ei", T_STR }, { "ic", T_STR }, { "IC", T_STR }, { "dc", T_STR }, { "DC", T_STR }, /* erase */ { "ut", T_FLG }, { "cl", T_STR }, { "cd", T_STR }, { "CD", T_STR }, { "ce", T_STR }, { "cb", T_STR }, { "E3", T_STR }, /* initialise */ { "is", T_STR }, { "ti", T_STR }, { "te", T_STR }, /* bell */ { "bl", T_STR }, { "vb", T_STR }, /* resizing */ { "WS", T_STR }, { "Z0", T_STR }, { "Z1", T_STR }, /* attributes */ /* define T_ATTR */ /* order is important for how we set up attributes */ { "mh", T_STR }, { "us", T_STR }, { "md", T_STR }, { "mr", T_STR }, { "so", T_STR }, { "mb", T_STR }, { "ZH", T_STR }, { "ue", T_STR }, { "se", T_STR }, { "me", T_STR }, { "ms", T_FLG }, { "sg", T_NUM }, { "ug", T_NUM }, { "sa", T_STR }, { "ZR", T_STR }, /* color */ { "AF", T_STR }, { "AB", T_STR }, { "Sf", T_STR }, { "Sb", T_STR }, { "op", T_STR }, { "Co", T_NUM }, { "be", T_FLG }, { "AX", T_FLG }, { "C8", T_FLG }, /* keypad/cursorkeys */ { "ks", T_STR }, { "ke", T_STR }, { "CS", T_STR }, { "CE", T_STR }, /* printer */ { "po", T_STR }, { "pf", T_STR }, /* status line */ { "hs", T_FLG }, { "ws", T_NUM }, { "ts", T_STR }, { "fs", T_STR }, { "ds", T_STR }, /* cursor visibility */ { "vi", T_STR }, { "vs", T_STR }, { "ve", T_STR }, /* margin handling */ { "am", T_FLG }, { "xv", T_FLG }, { "xn", T_FLG }, { "OP", T_FLG }, { "LP", T_FLG }, /* special settings */ { "NF", T_FLG }, { "nx", T_FLG }, { "AN", T_FLG }, { "OL", T_NUM }, { "KJ", T_STR }, { "VR", T_STR }, { "VN", T_STR }, { "TF", T_FLG }, { "XT", T_FLG }, /* d_font setting */ { "G0", T_FLG }, { "S0", T_STR }, { "E0", T_STR }, { "C0", T_STR }, { "as", T_STR }, { "ae", T_STR }, { "ac", T_STR }, { "eA", T_STR }, { "XC", T_STR }, /* keycaps */ /* define T_CAPS */ /* mouse */ { "Km", T_STR }, KMAPDEF("\033[M") KMAPMDEF("\222") /* nolist */ { "k0", T_STR }, KMAPDEF("\033[10~") { "k1", T_STR }, KMAPDEF("\033OP") { "k2", T_STR }, KMAPDEF("\033OQ") { "k3", T_STR }, KMAPDEF("\033OR") { "k4", T_STR }, KMAPDEF("\033OS") { "k5", T_STR }, KMAPDEF("\033[15~") { "k6", T_STR }, KMAPDEF("\033[17~") { "k7", T_STR }, KMAPDEF("\033[18~") { "k8", T_STR }, KMAPDEF("\033[19~") { "k9", T_STR }, KMAPDEF("\033[20~") { "k;", T_STR }, KMAPDEF("\033[21~") { "F1", T_STR }, KMAPDEF("\033[23~") { "F2", T_STR }, KMAPDEF("\033[24~") /* extra keys for vt220 (David.Leonard@it.uq.edu.au) */ /* define T_FEXTRA */ { "F3", T_STR }, { "F4", T_STR }, { "F5", T_STR }, { "F6", T_STR }, { "F7", T_STR }, { "F8", T_STR }, { "F9", T_STR }, { "FA", T_STR }, { "FB", T_STR }, { "FC", T_STR }, { "FD", T_STR }, { "FE", T_STR }, { "kb", T_STR }, { "K1", T_STR }, { "K2", T_STR }, { "K3", T_STR }, { "K4", T_STR }, { "K5", T_STR }, /* more keys for Andrew A. Chernov (ache@astral.msk.su) */ { "kA", T_STR }, { "ka", T_STR }, /* define T_BACKTAB */ { "kB", T_STR }, { "kC", T_STR }, { "kE", T_STR }, { "kF", T_STR }, KMAPMDEF("\004") { "kL", T_STR }, { "kM", T_STR }, { "kR", T_STR }, KMAPMDEF("\025") { "kS", T_STR }, { "kT", T_STR }, { "kt", T_STR }, { "*4", T_STR }, /* kDC */ { "*7", T_STR }, /* kEND */ { "#2", T_STR }, /* kHOM */ { "#3", T_STR }, /* kIC */ { "#4", T_STR }, /* kLFT */ { "%c", T_STR }, /* kNXT */ { "%e", T_STR }, /* kPRV */ { "%i", T_STR }, /* kRIT */ /* keys above the cursor */ /* define T_NAVIGATE */ { "kh", T_STR }, KMAPDEF("\033[1~") KMAPMDEF("\201") { "@1", T_STR }, { "kH", T_STR }, KMAPDEF("\033[4~") KMAPMDEF("\205") { "@7", T_STR }, KMAPDEF("\033[4~") KMAPMDEF("\205") { "kN", T_STR }, KMAPDEF("\033[6~") KMAPMDEF("\006") { "kP", T_STR }, KMAPDEF("\033[5~") KMAPMDEF("\002") { "kI", T_STR }, KMAPDEF("\033[2~") /* define T_NAVIGATE_DELETE */ { "kD", T_STR }, KMAPDEF("\033[3~") /* keys that can have two bindings */ /* define T_CURSOR */ { "ku", T_STR }, KMAPDEF("\033[A") KMAPADEF("\033OA") KMAPMDEF("\220") { "kd", T_STR }, KMAPDEF("\033[B") KMAPADEF("\033OB") KMAPMDEF("\216") { "kr", T_STR }, KMAPDEF("\033[C") KMAPADEF("\033OC") KMAPMDEF("\206") { "kl", T_STR }, KMAPDEF("\033[D") KMAPADEF("\033OD") KMAPMDEF("\202") /* define T_KEYPAD */ { "f0", T_STR }, KMAPDEF("0") KMAPADEF("\033Op") { "f1", T_STR }, KMAPDEF("1") KMAPADEF("\033Oq") { "f2", T_STR }, KMAPDEF("2") KMAPADEF("\033Or") { "f3", T_STR }, KMAPDEF("3") KMAPADEF("\033Os") { "f4", T_STR }, KMAPDEF("4") KMAPADEF("\033Ot") { "f5", T_STR }, KMAPDEF("5") KMAPADEF("\033Ou") { "f6", T_STR }, KMAPDEF("6") KMAPADEF("\033Ov") { "f7", T_STR }, KMAPDEF("7") KMAPADEF("\033Ow") { "f8", T_STR }, KMAPDEF("8") KMAPADEF("\033Ox") { "f9", T_STR }, KMAPDEF("9") KMAPADEF("\033Oy") { "f+", T_STR }, KMAPDEF("+") KMAPADEF("\033Ok") { "f-", T_STR }, KMAPDEF("-") KMAPADEF("\033Om") { "f*", T_STR }, KMAPDEF("*") KMAPADEF("\033Oj") { "f/", T_STR }, KMAPDEF("/") KMAPADEF("\033Oo") { "fq", T_STR }, KMAPDEF("=") KMAPADEF("\033OX") { "f.", T_STR }, KMAPDEF(".") KMAPADEF("\033On") { "f,", T_STR }, KMAPDEF(",") KMAPADEF("\033Ol") { "fe", T_STR }, KMAPDEF("\015") KMAPADEF("\033OM") /* other things related to keycaps */ /* define T_OCAPS */ { "km", T_FLG }, { "ko", T_STR }, { "l0", T_STR }, { "l1", T_STR }, { "l2", T_STR }, { "l3", T_STR }, { "l4", T_STR }, { "l5", T_STR }, { "l6", T_STR }, { "l7", T_STR }, { "l8", T_STR }, { "l9", T_STR }, { "la", T_STR }, /* list */ /* define T_ECAPS */ /* define T_N */ }; screen-5.0.2/telnet.h0000664000175000017500000000064415224432722013116 0ustar alexalex#ifndef SCREEN_TELNET_H #define SCREEN_TELNET_H #include "config.h" #include "window.h" #ifdef ENABLE_TELNET int TelOpenAndConnect(Window *); int TelIsline(Window *); void TelProcessLine(char **, size_t *); int DoTelnet(char *, int *, int); int TelIn(Window *, char *, size_t, int); void TelBreak(Window *); void TelWindowSize(Window *); void TelStatus(Window *, char *, size_t); #endif #endif /* SCREEN_TELNET_H */ screen-5.0.2/telnet.c0000664000175000017500000002632515224432722013115 0ustar alexalex/* Copyright (c) 2008, 2009 * Juergen Weigert (jnweiger@immd4.informatik.uni-erlangen.de) * Michael Schroeder (mlschroe@immd4.informatik.uni-erlangen.de) * Micah Cowan (micah@cowan.name) * Sadrul Habib Chowdhury (sadrul@users.sourceforge.net) * Copyright (c) 1993-2002, 2003, 2005, 2006, 2007 * Juergen Weigert (jnweiger@immd4.informatik.uni-erlangen.de) * Michael Schroeder (mlschroe@immd4.informatik.uni-erlangen.de) * Copyright (c) 1987 Oliver Laumann * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3, or (at your option) * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program (see the file COPYING); if not, see * https://www.gnu.org/licenses/, or contact Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02111-1301 USA * **************************************************************** */ #include "config.h" #include "telnet.h" #ifdef ENABLE_TELNET #include #include #include #include #include #include "screen.h" #include "ansi.h" #include "misc.h" #include "termcap.h" static void TelReply(Window *, char *, size_t); static void TelDocmd(Window *, int, int); static void TelDosub(Window *); // why TEL_DEFPORT has " #define TEL_DEFPORT "23" #define TEL_CONNECTING (-2) #define TC_IAC 255 #define TC_DONT 254 #define TC_DO 253 #define TC_WONT 252 #define TC_WILL 251 #define TC_SB 250 #define TC_BREAK 243 #define TC_SE 240 #define TC_S "S b swWdDc" #define TO_BINARY 0 #define TO_ECHO 1 #define TO_SGA 3 #define TO_TM 6 #define TO_TTYPE 24 #define TO_NAWS 31 #define TO_TSPEED 32 #define TO_LFLOW 33 #define TO_LINEMODE 34 #define TO_XDISPLOC 35 #define TO_NEWENV 39 #define TO_S "be c t wsf xE E" static unsigned char tn_init[] = { TC_IAC, TC_DO, TO_SGA, TC_IAC, TC_WILL, TO_TTYPE, TC_IAC, TC_WILL, TO_NAWS, TC_IAC, TC_WILL, TO_LFLOW, }; static void tel_connev_fn(Event *ev, void *data) { Window *win = (Window *)data; (void)ev; /* unused */ if (connect(win->w_ptyfd, (struct sockaddr *)&win->w_telsa, sizeof(struct sockaddr_in)) && errno != EISCONN) { char buf[1024]; buf[0] = ' '; strncpy(buf + 1, strerror(errno), ARRAY_SIZE(buf) - 2); buf[ARRAY_SIZE(buf) - 1] = 0; WriteString(win, buf, strlen(buf)); WindowDied(win, 0, 0); return; } WriteString(win, "connected.\r\n", 12); evdeq(&win->w_telconnev); win->w_telstate = 0; } int TelOpenAndConnect(Window *win) { int fd, on = 1; char buf[256]; struct addrinfo hints, *res0, *res; if (!(win->w_cmdargs[1])) { Msg(0, "Usage: screen //telnet host [port]"); return -1; } memset(&hints, 0, sizeof(struct addrinfo)); hints.ai_family = af; hints.ai_socktype = SOCK_STREAM; hints.ai_protocol = IPPROTO_TCP; if (getaddrinfo(win->w_cmdargs[1], win->w_cmdargs[2] ? win->w_cmdargs[2] : TEL_DEFPORT, &hints, &res0)) { Msg(0, "unknown host: %s", win->w_cmdargs[1]); return -1; } for (res = res0; res; res = res->ai_next) { if ((fd = socket(res->ai_family, res->ai_socktype, res->ai_protocol)) == -1) { if (res->ai_next) continue; else { Msg(errno, "TelOpenAndConnect: socket"); freeaddrinfo(res0); return -1; } } if (setsockopt(fd, SOL_SOCKET, SO_OOBINLINE, (char *)&on, sizeof(int))) Msg(errno, "TelOpenAndConnect: setsockopt SO_OOBINLINE"); if (win->w_cmdargs[2] && strcmp(win->w_cmdargs[2], TEL_DEFPORT)) snprintf(buf, 256, "Trying %s %s...", win->w_cmdargs[1], win->w_cmdargs[2]); else snprintf(buf, 256, "Trying %s...", win->w_cmdargs[1]); WriteString(win, buf, strlen(buf)); if (connect(fd, res->ai_addr, res->ai_addrlen)) { if (errno == EINPROGRESS) { win->w_telstate = TEL_CONNECTING; win->w_telconnev.fd = fd; win->w_telconnev.handler = tel_connev_fn; win->w_telconnev.data = (void *)win; win->w_telconnev.type = EV_WRITE; win->w_telconnev.priority = 1; evenq(&win->w_telconnev); } else { close(fd); if (res->ai_next) continue; else { Msg(errno, "TelOpenAndConnect: connect"); freeaddrinfo(res0); return -1; } } } else WriteString(win, "connected.\r\n", 12); if (!(win->w_cmdargs[2] && strcmp(win->w_cmdargs[2], TEL_DEFPORT))) TelReply(win, (char *)tn_init, ARRAY_SIZE(tn_init)); win->w_ptyfd = fd; memmove(&win->w_telsa, &res->ai_addr, sizeof(res->ai_addr)); freeaddrinfo(res0); return 0; } return -1; } int TelIsline(Window *win) { (void)win; /* unused */ return !fore->w_telropts[TO_SGA]; } void TelProcessLine(char **bufpp, size_t *lenp) { int echo = !fore->w_telropts[TO_ECHO]; unsigned char c; char *tb; size_t tl; char *buf = *bufpp; size_t l = *lenp; while (l--) { c = *(unsigned char *)buf++; if (fore->w_telbufl + 2 >= IOSIZE) { WBell(fore, visual_bell); continue; } if (c == '\r') { if (echo) WriteString(fore, "\r\n", 2); fore->w_telbuf[fore->w_telbufl++] = '\r'; fore->w_telbuf[fore->w_telbufl++] = '\n'; tb = fore->w_telbuf; tl = fore->w_telbufl; LayProcess(&tb, &tl); fore->w_telbufl = 0; continue; } if (c == '\b' && fore->w_telbufl > 0) { if (echo) { WriteString(fore, (char *)&c, 1); WriteString(fore, " ", 1); WriteString(fore, (char *)&c, 1); } fore->w_telbufl--; } if ((c >= 0x20 && c <= 0x7e) || c >= 0xa0) { if (echo) WriteString(fore, (char *)&c, 1); fore->w_telbuf[fore->w_telbufl++] = c; } } *lenp = 0; } int DoTelnet(char *buf, int *lenp, int f) { int echo = !fore->w_telropts[TO_ECHO]; int cmode = fore->w_telropts[TO_SGA]; int bin = fore->w_telropts[TO_BINARY]; char *p = buf, *sbuf; int trunc = 0; int c; ssize_t l = *lenp; sbuf = p; while (l-- > 0) { c = *(unsigned char *)p++; if (c == TC_IAC || (c == '\r' && (l == 0 || *p != '\n') && cmode && !bin)) { if (cmode && echo) { WriteString(fore, sbuf, p - sbuf); sbuf = p; } if (f-- <= 0) { trunc++; l--; } if (l < 0) { p--; /* drop char */ break; } if (l) memmove(p + 1, p, l); if (c == TC_IAC) *p++ = c; else if (c == '\r') *p++ = 0; else if (c == '\n') { p[-1] = '\r'; *p++ = '\n'; } } } *lenp = p - buf; return trunc; } /* modifies data in-place, returns new length */ int TelIn(Window *win, char *buf, size_t len, int free) { char *rp, *wp; int c; rp = wp = buf; while (len-- > 0) { c = *(unsigned char *)rp++; if (win->w_telstate >= TC_WILL && win->w_telstate <= TC_DONT) { TelDocmd(win, win->w_telstate, c); win->w_telstate = 0; continue; } if (win->w_telstate == TC_SB || win->w_telstate == TC_SE) { if (win->w_telstate == TC_SE && c == TC_IAC) win->w_telsubidx--; if (win->w_telstate == TC_SE && c == TC_SE) { win->w_telsubidx--; TelDosub(win); win->w_telstate = 0; continue; } if (win->w_telstate == TC_SB && c == TC_IAC) win->w_telstate = TC_SE; else win->w_telstate = TC_SB; win->w_telsubbuf[win->w_telsubidx] = c; if (win->w_telsubidx < (int)ARRAY_SIZE(win->w_telsubbuf) - 1) win->w_telsubidx++; continue; } if (win->w_telstate == TC_IAC) { if ((c >= TC_WILL && c <= TC_DONT) || c == TC_SB) { win->w_telsubidx = 0; win->w_telstate = c; continue; } win->w_telstate = 0; if (c != TC_IAC) continue; } else if (c == TC_IAC) { win->w_telstate = c; continue; } if (win->w_telstate == '\r') { win->w_telstate = 0; if (c == 0) continue; /* suppress trailing \0 */ } else if (c == '\n' && !win->w_telropts[TO_SGA]) { /* oops... simulate terminal line mode: insert \r */ if (wp + 1 == rp) { if (free-- > 0) { if (len) memmove(rp + 1, rp, len); rp++; *wp++ = '\r'; } } else *wp++ = '\r'; } if (c == '\r') win->w_telstate = c; *wp++ = c; } return wp - buf; } static void TelReply(Window *win, char *str, size_t len) { if (len == 0) return; if (win->w_inlen + len > IOSIZE) { Msg(0, "Warning: telnet protocol overrun!"); return; } memmove(win->w_inbuf + win->w_inlen, str, len); win->w_inlen += len; } static void TelDocmd(Window *win, int cmd, int opt) { unsigned char b[3]; int repl = 0; switch (cmd) { case TC_WILL: if (win->w_telropts[opt] || opt == TO_TM) return; repl = TC_DONT; if (opt == TO_ECHO || opt == TO_SGA || opt == TO_BINARY) { win->w_telropts[opt] = 1; /* setcon(); */ repl = TC_DO; } break; case TC_WONT: if (!win->w_telropts[opt] || opt == TO_TM) return; repl = TC_DONT; win->w_telropts[opt] = 0; break; case TC_DO: if (win->w_telmopts[opt]) return; repl = TC_WONT; if (opt == TO_TTYPE || opt == TO_SGA || opt == TO_BINARY || opt == TO_NAWS || opt == TO_TM || opt == TO_LFLOW) { repl = TC_WILL; win->w_telmopts[opt] = 1; } win->w_telmopts[TO_TM] = 0; break; case TC_DONT: if (!win->w_telmopts[opt]) return; repl = TC_WONT; win->w_telmopts[opt] = 0; break; } b[0] = TC_IAC; b[1] = repl; b[2] = opt; TelReply(win, (char *)b, 3); if (cmd == TC_DO && opt == TO_NAWS) TelWindowSize(win); } static void TelDosub(Window *win) { char trepl[MAXTERMLEN + 6 + 1]; size_t len; switch (win->w_telsubbuf[0]) { case TO_TTYPE: if (win->w_telsubidx != 2 || win->w_telsubbuf[1] != 1) return; len = strlen(screenterm); if (len >= MAXTERMLEN) break; sprintf(trepl, "%c%c%c%c%s%c%c", TC_IAC, TC_SB, TO_TTYPE, 0, screenterm, TC_IAC, TC_SE); TelReply(win, trepl, len + 6); break; case TO_LFLOW: if (win->w_telsubidx != 2) return; break; default: break; } } void TelBreak(Window *win) { static unsigned char tel_break[] = { TC_IAC, TC_BREAK }; TelReply(win, (char *)tel_break, 2); } void TelWindowSize(Window *win) { char s[20], trepl[20], *t; if (win->w_width == 0 || win->w_height == 0 || !win->w_telmopts[TO_NAWS]) return; sprintf(s, "%c%c%c%c%c%c%c%c%c", TC_SB, TC_SB, TO_NAWS, win->w_width / 256, win->w_width & 255, win->w_height / 256, win->w_height & 255, TC_SE, TC_SE); t = trepl; for (size_t i = 0; i < 9; i++) if ((unsigned char)(*t++ = s[i]) == TC_IAC) *t++ = (char)TC_IAC; trepl[0] = (char)TC_IAC; t[-2] = (char)TC_IAC; TelReply(win, trepl, t - trepl); } static char tc_s[] = TC_S; static char to_s[] = TO_S; void TelStatus(Window *win, char *buf, size_t len) { (void)len; /* unused */ *buf++ = '['; for (size_t i = 0; to_s[i]; i++) { if (to_s[i] == ' ' || win->w_telmopts[i] == 0) continue; *buf++ = to_s[i]; } *buf++ = ':'; for (size_t i = 0; to_s[i]; i++) { if (to_s[i] == ' ' || win->w_telropts[i] == 0) continue; *buf++ = to_s[i]; } if (win->w_telstate == TEL_CONNECTING) buf[-1] = 'C'; else if (win->w_telstate && win->w_telstate != '\r') { *buf++ = ':'; *buf++ = tc_s[win->w_telstate - TC_SE]; } *buf++ = ']'; *buf = 0; return; } #endif /* ENABLE_TELNET */ screen-5.0.2/socket.h0000664000175000017500000000066515224432722013116 0ustar alexalex#ifndef SCREEN_SOCKET_H #define SCREEN_SOCKET_H #include "window.h" int FindSocket (int *, int *, int *, char *); int MakeClientSocket (int); int MakeServerSocket (void); int RecoverSocket (void); int chsock (void); void ReceiveMsg (void); void SendCreateMsg (char *, struct NewWindow *); int SendErrorMsg (char *, char *); int SendAttachMsg (int, Message *, int); void ReceiveRaw (int); #endif /* SCREEN_SOCKET_H */ screen-5.0.2/socket.c0000664000175000017500000010770515224432722013114 0ustar alexalex/* Copyright (c) 2008, 2009 * Juergen Weigert (jnweiger@immd4.informatik.uni-erlangen.de) * Michael Schroeder (mlschroe@immd4.informatik.uni-erlangen.de) * Micah Cowan (micah@cowan.name) * Sadrul Habib Chowdhury (sadrul@users.sourceforge.net) * Copyright (c) 1993-2002, 2003, 2005, 2006, 2007 * Juergen Weigert (jnweiger@immd4.informatik.uni-erlangen.de) * Michael Schroeder (mlschroe@immd4.informatik.uni-erlangen.de) * Copyright (c) 1987 Oliver Laumann * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3, or (at your option) * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program (see the file COPYING); if not, see * https://www.gnu.org/licenses/, or contact Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02111-1301 USA * **************************************************************** */ #include "config.h" #include "socket.h" #include #include #include #include #include #ifdef _OpenBSD_ #include #endif #include #include #include #include #include #include #include #if ENABLE_PAM #include #else #ifdef _PWD_H_ #include #else #include #endif /* PWD_H */ #endif #include "screen.h" #ifdef HAVE_DIRENT_H #include #else #include #define dirent direct #endif #ifndef CMSG_LEN #define CMSG_LEN(length) ((_CMSG_DATA_ALIGN(sizeof(struct cmsghdr))) + (length)) #endif #ifndef CMSG_SPACE #define CMSG_SPACE(length) ((_CMSG_DATA_ALIGN(sizeof(struct cmsghdr))) + (_CMSG_DATA_ALIGN(length))) #endif #include "encoding.h" #include "fileio.h" #include "list_generic.h" #include "misc.h" #include "process.h" #include "resize.h" #include "termcap.h" #include "tty.h" #include "utmp.h" static int CheckPid(pid_t); static int ValidateDetachRequest(Message *); static void ExecCreate(Message *); static void DoCommandMsg(Message *); static void FinishAttach(Message *); static void FinishDetach(Message *); static void AskPassword(Message *); static bool CheckPassword(const char *password); static void PasswordProcessInput(char *, size_t); static void KillUnpriv(pid_t pid, int sig) { UserContext(); UserReturn(kill(pid, sig)); } #define SOCKMODE (S_IWRITE | S_IREAD | (displays ? S_IEXEC : 0) | (multi ? 1 : 0)) /* * Socket directory manager * * fdp: pointer to store the first good socket. * nfoundp: pointer to store the number of sockets found matching. * notherp: pointer to store the number of sockets not matching. * match: string to match socket name. * * The socket directory must be in SocketPath! * The global variables LoginName, multi, rflag, xflag, dflag, * quietflag, SocketPath are used. * * The first good socket is stored in fdp and its name is * appended to SocketPath. * If none exists or fdp is NULL SocketPath is not changed. * * Returns: number of good sockets. * */ int FindSocket(int *fdp, int *nfoundp, int *notherp, char *match) { DIR *dirp; struct dirent *dp; struct stat st; int mode; int sdirlen; int matchlen = 0; char *name, *n; int firsts = -1, sockfd; char *firstn = NULL; int nfound = 0, ngood = 0, ndead = 0, nwipe = 0, npriv = 0; int nperfect = 0; struct sent { struct sent *next; int mode; char *name; } *slist, **slisttail, *sent, *nsent; if (match) { matchlen = strlen(match); if (matchlen > FILENAME_MAX) matchlen = FILENAME_MAX; } /* * SocketPath contains the socket directory. * At the end of FindSocket the socket name will be appended to it. * Thus FindSocket() can only be called once! */ sdirlen = strlen(SocketPath); xseteuid(real_uid); xsetegid(real_gid); if ((dirp = opendir(SocketPath)) == NULL) { if (eff_uid == real_uid) { Panic(errno, "Cannot opendir %s", SocketPath); } else { Panic(0, "Error accessing %s", SocketPath); } } slist = NULL; slisttail = &slist; while ((dp = readdir(dirp))) { int cmatch = 0; name = dp->d_name; if (*name == 0 || *name == '.' || strlen(name) > 2 * MAXSTR) continue; if (matchlen) { n = name; /* if we don't want to match digits. Skip them */ if ((*match <= '0' || *match > '9') && (*n > '0' && *n <= '9')) { while (*n >= '0' && *n <= '9') n++; if (*n == '.') n++; } /* the tty prefix is optional */ if (strncmp(match, "tty", 3) && strncmp(n, "tty", 3) == 0) n += 3; if (strncmp(match, n, matchlen)) { if (n == name && *match > '0' && *match <= '9') { while (*n >= '0' && *n <= '9') n++; if (*n == '.') n++; if (strncmp(match, n, matchlen)) continue; } else continue; } else cmatch = (*(n + matchlen) == 0); } if (sdirlen + 1 + strlen(name) >= sizeof(SocketPath)) continue; /* skip entry — path would be too long */ snprintf(SocketPath + sdirlen, sizeof(SocketPath) - sdirlen, "/%s", name); errno = 0; if (stat(SocketPath, &st)) { continue; } #ifdef SOCKET_DIR /* if SOCKET_DIR is not defined, the socket is in $HOME. in that case it does not make sense to compare uids. */ if (st.st_uid != real_uid) continue; #endif mode = (int)st.st_mode & 0777; if (multi && ((mode & 0677) != 0601)) { if (strcmp(multi, LoginName)) { mode = -4; } else { } } if ((sent = malloc(sizeof(struct sent))) == NULL) continue; sent->next = NULL; sent->name = SaveStr(name); sent->mode = mode; *slisttail = sent; slisttail = &sent->next; nfound++; sockfd = MakeClientSocket(0); /* MakeClientSocket sets ids back to eff */ xseteuid(real_uid); xsetegid(real_gid); if (sockfd == -1) { sent->mode = -3; #ifndef SOCKDIR_IS_LOCAL_TO_HOST /* Unreachable - it is dead if we detect that it's local * or we specified a match */ n = name + strlen(name) - 1; while (n != name && *n != '.') n--; if (matchlen == 0 && !(*n == '.' && n[1] && strncmp(HostName, n + 1, strlen(n + 1)) == 0)) { npriv++; /* a good socket that was not for us */ continue; } #endif ndead++; sent->mode = -1; if (wipeflag) { if (unlink(SocketPath) == 0) { sent->mode = -2; nwipe++; } } continue; } mode &= 0776; /* Shall we connect ? */ /* * mode 600: socket is detached. * mode 700: socket is attached. * xflag implies rflag here. * * fail, when socket mode mode is not 600 or 700 * fail, when we want to detach w/o reattach, but it already is detached. * fail, when we only want to attach, but mode 700 and not xflag. * fail, if none of dflag, rflag, xflag is set. */ if ((mode != 0700 && mode != 0600) || (dflag && !rflag && !xflag && mode == 0600) || (!dflag && rflag && mode == 0700 && !xflag) || (!dflag && !rflag && !xflag)) { close(sockfd); npriv++; /* a good socket that was not for us */ continue; } ngood++; if (cmatch) nperfect++; if (fdp && (firsts == -1 || (cmatch && nperfect == 1))) { if (firsts != -1) close(firsts); firsts = sockfd; firstn = sent->name; } else { close(sockfd); } } (void)closedir(dirp); if (!lsflag && nperfect == 1) ngood = nperfect; if (nfound && (lsflag || ngood != 1) && !quietflag) { switch (ngood) { case 0: Msg(0, nfound > 1 ? "There are screens on:" : "There is a screen on:"); break; case 1: Msg(0, nfound > 1 ? "There are several screens on:" : "There is a suitable screen on:"); break; default: Msg(0, "There are several suitable screens on:"); break; } for (sent = slist; sent; sent = sent->next) { switch (sent->mode) { case 0700: printf("\t%s\t(Attached)\n", sent->name); break; case 0600: printf("\t%s\t(Detached)\n", sent->name); break; case 0701: printf("\t%s\t(Multi, attached)\n", sent->name); break; case 0601: printf("\t%s\t(Multi, detached)\n", sent->name); break; case -1: /* No trigraphs here! */ printf("\t%s\t(Dead ?%c?)\n", sent->name, '?'); break; case -2: printf("\t%s\t(Removed)\n", sent->name); break; case -3: printf("\t%s\t(Remote or dead)\n", sent->name); break; case -4: printf("\t%s\t(Private)\n", sent->name); break; } } } if (ndead && !quietflag) { char *m = "Remove dead screens with 'screen -wipe'."; if (wipeflag) Msg(0, "%d socket%s wiped out.", nwipe, nwipe > 1 ? "s" : ""); else Msg(0, m, ndead > 1 ? "s" : "", ndead > 1 ? "" : "es"); } if (firsts != -1) { sprintf(SocketPath + sdirlen, "/%s", firstn); *fdp = firsts; } else SocketPath[sdirlen] = 0; for (sent = slist; sent; sent = nsent) { nsent = sent->next; free(sent->name); free((char *)sent); } xseteuid(eff_uid); xsetegid(eff_gid); if (notherp) *notherp = npriv; if (nfoundp) *nfoundp = nfound - nwipe; return ngood; } /* ** ** Socket/pipe create routines ** */ int MakeServerSocket(void) { int s; struct sockaddr_un a; struct stat st; if ((s = socket(AF_UNIX, SOCK_STREAM, 0)) == -1) Panic(errno, "socket"); a.sun_family = AF_UNIX; strncpy(a.sun_path, SocketPath, ARRAY_SIZE(a.sun_path)); a.sun_path[ARRAY_SIZE(a.sun_path) - 1] = 0; xseteuid(real_uid); xsetegid(real_gid); if (connect(s, (struct sockaddr *)&a, strlen(SocketPath) + 2) != -1) { if (quietflag) { Kill(D_userpid, SIG_BYE); /* * oh, well. nobody receives that return code. papa * dies by signal. */ eexit(11); } Msg(0, "There is already a screen running on %s.", Filename(SocketPath)); if (stat(SocketPath, &st) == -1) Panic(errno, "stat"); #ifdef SOCKET_DIR /* if SOCKET_DIR is not defined, the socket is in $HOME. in that case it does not make sense to compare uids. */ if (st.st_uid != real_uid) Panic(0, "Unfortunately you are not its owner."); #endif if ((st.st_mode & 0700) == 0600) Panic(0, "To resume it, use \"screen -r\""); else Panic(0, "It is not detached."); /* NOTREACHED */ } (void)unlink(SocketPath); if (bind(s, (struct sockaddr *)&a, strlen(SocketPath) + 2) == -1) Panic(errno, "bind (%s)", SocketPath); chmod(SocketPath, SOCKMODE); if (chown(SocketPath, real_uid, real_gid)) Panic(errno, "chown"); if (listen(s, 5) == -1) Panic(errno, "listen"); #ifdef F_SETOWN fcntl(s, F_SETOWN, getpid()); #endif /* F_SETOWN */ xseteuid(eff_uid); xsetegid(eff_gid); return s; } int MakeClientSocket(int err) { int s; struct sockaddr_un a; if ((s = socket(AF_UNIX, SOCK_STREAM, 0)) == -1) Panic(errno, "socket"); a.sun_family = AF_UNIX; strncpy(a.sun_path, SocketPath, ARRAY_SIZE(a.sun_path)); a.sun_path[ARRAY_SIZE(a.sun_path) - 1] = 0; xseteuid(real_uid); xsetegid(real_gid); if (connect(s, (struct sockaddr *)&a, strlen(SocketPath) + 2) == -1) { if (err) Msg(errno, "%s: connect", SocketPath); close(s); s = -1; } xseteuid(eff_uid); xsetegid(eff_gid); return s; } /* ** ** Message send and receive routines ** */ void SendCreateMsg(char *sty, struct NewWindow *nwin) { int s; Message m; char *p; size_t len, n; char **av; if (strlen(sty) > FILENAME_MAX) sty[FILENAME_MAX] = 0; if (strlen(sty) > 2 * MAXSTR - 1) sty[2 * MAXSTR - 1] = 0; sprintf(SocketPath + strlen(SocketPath), "/%s", sty); if ((s = MakeClientSocket(1)) == -1) exit(1); memset((char *)&m, 0, sizeof(Message)); m.type = MSG_CREATE; strncpy(m.m_tty, attach_tty, ARRAY_SIZE(m.m_tty) - 1); m.m_tty[ARRAY_SIZE(m.m_tty) - 1] = 0; p = m.m.create.line; n = 0; if (nwin->args != nwin_undef.args) for (av = nwin->args; *av && n < MAXARGS - 1; ++av, ++n) { len = strlen(*av) + 1; if (p + len >= m.m.create.line + ARRAY_SIZE(m.m.create.line) - 1) break; strcpy(p, *av); p += len; } if (nwin->aka != nwin_undef.aka && p + strlen(nwin->aka) + 1 < m.m.create.line + ARRAY_SIZE(m.m.create.line)) strcpy(p, nwin->aka); else *p = '\0'; m.m.create.nargs = n; m.m.create.aflag = nwin->aflag; m.m.create.flowflag = nwin->flowflag; m.m.create.lflag = nwin->lflag; m.m.create.Lflag = nwin->Lflag; m.m.create.hheight = nwin->histheight; if (getcwd(m.m.create.dir, ARRAY_SIZE(m.m.create.dir)) == NULL) { Msg(errno, "getcwd"); goto end; } if (nwin->term != nwin_undef.term) strncpy(m.m.create.screenterm, nwin->term, MAXTERMLEN); m.m.create.screenterm[MAXTERMLEN] = '\0'; m.protocol_revision = MSG_REVISION; if (write(s, (char *)&m, sizeof(Message)) != sizeof(Message)) Msg(errno, "write"); end: close(s); } int SendErrorMsg(char *tty, char *buf) { int s; int ret = 0; Message m; strncpy(m.m.message, buf, ARRAY_SIZE(m.m.message) - 1); m.m.message[ARRAY_SIZE(m.m.message) - 1] = 0; s = MakeClientSocket(0); if (s < 0) return -1; m.type = MSG_ERROR; strncpy(m.m_tty, tty, ARRAY_SIZE(m.m_tty) - 1); m.m_tty[ARRAY_SIZE(m.m_tty) - 1] = 0; m.protocol_revision = MSG_REVISION; if (write(s, (char *)&m, sizeof(Message))) ret = -2; close(s); return ret; } static void ExecCreate(Message *mp) { struct NewWindow nwin; char *args[MAXARGS]; int n; char **pp = args, *p = mp->m.create.line; char buf[20]; nwin = nwin_undef; n = mp->m.create.nargs; if (n > MAXARGS - 1) n = MAXARGS - 1; /* ugly hack alert... should be done by the frontend! */ if (n) { int l, num; l = strlen(p); if (IsNumColon(p, buf, ARRAY_SIZE(buf))) { if (*buf) nwin.aka = buf; num = atoi(p); if (num < 0 || num > last_window->w_number) num = 0; nwin.StartAt = num; p += l + 1; n--; } } for (; n > 0; n--) { *pp++ = p; p += strlen(p) + 1; } *pp = NULL; if (*p) nwin.aka = p; if (*args) nwin.args = args; nwin.aflag = mp->m.create.aflag; nwin.flowflag = mp->m.create.flowflag; if (*mp->m.create.dir) nwin.dir = mp->m.create.dir; nwin.lflag = mp->m.create.lflag; nwin.Lflag = mp->m.create.Lflag; nwin.histheight = mp->m.create.hheight; if (*mp->m.create.screenterm) nwin.term = mp->m.create.screenterm; MakeWindow(&nwin); } static int CheckPid(pid_t pid) { if (pid < 2) return -1; if (eff_uid == real_uid) return kill(pid, 0); if (UserContext() > 0) UserReturn(kill(pid, 0)); return UserStatus(); } static int ValidateDetachRequest(Message *m) { pid_t pid; if (m->type != MSG_DETACH && m->type != MSG_POW_DETACH) return -1; pid = m->m.detach.dpid; if (CheckPid(pid)) { Msg(0, "Detach attempt with bad pid(%d)!", pid); return -1; } return 0; } static int CreateTempDisplay(Message *m, int recvfd, Window *win) { pid_t pid; int attach; char *user; int i; struct mode Mode; Display *olddisplays = displays; switch (m->type) { case MSG_CONT: case MSG_ATTACH: pid = m->m.attach.apid; user = m->m.attach.auser; attach = 1; break; case MSG_DETACH: case MSG_POW_DETACH: pid = m->m.detach.dpid; user = m->m.detach.duser; attach = 0; break; default: return -1; } if (CheckPid(pid)) { Msg(0, "Attach attempt with bad pid(%d)!", pid); return -1; } if (recvfd != -1) { char ttyname_in_ns[MAXPATHLEN] = {0}; char *myttyname; i = recvfd; errno = 0; myttyname = GetPtsPathOrSymlink(i); if (myttyname && errno == ENODEV) { ssize_t ret = readlink(myttyname, ttyname_in_ns, ARRAY_SIZE(ttyname_in_ns)); if (ret < 0 || (size_t)ret >= ARRAY_SIZE(ttyname_in_ns)) { Msg(errno, "Could not perform necessary sanity " "checks on pts device."); close(i); KillUnpriv(pid, SIG_BYE); return -1; } if (strcmp(ttyname_in_ns, m->m_tty)) { Msg(errno, "Attach: passed fd does not match " "tty: %s - %s!", ttyname_in_ns, m->m_tty[0] != '\0' ? m->m_tty : "(null)"); close(i); KillUnpriv(pid, SIG_BYE); return -1; } /* m->m_tty so far contains the actual name of the pts * device in its namespace (e.g. /dev/pts/0). This name * however is not valid in the current namespace. So * after we verified that the symlink returned by * GetPtsPathOrSymlink() refers to the same pts device * in this namespace we need to update m->m_tty to use * that symlink for all future operations. */ strncpy(m->m_tty, myttyname, ARRAY_SIZE(m->m_tty) - 1); m->m_tty[ARRAY_SIZE(m->m_tty) - 1] = 0; } else if (myttyname == NULL || strcmp(myttyname, m->m_tty)) { Msg(errno, "Attach: passed fd does not match tty: %s - %s!", m->m_tty, myttyname ? myttyname : "NULL"); close(i); KillUnpriv(pid, SIG_BYE); return -1; } } else if ((i = secopen(m->m_tty, O_RDWR | O_NONBLOCK, 0)) < 0) { Msg(errno, "Attach: Could not open %s!", m->m_tty); KillUnpriv(pid, SIG_BYE); return -1; } if (attach) KillUnpriv(pid, SIGCONT); if (attach) { if (display || win) { int unused_result = write(i, "Attaching from inside of screen?\n", 33); (void)unused_result; /* unused */ close(i); KillUnpriv(pid, SIG_BYE); Msg(0, "Attach msg ignored: coming from inside."); return -1; } if (strcmp(user, LoginName)) if (*FindUserPtr(user) == NULL) { int unused_result = write(i, "Access to session denied.\n", 26); (void)unused_result; /* unused */ close(i); Kill(pid, SIG_BYE); Msg(0, "Attach: access denied for user %s.", user); return -1; } } /* create new display */ GetTTY(i, &Mode); if (MakeDisplay(user, m->m_tty, attach ? m->m.attach.envterm : "", i, pid, &Mode) == NULL) { int unused_result = write(i, "Could not make display.\n", 24); (void)unused_result; /* unused */ close(i); Msg(0, "Attach: could not make display for user %s", user); KillUnpriv(pid, SIG_BYE); return -1; } if (attach) { D_encoding = m->m.attach.encoding == 1 ? UTF8 : m->m.attach.encoding ? m->m.attach.encoding - 1 : 0; if (D_encoding < 0 || !EncodingName(D_encoding)) D_encoding = 0; } if (iflag && olddisplays) { iflag = false; olddisplays->d_NewMode.tio.c_cc[VINTR] = VDISABLE; olddisplays->d_NewMode.tio.c_lflag &= ~ISIG; SetTTY(olddisplays->d_userfd, &olddisplays->d_NewMode); } SetMode(&D_OldMode, &D_NewMode, D_flow, iflag); SetTTY(D_userfd, &D_NewMode); if (fcntl(D_userfd, F_SETFL, FNBLOCK)) Msg(errno, "Warning: NBLOCK fcntl failed"); return 0; } void ReceiveMsg(void) { int left, len; static Message m; char *p; int ns = ServerSocket; Window *win = NULL; int recvfd = -1; struct sockaddr_un a; struct msghdr msg; struct iovec iov; char control[1024]; len = sizeof(a); if ((ns = accept(ns, (struct sockaddr *)&a, (socklen_t *) &len)) < 0) { Msg(errno, "accept"); return; } p = (char *)&m; left = sizeof(Message); memset(&msg, 0, sizeof(struct msghdr)); iov.iov_base = &m; iov.iov_len = left; msg.msg_iov = &iov; msg.msg_iovlen = 1; msg.msg_controllen = ARRAY_SIZE(control); msg.msg_control = &control; while (left > 0) { len = recvmsg(ns, &msg, 0); if (len < 0 && errno == EINTR) continue; if (len < 0) { close(ns); Msg(errno, "read"); return; } if (msg.msg_controllen) { struct cmsghdr *cmsg; for (cmsg = CMSG_FIRSTHDR(&msg); cmsg; cmsg = CMSG_NXTHDR(&msg, cmsg)) { size_t cl; char *cp; if (cmsg->cmsg_level != SOL_SOCKET || cmsg->cmsg_type != SCM_RIGHTS) continue; cp = (char *)CMSG_DATA(cmsg); cl = cmsg->cmsg_len; while (cl >= CMSG_LEN(sizeof(int))) { int passedfd; memmove(&passedfd, cp, sizeof(int)); if (recvfd >= 0 && passedfd != recvfd) close(recvfd); recvfd = passedfd; cl -= CMSG_LEN(sizeof(int)); } } } p += len; left -= len; break; } while (left > 0) { len = read(ns, p, left); if (len < 0 && errno == EINTR) continue; if (len <= 0) break; p += len; left -= len; } close(ns); if (len < 0) { Msg(errno, "read"); if (recvfd != -1) close(recvfd); return; } if (left > 0) { if (left != sizeof(Message)) Msg(0, "Message %d of %d bytes too small", left, (int)sizeof(Message)); return; } if (m.protocol_revision != MSG_REVISION) { if (recvfd != -1) close(recvfd); Msg(0, "Invalid message (magic 0x%08x).", m.protocol_revision); return; } if (m.type != MSG_ATTACH && recvfd != -1) { close(recvfd); recvfd = -1; } for (display = displays; display; display = display->d_next) if (strcmp(D_usertty, m.m_tty) == 0) break; if (!display) { for (win = mru_window; win; win = win->w_prev_mru) if (!strcmp(m.m_tty, win->w_tty)) { /* XXX: hmmm, rework this? */ display = win->w_layer.l_cvlist ? win->w_layer.l_cvlist->c_display : NULL; break; } } /* Remove the status to prevent garbage on the screen */ if (display && D_status) RemoveStatus(); if (display && !D_tcinited && m.type != MSG_HANGUP) { if (recvfd != -1) close(recvfd); return; /* ignore messages for bad displays */ } switch (m.type) { case MSG_WINCH: if (display) CheckScreenSize(1); /* Change fore */ break; case MSG_CREATE: /* * the window that issued the create message need not be an active * window. Then we create the window without having a display. * Resulting in another inactive window. */ ExecCreate(&m); break; case MSG_CONT: if (display && D_userpid != 0 && kill(D_userpid, 0) == 0) break; /* Intruder Alert */ /* FALLTHROUGH */ case MSG_ATTACH: if (CreateTempDisplay(&m, recvfd, win)) break; if (do_auth) AskPassword(&m); else FinishAttach(&m); break; case MSG_ERROR: { int blocked = D_blocked; if (D_blocked == 4) /* allow error messages while in blanker mode */ D_blocked = 0; /* likely they're from failed blanker */ Msg(0, "%s", m.m.message); D_blocked = blocked; } break; case MSG_HANGUP: if (!win) /* ignore hangups from inside */ Hangup(); break; case MSG_DETACH: case MSG_POW_DETACH: if (do_auth) { if (CreateTempDisplay(&m, recvfd, NULL)) break; AskPassword(&m); } else { if (ValidateDetachRequest(&m)) break; FinishDetach(&m); } break; case MSG_QUERY: { char *oldSocketPath = SaveStr(SocketPath); strncpy(SocketPath, m.m.command.writeback, ARRAY_SIZE(SocketPath)); int s = MakeClientSocket(0); strncpy(SocketPath, oldSocketPath, ARRAY_SIZE(SocketPath)); Free(oldSocketPath); if (s >= 0) { queryflag = s; DoCommandMsg(&m); close(s); } else queryflag = -1; if (CheckPid(m.m.command.apid)) { Msg(0, "Query attempt with bad pid(%d)!", m.m.command.apid); } else { KillUnpriv(m.m.command.apid, (queryflag >= 0) ? SIGCONT : SIG_BYE); /* Send SIG_BYE if an error happened */ queryflag = -1; } } break; case MSG_COMMAND: DoCommandMsg(&m); break; default: Msg(0, "Invalid message (type %d).", m.type); } } void ReceiveRaw(int s) { char rd[256]; ssize_t len = 0; struct sockaddr_un a; len = sizeof(a); if ((s = accept(s, (struct sockaddr *)&a, (socklen_t *)&len)) < 0) { Msg(errno, "accept"); return; } while ((len = read(s, rd, 255)) > 0) { rd[len] = 0; printf("%s", rd); } close(s); } /* * Set the mode bits of the socket to the current status */ int chsock(void) { int ret; uid_t euid = geteuid(); if (euid != real_uid) { if (UserContext() <= 0) return UserStatus(); } ret = chmod(SocketPath, SOCKMODE); /* * Sockets usually reside in the /tmp/ area, where sysadmin scripts * may be happy to remove old files. We manually prevent the socket * from becoming old. (chmod does not touch mtime). */ (void)utimes(SocketPath, NULL); if (euid != real_uid) UserReturn(ret); return ret; } /* * Try to recreate the socket/pipe */ int RecoverSocket(void) { close(ServerSocket); if (geteuid() != real_uid) { if (UserContext() > 0) UserReturn(unlink(SocketPath)); (void)UserStatus(); } else (void)unlink(SocketPath); if ((ServerSocket = MakeServerSocket()) < 0) return 0; evdeq(&serv_read); serv_read.fd = ServerSocket; evenq(&serv_read); return 1; } static void FinishAttach(Message *m) { pid_t pid; int noshowwin; pid = D_userpid; if (m->m.attach.detachfirst == MSG_DETACH || m->m.attach.detachfirst == MSG_POW_DETACH) FinishDetach(m); /* * We reboot our Terminal Emulator. Forget all we knew about * the old terminal, reread the termcap entries in .screenrc * (and nothing more from .screenrc is read. Mainly because * I did not check, whether a full reinit is safe. jw) * and /etc/screenrc, and initialise anew. */ if (extra_outcap) free(extra_outcap); if (extra_incap) free(extra_incap); extra_incap = extra_outcap = NULL; StartRc(SYSTEM_SCREENRC, 1); StartRc(RcFileName, 1); if (InitTermcap(m->m.attach.columns, m->m.attach.lines)) { FreeDisplay(); Kill(pid, SIG_BYE); return; } MakeDefaultCanvas(); InitTerm(m->m.attach.adaptflag); /* write init string on fd */ if (displays->d_next == NULL) (void)chsock(); xsignal(SIGHUP, SigHup); if (m->m.attach.esc != -1 && m->m.attach.meta_esc != -1) { D_user->u_Esc = m->m.attach.esc; D_user->u_MetaEsc = m->m.attach.meta_esc; } #ifdef ENABLE_UTMP /* * we set the Utmp slots again, if we were detached normally * and if we were detached by ^Z. * don't log zomies back in! */ RemoveLoginSlot(); if (displays->d_next == NULL) for (Window *win = mru_window; win; win = win->w_prev_mru) if (win->w_ptyfd >= 0 && win->w_slot != (slot_t) - 1) SetUtmp(win); #endif D_fore = NULL; if (layout_attach) { Layout *lay = layout_attach; if (lay == &layout_last_marker) lay = layout_last; if (lay) { LoadLayout(lay); SetCanvasWindow(D_forecv, NULL); } } /* * there may be a window that we remember from last detach: */ if (D_user->u_detachwin >= 0) fore = GetWindowByNumber(D_user->u_detachwin); else fore = NULL; /* Wayne wants us to restore the other window too. */ if (D_user->u_detachotherwin >= 0) D_other = GetWindowByNumber(D_user->u_detachotherwin); noshowwin = 0; if (*m->m.attach.preselect) { if (!strcmp(m->m.attach.preselect, "=")) fore = NULL; else if (!strcmp(m->m.attach.preselect, "-")) { fore = NULL; noshowwin = 1; } else if (!strcmp(m->m.attach.preselect, "+")) { struct action newscreen; char *na = NULL; newscreen.nr = RC_SCREEN; newscreen.args = &na; newscreen.quiet = 0; DoAction(&newscreen); } else fore = FindNiceWindow(fore, m->m.attach.preselect); } else fore = FindNiceWindow(fore, NULL); if (fore) SetForeWindow(fore); else if (!noshowwin) { if (!AclCheckPermCmd(D_user, ACL_EXEC, &comms[RC_WINDOWLIST])) { Display *olddisplay = display; flayer = D_forecv->c_layer; display_windows(1, WLIST_NUM, NULL); noshowwin = 1; display = olddisplay; /* display_windows can change display */ } } Activate(0); ResetIdle(); if (!D_fore && !noshowwin) ShowWindows(NULL, -1); if (displays->d_next == NULL && console_window) { if (TtyGrabConsole(console_window->w_ptyfd, true, "reattach") == 0) Msg(0, "console %s is on window %d", HostName, console_window->w_number); } } static void FinishDetach(Message *m) { Display *next, **d, *det; pid_t pid; if (m->type == MSG_ATTACH) pid = D_userpid; else pid = m->m.detach.dpid; /* Remove the temporary display prompting for the password from the list */ for (d = &displays; (det = *d); d = &det->d_next) { if (det->d_userpid == pid) break; } if (det) { *d = det->d_next; det->d_next = NULL; } for (display = displays; display; display = next) { next = display->d_next; if (m->type == MSG_POW_DETACH) Detach(D_REMOTE_POWER); else if (m->type == MSG_DETACH) Detach(D_REMOTE); else if (m->type == MSG_ATTACH) { if (m->m.attach.detachfirst == MSG_POW_DETACH) Detach(D_REMOTE_POWER); else if (m->m.attach.detachfirst == MSG_DETACH) Detach(D_REMOTE); } } display = displays = det; if (m->type != MSG_ATTACH) { if (display) FreeDisplay(); Kill(pid, SIGCONT); } } struct pwdata { size_t len; char buf[MAXLOGINLEN + 1]; Message m; }; static void AskPassword(Message *m) { struct pwdata *pwdata; char prompt[MAXSTR]; char *gecos_comma; char *realname = NULL; pwdata = calloc(1, sizeof(struct pwdata)); if (!pwdata) Panic(0, "%s", strnomem); pwdata->len = 0; pwdata->m = *m; D_processinputdata = pwdata; D_processinput = PasswordProcessInput; /* if GECOS data is CSV, we only want the text before the first comma */ if ((gecos_comma = strchr(ppp->pw_gecos, ','))) if (!(realname = strndup(ppp->pw_gecos, gecos_comma - ppp->pw_gecos))) gecos_comma = NULL; /* well, it was worth a shot. */ snprintf(prompt, sizeof(prompt), "\ascreen used by %s%s<%s> on %s.\r\nPassword: ", gecos_comma ? realname : ppp->pw_gecos, ppp->pw_gecos[0] ? " " : "", ppp->pw_name, HostName); free(realname); AddStr(prompt); } #if ENABLE_PAM #if defined(_sun) || defined(__sun_) /* Solaris */ # define PAM_MSG_CONST #else /* Linux, BSD, etc. */ # define PAM_MSG_CONST const #endif static int screen_conv(int num_msg, PAM_MSG_CONST struct pam_message **msg, struct pam_response **resp, void *data) { (void)num_msg; /* unused */ (void)msg; /* unused */ *resp = (struct pam_response *)data; return PAM_SUCCESS; } static bool CheckPassword(const char *password) { bool ret = false; struct pam_response *reply; pam_handle_t *pamh = NULL; struct pam_conv pamc; int pam_ret; char *tty_name; reply = (struct pam_response *)malloc(sizeof(struct pam_response)); reply[0].resp = strdup(password); reply[0].resp_retcode = 0; pamc.conv = &screen_conv; pamc.appdata_ptr = (void *)reply; pam_ret= pam_start("screen", ppp->pw_name, &pamc, &pamh); if (pam_ret!= PAM_SUCCESS) { return false; } if (strncmp(attach_tty, "/dev/", 5) == 0) { tty_name = attach_tty + 5; } else { tty_name = attach_tty; } pam_ret = pam_set_item(pamh, PAM_TTY, tty_name); if (pam_ret != PAM_SUCCESS) { return false; } pam_ret = pam_authenticate(pamh, 0); pam_end(pamh, pam_ret); if (pam_ret == PAM_MAXTRIES) { AddStr("\r\nmaximum number of tries exceeded\r\n"); return false; } else if (pam_ret == PAM_ABORT) { AddStr("\r\nabort requested by PAM\r\n"); return false; } else if (pam_ret == PAM_SUCCESS) { ret = true; } return ret; } #else /* ENABLE_PAM */ static bool CheckPassword(const char *password) { bool ret = false; char *passwd = 0; #ifndef _PWD_H struct passwd *p; #else struct spwd *p; #endif gid_t gid = getegid(); uid_t uid = geteuid(); if (seteuid(0) || setegid(0)) Panic(0, "\r\ncan't get root uid/gid\r\n"); #ifndef _PWD_H p = getpwnam_shadow(ppp->pw_name); #else p = getspnam(ppp->pw_name); #endif if (p == NULL) return false; if (seteuid(uid) || setegid(gid)) Panic(0, "\r\ncan't restore uid/gid\r\n"); if (p == NULL) { AddStr("\r\ncan't open passwd file\r\n"); return false; } #ifndef _PWD_H passwd = crypt(password, p->pw_passwd); ret = (strcmp(passwd, p->pw_passwd) == 0); #else passwd = crypt(password, p->sp_pwdp); ret = (strcmp(passwd, p->sp_pwdp) == 0); #endif return ret; } #endif /* ENABLE_PAM */ static void PasswordProcessInput(char *ibuf, size_t ilen) { struct pwdata *pwdata; int c; size_t len; int pid = D_userpid; pwdata = D_processinputdata; len = pwdata->len; while (ilen-- > 0) { c = *(unsigned char *)ibuf++; if (c == '\r' || c == '\n') { pwdata->buf[len] = 0; if (!CheckPassword(pwdata->buf)) { /* uh oh, user failed */ memset(pwdata->buf, 0, sizeof(pwdata->buf)); AddStr("\r\nPassword incorrect.\r\n"); D_processinputdata = NULL; /* otherwise freed by FreeDis */ FreeDisplay(); Msg(0, "Illegal reattach attempt from terminal %s.", pwdata->m.m_tty); free(pwdata); Kill(pid, SIG_BYE); return; } /* great, pw matched, all is fine */ memset(pwdata->buf, 0, sizeof(pwdata->buf)); AddStr("\r\n"); D_processinputdata = NULL; D_processinput = ProcessInput; if (pwdata->m.type == MSG_DETACH || pwdata->m.type == MSG_POW_DETACH) FinishDetach(&pwdata->m); else FinishAttach(&pwdata->m); free(pwdata); return; } if (c == Ctrl('c')) { memset(pwdata->buf, 0, sizeof(pwdata->buf)); AddStr("\r\n"); FreeDisplay(); Kill(pid, SIG_BYE); return; } if (c == '\b' || c == 0177) { if (len > 0) { pwdata->buf[len] = 0; len--; } continue; } if (c == Ctrl('u')) { memset(pwdata->buf, 0, sizeof(pwdata->buf)); len = 0; continue; } if (len < sizeof(pwdata->buf) - 1) pwdata->buf[len++] = c; } pwdata->len = len; } /* 'end' is exclusive, i.e. you should *not* write in *end */ static char *strncpy_escape_quote(char *dst, const char *src, const char *end) { while (*src && dst < end) { if (*src == '"') { if (dst + 2 < end) /* \\ \" \0 */ *dst++ = '\\'; else return NULL; } *dst++ = *src++; } if (dst >= end) return NULL; *dst = '\0'; return dst; } static void DoCommandMsg(Message *mp) { char *args[MAXARGS]; int argl[MAXARGS]; char fullcmd[MAXSTR]; char *fc; int n; char *p = mp->m.command.cmd; struct acluser *user; n = mp->m.command.nargs; if (n > MAXARGS - 1) n = MAXARGS - 1; for (fc = fullcmd; n > 0; n--) { size_t len = strlen(p); *fc++ = '"'; if (!(fc = strncpy_escape_quote(fc, p, fullcmd + ARRAY_SIZE(fullcmd) - 2))) { /* '"' ' ' */ Msg(0, "Remote command too long."); queryflag = -1; return; } p += len + 1; *fc++ = '"'; *fc++ = ' '; } if (fc != fullcmd) *--fc = 0; if (Parse(fullcmd, ARRAY_SIZE(fullcmd), args, argl) <= 0) { queryflag = -1; return; } user = *FindUserPtr(mp->m.attach.auser); if (user == NULL) { Msg(0, "Unknown user %s tried to send a command!", mp->m.attach.auser); queryflag = -1; return; } /*if (user->u_password && *user->u_password) { Msg(0, "User %s has a password, cannot use remote commands (using -Q or -X option).", mp->m.attach.auser); queryflag = -1; return; }*/ if (!display) for (display = displays; display; display = display->d_next) if (D_user == user) break; for (fore = mru_window; fore; fore = fore->w_prev_mru) if (!strcmp(mp->m_tty, fore->w_tty)) { if (!display) display = fore->w_layer.l_cvlist ? fore->w_layer.l_cvlist->c_display : NULL; /* If the window is not visibile in any display, then do not use the originating window as * the foreground window for the command. This way, if there is an existing display, then * the command will execute from the foreground window of that display. This is necessary so * that commands that are relative to the window (e.g. 'next' etc.) do the right thing. */ if (!fore->w_layer.l_cvlist || !fore->w_layer.l_cvlist->c_display) fore = NULL; break; } if (!display) display = displays; /* sigh */ if (*mp->m.command.preselect) { int i = -1; if (strcmp(mp->m.command.preselect, "-")) { i = WindowByNoN(mp->m.command.preselect); if (i < 0 || !GetWindowByNumber(i)) { Msg(0, "Could not find pre-select window."); queryflag = -1; return; } } fore = i >= 0 ? GetWindowByNumber(i) : NULL; } else if (!fore) { if (display && D_user == user) fore = Layer2Window(display->d_forecv->c_layer); if (!fore) { fore = user->u_detachwin >= 0 ? GetWindowByNumber(user->u_detachwin) : NULL; fore = FindNiceWindow(fore, NULL); } } if (!fore) fore = mru_window; /* sigh */ EffectiveAclUser = user; if (*args) { char *oldrcname = rc_name; rc_name = "-X"; flayer = fore ? &fore->w_layer : NULL; if (fore && fore->w_savelayer && (fore->w_blocked || fore->w_savelayer->l_cvlist == NULL)) flayer = fore->w_savelayer; DoCommand(args, argl); rc_name = oldrcname; } EffectiveAclUser = NULL; } int SendAttachMsg(int s, Message *m, int fd) { struct msghdr msg; struct iovec iov; char buf[CMSG_SPACE(sizeof(int))]; struct cmsghdr *cmsg; iov.iov_base = (char *)m; iov.iov_len = sizeof(Message); memset(&msg, 0, sizeof(struct msghdr)); msg.msg_name = NULL; msg.msg_namelen = 0; msg.msg_iov = &iov; msg.msg_iovlen = 1; msg.msg_control = buf; msg.msg_controllen = ARRAY_SIZE(buf); cmsg = CMSG_FIRSTHDR(&msg); cmsg->cmsg_level = SOL_SOCKET; cmsg->cmsg_type = SCM_RIGHTS; cmsg->cmsg_len = CMSG_LEN(sizeof(int)); memmove(CMSG_DATA(cmsg), &fd, sizeof(int)); msg.msg_controllen = cmsg->cmsg_len; while (1) { int ret = sendmsg(s, &msg, 0); if (ret == -1 && errno == EINTR) continue; if (ret == -1) return -1; return 0; } } screen-5.0.2/search.h0000664000175000017500000000027615224432722013071 0ustar alexalex#ifndef SCREEN_SEARCH_H #define SCREEN_SEARCH_H #include void Search (int); void ISearch (int); /* global variables */ extern bool search_ic; #endif /* SCREEN_SEARCH_H */ screen-5.0.2/search.c0000664000175000017500000002261615224432722013066 0ustar alexalex/* Copyright (c) 2008, 2009 * Juergen Weigert (jnweiger@immd4.informatik.uni-erlangen.de) * Michael Schroeder (mlschroe@immd4.informatik.uni-erlangen.de) * Micah Cowan (micah@cowan.name) * Sadrul Habib Chowdhury (sadrul@users.sourceforge.net) * Copyright (c) 1993-2002, 2003, 2005, 2006, 2007 * Juergen Weigert (jnweiger@immd4.informatik.uni-erlangen.de) * Michael Schroeder (mlschroe@immd4.informatik.uni-erlangen.de) * Copyright (c) 1987 Oliver Laumann * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3, or (at your option) * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program (see the file COPYING); if not, see * https://www.gnu.org/licenses/, or contact Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02111-1301 USA * **************************************************************** */ #include "config.h" #include "search.h" #include #include #include "mark.h" #include "misc.h" #include "input.h" #define INPUTLINE (flayer->l_height - 1) bool search_ic; /******************************************************************** * VI style Search */ static int matchword(char *, int, int, int); static void searchend(char *, size_t, void *); static void backsearchend(char *, size_t, void *); void Search(int dir) { struct markdata *markdata; if (dir == 0) { markdata = (struct markdata *)flayer->l_data; if (markdata->isdir > 0) searchend(NULL, 0, NULL); else if (markdata->isdir < 0) backsearchend(NULL, 0, NULL); else LMsg(0, "No previous pattern"); } else Input((dir > 0 ? "/" : "?"), ARRAY_SIZE(markdata->isstr) - 1, INP_COOKED, (dir > 0 ? searchend : backsearchend), NULL, 0); } static void searchend(char *buf, size_t len, void *data) { int x = 0, sx, ex, y; struct markdata *markdata; Window *p; (void)data; /* unused */ markdata = (struct markdata *)flayer->l_data; p = markdata->md_window; markdata->isdir = 1; if (len) strcpy(markdata->isstr, buf); sx = markdata->cx + 1; ex = flayer->l_width - 1; for (y = markdata->cy; y < p->w_histheight + flayer->l_height; y++, sx = 0) { if ((x = matchword(markdata->isstr, y, sx, ex)) >= 0) break; } if (y >= p->w_histheight + flayer->l_height) { LGotoPos(flayer, markdata->cx, W2D(markdata->cy)); LMsg(0, "Pattern not found"); } else revto(x, y); } static void backsearchend(char *buf, size_t len, void *data) { int sx, ex, x = -1, y; struct markdata *markdata; (void)data; /* unused */ markdata = (struct markdata *)flayer->l_data; markdata->isdir = -1; if (len) strcpy(markdata->isstr, buf); ex = markdata->cx - 1; for (y = markdata->cy; y >= 0; y--, ex = flayer->l_width - 1) { sx = 0; while ((sx = matchword(markdata->isstr, y, sx, ex)) >= 0) x = sx++; if (x >= 0) break; } if (y < 0) { LGotoPos(flayer, markdata->cx, W2D(markdata->cy)); LMsg(0, "Pattern not found"); } else revto(x, y); } /* * Search for a string that matches pattern. The first character of the * match must be on line y, between columns sx and ex (inclusive), but * the rest of the match can extend beyond column ex and even onto the * following line. Returns the starting column of the first match found, * or -1 if there's no match. */ static int matchword(char *pattern, int y, int sx, int ex) { uint32_t *cp, *cpe; unsigned char *pp; int cy; fore = ((struct markdata *)flayer->l_data)->md_window; for (; sx <= ex; sx++) { cy = y; cp = WIN(cy)->image + sx; cpe = WIN(cy)->image + flayer->l_width; pp = (unsigned char *)pattern; for (;;) { if ((char)*cp != *pp) if (!search_ic || ((*cp ^ *pp) & 0xdf) || (*cp | 0x20) < 'a' || (*cp | 0x20) > 'z') break; cp++; pp++; if (*pp == 0) return sx; if (cp == cpe) { /* * We have a partial match, but we've hit * the end of this line. Does it wrap onto * the following line? If not, we're done. */ if (*cp == ' ' || cy >= fore->w_histheight + flayer->l_height - 1) break; /* * This line does wrap, so look on the next * line for the rest of our match. */ cy++; cp = WIN(cy)->image; cpe = WIN(cy)->image + flayer->l_width; } } } return -1; } /******************************************************************** * Emacs style ISearch */ static char *isprompts[] = { "I-search backward: ", "failing I-search backward: ", "I-search: ", "failing I-search: " }; static int is_redo(struct markdata *); static void is_process(char *, size_t, void *); static int is_bm(char *, int, int, int, int); static int is_bm(char *str, int l, int p, int end, int dir) { int tab[256]; int i, q; unsigned char *s, c; int w = flayer->l_width; /* *sigh* to make WIN work */ fore = ((struct markdata *)flayer->l_next->l_data)->md_window; if (p < 0 || p + l > end) return -1; if (l == 0) return p; if (dir < 0) str += l - 1; for (i = 0; i < 256; i++) tab[i] = l * dir; for (i = 0; i < l - 1; i++, str += dir) { q = *(unsigned char *)str; tab[q] = (l - 1 - i) * dir; if (search_ic && (q | 0x20) >= 'a' && ((q | 0x20) <= 'z')) tab[q ^ 0x20] = (l - 1 - i) * dir; } if (dir > 0) p += l - 1; while (p >= 0 && p < end) { q = p; s = (unsigned char *)str; for (i = 0;;) { c = (WIN(q / w))->image[q % w]; if (i == 0) p += tab[(int)(unsigned char)c]; if (c != *s) if (!search_ic || ((c ^ *s) & 0xdf) || (c | 0x20) < 'a' || (c | 0x20) > 'z') break; q -= dir; s -= dir; if (++i == l) return q + (dir > 0 ? 1 : -l); } } return -1; } static void is_process(char *p, size_t len, void *data) { /* i-search */ int pos, x, y, dir; struct markdata *markdata; (void)data; /* unused */ if (len == 0) return; markdata = (struct markdata *)flayer->l_next->l_data; pos = markdata->cx + markdata->cy * flayer->l_width; LGotoPos(flayer, markdata->cx, W2D(markdata->cy)); switch (*p) { case '\007': /* CTRL-G */ pos = markdata->isstartpos; /*FALLTHROUGH*/ case '\033': /* ESC */ *p = 0; break; case '\013': /* CTRL-K */ case '\027': /* CTRL-W */ markdata->isistrl = 1; /*FALLTHROUGH*/ case '\b': case '\177': if (markdata->isistrl == 0) return; markdata->isistrl--; pos = is_redo(markdata); *p = '\b'; break; case '\023': /* CTRL-S */ case '\022': /* CTRL-R */ if (markdata->isistrl >= (int)ARRAY_SIZE(markdata->isistr)) return; dir = (*p == '\023') ? 1 : -1; pos += dir; if (markdata->isdir == dir && markdata->isistrl == 0) { strcpy(markdata->isistr, markdata->isstr); markdata->isistrl = markdata->isstrl = strlen(markdata->isstr); break; } markdata->isdir = dir; markdata->isistr[markdata->isistrl++] = *p; break; default: if (*p < ' ' || markdata->isistrl >= (int)ARRAY_SIZE(markdata->isistr) || markdata->isstrl >= (int)ARRAY_SIZE(markdata->isstr) - 1) return; markdata->isstr[markdata->isstrl++] = *p; markdata->isistr[markdata->isistrl++] = *p; markdata->isstr[markdata->isstrl] = 0; } if (*p && *p != '\b') pos = is_bm(markdata->isstr, markdata->isstrl, pos, flayer->l_width * (markdata->md_window->w_histheight + flayer->l_height), markdata->isdir); if (pos >= 0) { x = pos % flayer->l_width; y = pos / flayer->l_width; LAY_CALL_UP (LayRedisplayLine(INPUTLINE, 0, flayer->l_width - 1, 0); revto(x, y); if (W2D(markdata->cy) == INPUTLINE) revto_line(markdata->cx, markdata->cy, INPUTLINE > 0 ? INPUTLINE - 1 : 1);) ; } if (*p) inp_setprompt(isprompts[markdata->isdir + (pos < 0) + 1], markdata->isstrl ? markdata->isstr : ""); flayer->l_x = markdata->cx; flayer->l_y = W2D(markdata->cy); LGotoPos(flayer, flayer->l_x, flayer->l_y); if (!*p) { /* we are about to finish, keep cursor position */ flayer->l_next->l_x = markdata->cx; flayer->l_next->l_y = W2D(markdata->cy); } } static int is_redo(struct markdata *markdata) { int i, pos, npos, dir; char c; npos = pos = markdata->isstartpos; dir = markdata->isstartdir; markdata->isstrl = 0; for (i = 0; i < markdata->isistrl; i++) { c = markdata->isistr[i]; if (c == '\022') /* ^R */ pos += (dir = -1); else if (c == '\023') /* ^S */ pos += (dir = 1); else markdata->isstr[markdata->isstrl++] = c; if (pos >= 0) { npos = is_bm(markdata->isstr, markdata->isstrl, pos, flayer->l_width * (markdata->md_window->w_histheight + flayer->l_height), dir); if (npos >= 0) pos = npos; } } markdata->isstr[markdata->isstrl] = 0; markdata->isdir = dir; return npos; } void ISearch(int dir) { struct markdata *markdata; markdata = (struct markdata *)flayer->l_data; markdata->isdir = markdata->isstartdir = dir; markdata->isstartpos = markdata->cx + markdata->cy * flayer->l_width; markdata->isistrl = markdata->isstrl = 0; if (W2D(markdata->cy) == INPUTLINE) revto_line(markdata->cx, markdata->cy, INPUTLINE > 0 ? INPUTLINE - 1 : 1); Input(isprompts[dir + 1], ARRAY_SIZE(markdata->isstr) - 1, INP_RAW, is_process, NULL, 0); LGotoPos(flayer, markdata->cx, W2D(markdata->cy)); flayer->l_x = markdata->cx; flayer->l_y = W2D(markdata->cy); } screen-5.0.2/screen.h0000664000175000017500000002141215224432722013076 0ustar alexalex/* Copyright (c) 2008, 2009 * Juergen Weigert (jnweiger@immd4.informatik.uni-erlangen.de) * Michael Schroeder (mlschroe@immd4.informatik.uni-erlangen.de) * Micah Cowan (micah@cowan.name) * Sadrul Habib Chowdhury (sadrul@users.sourceforge.net) * Copyright (c) 1993-2002, 2003, 2005, 2006, 2007 * Juergen Weigert (jnweiger@immd4.informatik.uni-erlangen.de) * Michael Schroeder (mlschroe@immd4.informatik.uni-erlangen.de) * Copyright (c) 1987 Oliver Laumann * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3, or (at your option) * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program (see the file COPYING); if not, see * https://www.gnu.org/licenses/, or contact Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02111-1301 USA * **************************************************************** * $Id$ GNU */ #ifndef SCREEN_SCREEN_H #define SCREEN_SCREEN_H #include "config.h" #include #include "os.h" /* here comes my own Free: jw. */ #define Free(a) {if ((a) == NULL) abort(); else free((void *)(a)); (a)=NULL;} #define Ctrl(c) ((c)&037) #define MAXSTR 768 #define MAXARGS 64 #define MSGWAIT 5 #define MSGMINWAIT 1 #define SILENCEWAIT 30 /* * if a nasty user really wants to try a history of 3000 lines on all 10 * windows, he will allocate 8 MegaBytes of memory, which is quite enough. */ #define MAXHISTHEIGHT 3000 #define DEFAULTHISTHEIGHT 100 #define DEFAULT_BUFFERFILE "/tmp/screen-exchange" struct mode { struct termios tio; #if defined(TIOCKSET) struct jtchars m_jtchars; int m_knjmode; #endif }; #include "ansi.h" #include "image.h" #include "layer.h" #include "sched.h" #include "term.h" #include "window.h" /* * Parameters for the Detach() routine */ #define D_DETACH 0 #define D_STOP 1 #define D_REMOTE 2 #define D_POWER 3 #define D_REMOTE_POWER 4 #define D_LOCK 5 #define D_HANGUP 6 /* * Here are the messages the attacher sends to the backend */ #define MSG_CREATE 0 #define MSG_ERROR 1 #define MSG_ATTACH 2 #define MSG_CONT 3 #define MSG_DETACH 4 #define MSG_POW_DETACH 5 #define MSG_WINCH 6 #define MSG_HANGUP 7 #define MSG_COMMAND 8 #define MSG_QUERY 9 /* * versions of struct Message: * 0: screen version 3.6.6 (version count introduced) * 1: screen version 4.1.0devel (revisions e3fc19a upto 8147d08) * A few revisions after 8147d08 incorrectly * carried version 1, but should have carried 2. * 2: screen version 4.1.0devel (revisions 8b46d8a upto YYYYYYY) * 3: screen version 4.2.0 (was incorrectly originally. Patched here) * 4: screen version 4.2.1 (bumped once again due to changed terminal and login length) */ #define MSG_VERSION 4 #define MSG_REVISION (('m'<<24) | ('s'<<16) | ('g'<<8) | MSG_VERSION) typedef struct Message Message; struct Message { int protocol_revision; /* reduce harm done by incompatible messages */ int type; char m_tty[MAXPATHLEN]; /* ttyname */ union { struct { int lflag; int Lflag; bool aflag; int flowflag; int hheight; /* size of scrollback buffer */ int nargs; char line[MAXPATHLEN]; char dir[MAXPATHLEN]; char screenterm[MAXTERMLEN + 1];/* is screen really "screen" ? */ } create; struct { char auser[MAXLOGINLEN + 1]; /* username */ pid_t apid; /* pid of frontend */ int adaptflag; /* adapt window size? */ int lines, columns; /* display size */ char preselect[20]; int esc; /* his new escape character unless -1 */ int meta_esc; /* his new meta esc character unless -1 */ char envterm[MAXTERMLEN + 1]; /* terminal type */ int encoding; /* encoding of display */ int detachfirst; /* whether to detach remote sessions first */ } attach; struct { char duser[MAXLOGINLEN + 1]; /* username */ pid_t dpid; /* pid of frontend */ } detach; struct { char auser[MAXLOGINLEN + 1]; /* username */ int nargs; char cmd[MAXPATHLEN + 1]; /* command */ pid_t apid; /* pid of frontend */ char preselect[20]; char writeback[MAXPATHLEN]; /* The socket to write the result. Only used for MSG_QUERY */ } command; char message[MAXPATHLEN * 2]; } m; }; /* * And the signals the attacher receives from the backend */ #define SIG_BYE SIGHUP #define SIG_POWER_BYE SIGUSR1 #define SIG_LOCK SIGUSR2 #define SIG_STOP SIGTSTP #define BELL (Ctrl('g')) #define VBELLWAIT 1 /* No. of seconds a vbell will be displayed */ #define BELL_ON 0 /* No bell has occurred in the window */ #define BELL_FOUND 1 /* A bell has occurred, but user not yet notified */ #define BELL_DONE 2 /* A bell has occured, user has been notified */ #define BELL_VISUAL 3 /* A bell has occured in fore win, notify him visually */ #define MON_OFF 0 /* Monitoring is off in the window */ #define MON_ON 1 /* No activity has occurred in the window */ #define MON_FOUND 2 /* Activity has occured, but user not yet notified */ #define MON_DONE 3 /* Activity has occured, user has been notified */ #define DUMP_TERMCAP 0 /* WriteFile() options */ #define DUMP_HARDCOPY 1 #define DUMP_EXCHANGE 2 #define DUMP_SCROLLBACK 3 #define SILENCE_OFF 0 /* Not checking for silence */ #define SILENCE_ON 1 /* Window being monitored for silence */ #define SILENCE_FOUND 2 /* Window is silent */ #define SILENCE_DONE 3 /* Window is silent and user is notified */ /* * line modes used by Input() */ #define INP_COOKED 0 #define INP_NOECHO 1 #define INP_RAW 2 #define INP_EVERY 4 struct acl { struct acl *next; char *name; }; /* register list */ #define MAX_PLOP_DEFS 256 struct baud_values { int bps; /* bits per seconds */ int sym; /* symbol defined in bits/termios.h */ }; /* * windowlist orders */ #define WLIST_NUM 0 #define WLIST_MRU 1 #define WLIST_NESTED 2 void SigHup (int); void eexit (int) __attribute__((__noreturn__)); void Detach (int); void Hangup (void); void Kill (pid_t, int); void Msg (int, const char *, ...) __attribute__((format(printf, 2, 3))); void Panic (int, const char *, ...) __attribute__((format(printf, 2, 3))) __attribute__((__noreturn__)); void QueryMsg (int, const char *, ...) __attribute__((format(printf, 2, 3))); void Dummy (int, const char *, ...) __attribute__((format(printf, 2, 3))); void Finit (int) __attribute__((__noreturn__)); void MakeNewEnv (void); void PutWinMsg (char *, int, int); void setbacktick (int, int, int, char **); /* global variables */ /* Content of the tty symlink when attach_tty_is_in_new_ns == true. */ extern char attach_tty_name_in_ns[]; extern char strnomem[]; extern char HostName[]; extern char SocketPath[MAXPATHLEN + 2]; extern char *attach_tty; extern char *attach_term; extern char *captionstring; extern char *hardcopydir; extern char *home; extern char *hstatusstring; extern char *logtstamp_string; extern char *multi; extern char *preselect; extern char *screenencodings; extern char *screenlogfile; extern char *wliststr; extern char *wlisttit; extern char *ActivityString; extern char *BellString; extern char *BufferFile; extern char *LoginName; extern char *PowDetachString; extern char *RcFileName; extern char *ShellArgs[]; extern char *ShellProg; extern char *SocketMatch; extern char *SocketName; extern char *VisualBellString; extern char **NewEnv; extern bool adaptflag; extern bool auto_detach; extern bool cjkwidth; extern bool default_startup; extern bool do_auth; extern bool hastruecolor; extern bool iflag; extern bool logtstamp_on; extern bool lsflag; extern bool quietflag; extern bool wipeflag; extern bool xflag; /* Indicator whether the current tty exists in another namespace. */ extern bool attach_tty_is_in_new_ns; extern int af; extern int attach_fd; extern int dflag; extern int force_vt; extern int log_flush; extern int logtstamp_after; extern uid_t multi_uid; extern int multiattach; extern int nversion; extern uid_t own_uid; extern int queryflag; extern int rflag; extern pid_t MasterPid; extern int MsgMinWait; extern int MsgWait; extern int ServerSocket; extern int SilenceWait; extern int VBellWait; extern int ZombieKey_destroy; extern int ZombieKey_onerror; extern int ZombieKey_resurrect; extern Window *console_window; extern Window *fore; extern Window *mru_window; extern Window *first_window; extern Window *last_window; extern Layer *flayer; extern Event logflushev; extern Event serv_read; extern struct mode attach_Mode; extern gid_t eff_gid; extern gid_t real_gid; extern uid_t eff_uid; extern uid_t real_uid; extern struct passwd *ppp; #endif /* SCREEN_SCREEN_H */ screen-5.0.2/screen.c0000664000175000017500000014326615224432722013105 0ustar alexalex/* Copyright (c) 2010 * Juergen Weigert (jnweiger@immd4.informatik.uni-erlangen.de) * Sadrul Habib Chowdhury (sadrul@users.sourceforge.net) * Copyright (c) 2008, 2009 * Juergen Weigert (jnweiger@immd4.informatik.uni-erlangen.de) * Michael Schroeder (mlschroe@immd4.informatik.uni-erlangen.de) * Micah Cowan (micah@cowan.name) * Sadrul Habib Chowdhury (sadrul@users.sourceforge.net) * Copyright (c) 1993-2002, 2003, 2005, 2006, 2007 * Juergen Weigert (jnweiger@immd4.informatik.uni-erlangen.de) * Michael Schroeder (mlschroe@immd4.informatik.uni-erlangen.de) * Copyright (c) 1987 Oliver Laumann * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3, or (at your option) * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program (see the file COPYING); if not, see * https://www.gnu.org/licenses/, or contact Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02111-1301 USA * **************************************************************** */ #include "config.h" #include "screen.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #if defined(HAVE_LANGINFO_H) #include #endif #include "logfile.h" /* islogfile, logfflush, logfopen/logfclose */ #include "fileio.h" #include "list_generic.h" #include "mark.h" #include "utmp.h" #include "winmsg.h" extern char **environ; int force_vt = 1; int VBellWait; int MsgWait; int MsgMinWait; int SilenceWait; char *ShellProg; char *ShellArgs[2]; struct backtick; static struct passwd *getpwbyname(char *, struct passwd *); static void SigChldHandler(void); static void SigChld(int); static void SigInt(int); static void CoreDump(int); static void FinitHandler(int); static void DoWait(void); static void serv_read_fn(Event *, void *); static void serv_select_fn(Event *, void *); static void logflush_fn(Event *, void *); static int IsSymbol(char *, char *); static char *ParseChar(char *, char *); static int ParseEscape(char *); static void SetTtyname(bool fatal, struct stat *st); int nversion; /* numerical version, used for secondary DA */ /* the attacher */ bool do_auth = false; struct passwd *ppp; char *attach_tty; int attach_fd = -1; char *attach_term; char *LoginName; struct mode attach_Mode; /* Indicator whether the current tty exists in another namespace. */ bool attach_tty_is_in_new_ns = false; /* Content of the tty symlink when attach_tty_is_in_new_ns == true. */ char attach_tty_name_in_ns[MAXPATHLEN]; char SocketPath[MAXPATHLEN + 2]; char *SocketName; /* SocketName is pointer in SocketPath */ char *SocketMatch = NULL; /* session id command line argument */ int ServerSocket = -1; Event serv_read; Event serv_select; Event logflushev; char **NewEnv = NULL; char *RcFileName = NULL; char *home; char *screenlogfile; /* filename layout */ int log_flush = 10; /* flush interval in seconds */ bool logtstamp_on = false; /* tstamp disabled */ char *logtstamp_string; /* stamp layout */ int logtstamp_after = 120; /* first tstamp after 120s */ char *hardcopydir = NULL; char *BellString; char *VisualBellString; char *ActivityString; char *BufferFile; char *PowDetachString; char *hstatusstring; char *captionstring; char *wliststr; char *wlisttit; bool auto_detach = true; bool adaptflag; bool iflag; bool lsflag; bool quietflag; bool wipeflag; bool xflag; int rflag; int dflag; int queryflag = -1; bool hastruecolor = false; char *multi; int multiattach; char HostName[MAXSTR]; pid_t MasterPid; pid_t PanicPid; uid_t real_uid; uid_t eff_uid; uid_t multi_uid; uid_t own_uid; gid_t real_gid; gid_t eff_gid; bool default_startup; int ZombieKey_destroy; int ZombieKey_resurrect; int ZombieKey_onerror; char *preselect = NULL; /* only used in Attach() */ char *screenencodings; bool cjkwidth; Layer *flayer; Window *fore; Window *mru_window; Window *first_window; Window *last_window; Window *console_window; #ifdef ENABLE_TELNET int af; #endif /* * Do this last */ #include "attacher.h" #include "encoding.h" #include "help.h" #include "misc.h" #include "process.h" #include "socket.h" #include "termcap.h" #include "tty.h" char strnomem[] = "Out of memory."; static int InterruptPlease; static int GotSigChld; /********************************************************************/ /********************************************************************/ /********************************************************************/ static int lf_secreopen(char *name, int wantfd, struct Log *l) { int got_fd; close(wantfd); if (((got_fd = secopen(name, O_WRONLY | O_CREAT | O_APPEND, 0666)) < 0) || lf_move_fd(got_fd, wantfd) < 0) { logfclose(l); return -1; } l->st->st_ino = l->st->st_dev = 0; return 0; } static struct passwd *getpwbyname(char *name, struct passwd *ppp) { int n; if (!ppp && !(ppp = getpwnam(name))) return NULL; /* Do password sanity check..., allow ##user for SUN_C2 security */ n = 0; if (ppp->pw_passwd[0] == '#' && ppp->pw_passwd[1] == '#' && strcmp(ppp->pw_passwd + 2, ppp->pw_name) == 0) n = 13; for (; n < 13; n++) { char c = ppp->pw_passwd[n]; if (!(c == '.' || c == '/' || c == '$' || (c >= '0' && c <= '9') || (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z'))) break; } if (n < 13) ppp->pw_passwd = NULL; if (ppp->pw_passwd && strlen(ppp->pw_passwd) == 13 + 11) ppp->pw_passwd[13] = 0; /* beware of linux's long passwords */ return ppp; } static char *locale_name(void) { static char *s; s = getenv("LC_ALL"); if (s == NULL) s = getenv("LC_CTYPE"); if (s == NULL) s = getenv("LANG"); if (s == NULL) s = "C"; return s; } static void exit_with_usage(char *myname, char *message, char *arg) { printf("Use: %s [-opts] [cmd [args]]\n", myname); printf(" or: %s -r [host.tty]\n\nOptions:\n", myname); #ifdef ENABLE_TELNET printf("-4 Resolve hostnames only to IPv4 addresses.\n"); printf("-6 Resolve hostnames only to IPv6 addresses.\n"); #endif printf("-a Force all capabilities into each window's termcap.\n"); printf("-A -[r|R] Adapt all windows to the new display width & height.\n"); printf("-c file Read configuration file instead of '.screenrc'.\n"); printf("-d (-r) Detach the elsewhere running screen (and reattach here).\n"); printf("-dmS name Start as daemon: Screen session in detached mode.\n"); printf("-D (-r) Detach and logout remote (and reattach here).\n"); printf("-D -RR Do whatever is needed to get a screen session.\n"); printf("-e xy Change command characters.\n"); printf("-f Flow control on, -fn = off, -fa = auto.\n"); printf("-h lines Set the size of the scrollback history buffer.\n"); printf("-i Interrupt output sooner when flow control is on.\n"); #if defined(ENABLE_UTMP) printf("-l Login mode on (update %s), -ln = off.\n", UTMPXFILE); #endif printf("-ls [match] or\n"); printf("-list Do nothing, just list our SocketDir [on possible matches].\n"); printf("-L Turn on output logging.\n"); printf("-Logfile file Set logfile name.\n"); printf("-m ignore $STY variable, do create a new screen session.\n"); printf("-O Choose optimal output rather than exact vt100 emulation.\n"); printf("-p window Preselect the named window if it exists.\n"); printf("-P Tell screen to enable authentication.\n"); printf("-q Quiet startup. Exits with non-zero return code if unsuccessful.\n"); printf("-Q Commands will send the response to the stdout of the querying process.\n"); printf("-r [session] Reattach to a detached screen process.\n"); printf("-R Reattach if possible, otherwise start a new session.\n"); printf("-s shell Shell to execute rather than $SHELL.\n"); printf("-S sockname Name this session .sockname instead of ...\n"); printf("-t title Set title. (window's name).\n"); printf("-T term Use term as $TERM for windows, rather than \"screen\".\n"); printf("-U Tell screen to use UTF-8 encoding.\n"); printf("-v Print \"Screen version %s\".\n", version); printf("-wipe [match] Do nothing, just clean up SocketDir [on possible matches].\n"); printf("-x Attach to a not detached screen. (Multi display mode).\n"); printf("-X Execute as a screen command in the specified session.\n"); if (message && *message) { printf("\nError: "); printf(message, arg); printf("\n"); exit(1); } exit(0); } int main(int argc, char **argv) { int n; char *ap; char *av0; char socknamebuf[FILENAME_MAX + 1]; int mflag = 0; char *myname = (argc == 0) ? "screen" : argv[0]; char *SocketDir; struct stat st; mode_t oumask; struct NewWindow nwin; bool detached = false; /* start up detached */ char *sockp; char *sty = NULL; char *multi_home = NULL; bool cmdflag = 0; /* * First, close all unused descriptors * (otherwise, we might have problems with the select() call) */ closeallfiles(0); snprintf(version, 59, "%d.%d.%d (build on %s) ", VERSION_MAJOR, VERSION_MINOR, VERSION_REVISION, BUILD_DATE); nversion = VERSION_MAJOR * 10000 + VERSION_MINOR * 100 + VERSION_REVISION; BellString = SaveStr("Bell in window %n"); VisualBellString = SaveStr(" Wuff, Wuff!! "); ActivityString = SaveStr("Activity in window %n"); screenlogfile = SaveStr("screenlog.%n"); logtstamp_string = SaveStr("-- %n:%t -- time-stamp -- %M/%d/%y %c:%s --\n"); hstatusstring = SaveStr("%h"); captionstring = SaveStr("%4n %t"); wlisttit = SaveStr(" Num Name%=Flags"); wliststr = SaveStr("%4n %t%=%f"); BufferFile = SaveStr(DEFAULT_BUFFERFILE); ShellProg = NULL; PowDetachString = NULL; default_startup = (argc > 1) ? false : true; adaptflag = false; VBellWait = VBELLWAIT * 1000; MsgWait = MSGWAIT * 1000; MsgMinWait = MSGMINWAIT * 1000; SilenceWait = SILENCEWAIT; zmodem_sendcmd = SaveStr("!!! sz -vv -b "); zmodem_recvcmd = SaveStr("!!! rz -vv -b -E"); CompileKeys(NULL, 0, mark_key_tab); InitBuiltinTabs(); screenencodings = SaveStr(SCREENENCODINGS); cjkwidth = 0; nwin = nwin_undef; nwin_options = nwin_undef; strncpy(screenterm, "screen", MAXTERMLEN); screenterm[MAXTERMLEN] = '\0'; #ifdef ENABLE_TELNET af = AF_UNSPEC; #endif /* lf_secreopen() is vital for the secure operation in setuid-root context. * Do not remove it */ logreopen_register(lf_secreopen); real_uid = getuid(); real_gid = getgid(); eff_uid = geteuid(); eff_gid = getegid(); av0 = *argv; /* if this is a login screen, assume -RR */ if (*av0 == '-') { rflag = 4; xflag = true; ShellProg = SaveStr(DefaultShell); /* to prevent nasty circles */ } while (argc > 0) { ap = *++argv; if (--argc > 0 && *ap == '-') { if (ap[1] == '-' && ap[2] == 0) { argv++; argc--; break; } if (ap[1] == '-' && !strncmp(ap, "--version", 9)) { printf("Screen version %s\n", version); exit(0); } if (ap[1] == '-' && !strncmp(ap, "--help", 6)) exit_with_usage(myname, NULL, NULL); while (ap && *ap && *++ap) { switch (*ap) { #ifdef ENABLE_TELNET case '4': af = AF_INET; break; case '6': af = AF_INET6; break; #endif case 'a': nwin_options.aflag = true; break; case 'A': adaptflag = true; break; case 'p': /* preselect */ if (*++ap) preselect = ap; else { if (!--argc) exit_with_usage(myname, "Specify a window to preselect with -p", NULL); preselect = *++argv; } ap = NULL; break; case 'P': do_auth = true; break; case 'c': if (*++ap) RcFileName = ap; else { if (--argc == 0) exit_with_usage(myname, "Specify an alternate rc-filename with -c", NULL); RcFileName = *++argv; } ap = NULL; break; case 'e': if (!*++ap) { if (--argc == 0) exit_with_usage(myname, "Specify command characters with -e", NULL); ap = *++argv; } if (ParseEscape(ap)) Panic(0, "Two characters are required with -e option, not '%s'.", ap); ap = NULL; break; case 'f': ap++; switch (*ap++) { case 'n': case '0': nwin_options.flowflag = FLOW_ON; break; case '\0': ap--; /* FALLTHROUGH */ case 'y': case '1': nwin_options.flowflag = FLOW_OFF; break; case 'a': nwin_options.flowflag = FLOW_AUTOFLAG; break; default: exit_with_usage(myname, "Unknown flow option -%s", --ap); } break; case 'h': if (--argc == 0) exit_with_usage(myname, NULL, NULL); nwin_options.histheight = atoi(*++argv); if (nwin_options.histheight < 0) exit_with_usage(myname, "-h: %s: negative scrollback size?", *argv); break; case 'i': iflag = true; break; case 't': /* title, the former AkA == -k */ if (--argc == 0) exit_with_usage(myname, "Specify a new window-name with -t", NULL); nwin_options.aka = *++argv; break; case 'l': ap++; switch (*ap++) { case 'n': case '0': nwin_options.lflag = 0; break; case '\0': ap--; /* FALLTHROUGH */ case 'y': case '1': nwin_options.lflag = 1; break; case 'a': nwin_options.lflag = 3; break; case 's': /* -ls */ case 'i': /* -list */ lsflag = true; if (argc > 1 && !SocketMatch) { SocketMatch = *++argv; argc--; } ap = NULL; break; default: exit_with_usage(myname, "%s: Unknown suboption to -l", --ap); } break; case 'w': if (strcmp(ap + 1, "ipe")) exit_with_usage(myname, "Unknown option %s", --ap); lsflag = true; wipeflag = true; if (argc > 1 && !SocketMatch) { SocketMatch = *++argv; argc--; } break; case 'L': if (!strcmp(ap + 1, "ogfile")) { if (--argc == 0) exit_with_usage(myname, "Specify logfile path with -Logfile", NULL); if (strlen(*++argv) > PATH_MAX) Panic(1, "-Logfile name too long. (max. %d char)", PATH_MAX); free(screenlogfile); /* we already set it up while starting */ screenlogfile = SaveStr(*argv); ap = NULL; } else if (!strcmp(ap, "L")) nwin_options.Lflag = 1; break; case 'm': mflag = 1; break; case 'O': /* to be (or not to be?) deleted. jw. */ force_vt = 0; break; case 'T': if (--argc == 0) exit_with_usage(myname, "Specify terminal-type with -T", NULL); if (strlen(*++argv) < MAXTERMLEN) { strncpy(screenterm, *argv, MAXTERMLEN); screenterm[MAXTERMLEN] = '\0'; } else Panic(0, "-T: terminal name too long. (max. %d char)", MAXTERMLEN); nwin_options.term = screenterm; break; case 'q': quietflag = true; break; case 'Q': queryflag = 1; cmdflag = true; break; case 'r': case 'R': case 'x': if (argc > 1 && *argv[1] != '-' && !SocketMatch) { SocketMatch = *++argv; argc--; } if (*ap == 'x') xflag = true; if (rflag) rflag = 2; rflag += (*ap == 'R') ? 2 : 1; break; case 'd': dflag = 1; /* FALLTHROUGH */ case 'D': if (!dflag) dflag = 2; if (argc == 2) { if (*argv[1] != '-' && !SocketMatch) { SocketMatch = *++argv; argc--; } } break; case 's': if (--argc == 0) exit_with_usage(myname, "Specify shell with -s", NULL); if (ShellProg) free(ShellProg); ShellProg = SaveStr(*++argv); break; case 'S': if (!SocketMatch) { if (--argc == 0) exit_with_usage(myname, "Specify session-name with -S", NULL); SocketMatch = *++argv; } if (!*SocketMatch) exit_with_usage(myname, "Empty session-name?", NULL); if (strlen(SocketMatch) > 80) exit_with_usage(myname, "Session-name is too long (max length is 80 symbols)", NULL); break; case 'X': cmdflag = true; break; case 'v': printf("Screen version %s\n", version); exit(0); case 'U': nwin_options.encoding = UTF8; break; default: exit_with_usage(myname, "Unknown option %s", --ap); } } } else break; } xsignal(SIGSEGV, CoreDump); setlocale(LC_ALL, ""); if (nwin_options.encoding == -1) { /* ask locale if we should start in UTF-8 mode */ #ifdef HAVE_LANGINFO_H nwin_options.encoding = FindEncoding(nl_langinfo(CODESET)); #else char *s; if ((s = locale_name()) && strstr(s, "UTF-8")) nwin_options.encoding = UTF8; #endif } { char *s; if ((s = locale_name())) { if (!strncmp(s, "zh_", 3) || !strncmp(s, "ja_", 3) || !strncmp(s, "ko_", 3)) { cjkwidth = 1; } } } if (nwin_options.aka) { if (nwin_options.encoding > 0) { size_t len = strlen(nwin_options.aka); size_t newsz; char *newbuf = malloc(3 * len); if (!newbuf) Panic(0, "%s", strnomem); newsz = RecodeBuf((unsigned char *)nwin_options.aka, len, nwin_options.encoding, 0, (unsigned char *)newbuf); newbuf[newsz] = '\0'; nwin_options.aka = newbuf; } else { /* If we just use the original value from av, subsequent shelltitle invocations will attempt to free space we don't own... */ nwin_options.aka = SaveStr(nwin_options.aka); } } if (SocketMatch && strlen(SocketMatch) >= MAXSTR) Panic(0, "Ridiculously long socketname - try again."); if (cmdflag && !rflag && !dflag && !xflag) xflag = true; if (!cmdflag && dflag && mflag && !(rflag || xflag)) detached = true; nwin = nwin_options; nwin.encoding = nwin_undef.encoding; /* let screenrc overwrite it */ if (argc) nwin.args = argv; if (!ShellProg) { char *sh; sh = getenv("SHELL"); ShellProg = SaveStr(sh ? sh : DefaultShell); } ShellArgs[0] = ShellProg; home = getenv("HOME"); if (!mflag && !SocketMatch) { sty = getenv("STY"); if (sty && *sty == 0) sty = NULL; } own_uid = multi_uid = real_uid; if (SocketMatch && (sockp = strchr(SocketMatch, '/'))) { *sockp = 0; multi = SocketMatch; SocketMatch = sockp + 1; if (*multi) { struct passwd *mppp; if ((mppp = getpwnam(multi)) == NULL) Panic(0, "Cannot identify account '%s'.", multi); multi_uid = mppp->pw_uid; multi_home = SaveStr(mppp->pw_dir); if (strlen(multi_home) > MAXPATHLEN - 10) Panic(0, "home directory path too long"); /* always fake multi attach mode */ if (rflag || lsflag) xflag = 1; detached = false; multiattach = 1; } /* Special case: effective user is multiuser. */ if (eff_uid && (multi_uid != eff_uid)) Panic(0, "Must run suid root for multiuser support."); } if (SocketMatch && *SocketMatch == 0) SocketMatch = NULL; if ((LoginName = getlogin()) != NULL) { if ((ppp = getpwnam(LoginName)) != NULL) if (ppp->pw_uid != real_uid) ppp = NULL; } if (ppp == NULL) { if ((ppp = getpwuid(real_uid)) == NULL) { Panic(0, "getpwuid() can't identify your account!"); exit(1); } LoginName = ppp->pw_name; } LoginName = SaveStr(LoginName); ppp = getpwbyname(LoginName, ppp); #if !defined(SOCKET_DIR) if (multi && !multiattach) { if (home && strcmp(home, ppp->pw_dir)) Panic(0, "$HOME must match passwd entry for multiuser screens."); } #endif #define SET_GUID() do \ { \ if (setgid(real_gid)) \ Panic(0, "setgid"); \ if (setuid(real_uid)) \ Panic(0, "setuid"); \ eff_uid = real_uid; \ eff_gid = real_gid; \ } while (0) if (home == NULL || *home == '\0') home = ppp->pw_dir; if (strlen(LoginName) > MAXLOGINLEN) Panic(0, "LoginName too long - sorry."); if (multi && strlen(multi) > MAXLOGINLEN) Panic(0, "Screen owner name too long - sorry."); if (strlen(home) > MAXPATHLEN) Panic(0, "$HOME too long - sorry."); attach_tty = ""; if (!detached && !lsflag && !cmdflag && !(dflag && !mflag && !rflag && !xflag) && !(sty && !SocketMatch && !mflag && !rflag && !xflag)) { int fl; /* ttyname implies isatty */ SetTtyname(true, &st); fl = fcntl(0, F_GETFL, 0); if (fl != -1 && (fl & (O_RDWR | O_RDONLY | O_WRONLY)) == O_RDWR) attach_fd = 0; if (attach_fd == -1) { if ((n = secopen(attach_tty, O_RDWR | O_NONBLOCK, 0)) < 0) Panic(0, "Cannot open your terminal '%s' - please check.", attach_tty); /* In case the pts device exists in another namespace we directly operate * on the symbolic link itself. However, this means that we need to keep * the fd open since we have no direct way of identifying the associated * pts device across namespaces. This is ok though since keeping fds open * is done in the codebase already. */ if (attach_tty_is_in_new_ns) attach_fd = n; else close(n); } if ((attach_term = getenv("TERM")) == NULL || *attach_term == 0) Panic(0, "Please set a terminal type."); if (strlen(attach_term) > MAXTERMLEN) Panic(0, "$TERM too long - sorry."); GetTTY(0, &attach_Mode); } oumask = umask(0); /* well, unsigned never fails? jw. */ SocketDir = getenv("SCREENDIR"); if (SocketDir) { if (strlen(SocketDir) >= MAXPATHLEN - 1) Panic(0, "Ridiculously long $SCREENDIR - try again."); if (multi) Panic(0, "No $SCREENDIR with multi screens, please."); } if (multiattach) { #ifndef SOCKET_DIR sprintf(SocketPath, "%s/.screen", multi_home); #else SocketDir = SOCKET_DIR; sprintf(SocketPath, "%s/S-%s", SocketDir, multi); #endif } else { #ifndef SOCKET_DIR if (SocketDir == NULL) { if (strlen(home) > MAXPATHLEN - 8 - 1) Panic(0, "$HOME too long - sorry."); sprintf(SocketPath, "%s/.screen", home); SocketDir = SocketPath; } #endif if (SocketDir) { if (access(SocketDir, F_OK)) { if (UserContext() > 0) { if (mkdir(SocketDir, 0700)) UserReturn(0); UserReturn(1); } if (UserStatus() <= 0) Panic(0, "Cannot make directory '%s'.", SocketDir); } if (SocketDir != SocketPath) strncpy(SocketPath, SocketDir, ARRAY_SIZE(SocketPath)); } #ifdef SOCKET_DIR else { SocketDir = SOCKET_DIR; if (stat(SocketDir, &st)) { n = (eff_uid == 0 && (real_uid || eff_gid == real_gid)) ? 0755 : (eff_gid != real_gid) ? 0775 : #ifdef S_ISVTX 0777 | S_ISVTX; #else 0777; #endif if (mkdir(SocketDir, n) == -1) Panic(errno, "Cannot make directory '%s'", SocketDir); } else { if (!S_ISDIR(st.st_mode)) Panic(0, "'%s' must be a directory.", SocketDir); if (eff_uid == 0 && real_uid && st.st_uid != eff_uid) Panic(0, "Directory '%s' must be owned by root.", SocketDir); n = (eff_uid == 0 && (real_uid || (st.st_mode & 0775) != 0775)) ? 0755 : (eff_gid == st.st_gid && eff_gid != real_gid) ? 0775 : 0777; if (((int)st.st_mode & 0777) != n) Panic(0, "Directory '%s' must have mode %03o.", SocketDir, n); } sprintf(SocketPath, "%s/S-%s", SocketDir, LoginName); if (mkdir(SocketPath, 0700) == 0) { (void)lchown(SocketPath, real_uid, real_gid); } else if (errno != EEXIST) { Panic(errno, "Cannot make directory '%s'", SocketPath); } } #endif } if (stat(SocketPath, &st) == -1) { if (eff_uid == real_uid) { Panic(errno, "Cannot access %s", SocketPath); } else { Panic(0, "Error accessing %s", SocketPath); } } else if (!S_ISDIR(st.st_mode)) { if (eff_uid == real_uid || st.st_uid == real_uid) { Panic(0, "%s is not a directory.", SocketPath); } else { Panic(0, "Error accessing %s", SocketPath); } } if (multi) { if (st.st_uid != multi_uid) { if (eff_uid == real_uid || st.st_uid == real_uid) { Panic(0, "%s is not the owner of %s.", multi, SocketPath); } else { Panic(0, "Error accessing %s", SocketPath); } } } else { #ifdef SOCKET_DIR /* if SOCKETDIR is not defined, the socket is in $HOME. in that case it does not make sense to compare uids. */ if (st.st_uid != real_uid) { if (eff_uid == real_uid) { Panic(0, "You are not the owner of %s.", SocketPath); } else { Panic(0, "Error accessing %s", SocketPath); } } #endif } if ((st.st_mode & 0777) != 0700) { if (eff_uid == real_uid || st.st_uid == real_uid) { Panic(0, "Directory %s must have mode 700.", SocketPath); } else { Panic(0, "Error accessing %s", SocketPath); } } if (SocketMatch && strchr(SocketMatch, '/')) Panic(0, "Bad session name '%s'", SocketMatch); SocketName = SocketPath + strlen(SocketPath) + 1; *SocketName = 0; (void)umask(oumask); (void)gethostname(HostName, MAXSTR); HostName[MAXSTR - 1] = '\0'; if ((ap = strchr(HostName, '.')) != NULL) *ap = '\0'; if (lsflag) { int i, fo, oth; if (multi) real_uid = multi_uid; SET_GUID(); i = FindSocket((int *)NULL, &fo, &oth, SocketMatch); if (quietflag) { if (rflag) exit(10 + i); else exit(9 + (fo || oth ? 1 : 0) + fo); } if (fo == 0) { if (eff_uid == real_uid || st.st_uid == real_uid) { Panic(0, "No Sockets found in %s.\n", SocketPath); } else { Panic(0, "Error accessing %s", SocketPath); } } Msg(0, "%d Socket%s in %s.", fo, fo > 1 ? "s" : "", SocketPath); eexit(0); } xsignal(SIG_BYE, AttacherFinit); /* prevent races */ if (cmdflag) { /* attach_tty is not mandatory */ if (multi) real_uid = multi_uid; SetTtyname(false, &st); if (!*argv) Panic(0, "Please specify a command."); SET_GUID(); SendCmdMessage(sty, SocketMatch, argv, queryflag >= 0); exit(0); } else if (rflag || xflag) { if (Attach(MSG_ATTACH)) { Attacher(); /* NOTREACHED */ } if (multiattach) Panic(0, "Can't create sessions of other users."); } else if (dflag && !mflag) { SetTtyname(false, &st); Attach(MSG_DETACH); Msg(0, "[%s %sdetached.]\n", SocketName, (dflag > 1 ? "power " : "")); eexit(0); /* NOTREACHED */ } if (!SocketMatch && !mflag && sty) { /* attach_tty is not mandatory */ SetTtyname(false, &st); SET_GUID(); nwin_options.args = argv; SendCreateMsg(sty, &nwin); exit(0); /* NOTREACHED */ } nwin_compose(&nwin_default, &nwin_options, &nwin_default); if (!detached || dflag != 2) MasterPid = fork(); else MasterPid = 0; switch (MasterPid) { case -1: Panic(errno, "fork"); /* NOTREACHED */ case 0: break; default: if (detached) exit(0); if (SocketMatch) sprintf(socknamebuf, "%d.%s", MasterPid, SocketMatch); else sprintf(socknamebuf, "%d.%s.%s", MasterPid, stripdev(attach_tty), HostName); for (ap = socknamebuf; *ap; ap++) if (*ap == '/') *ap = '-'; if (strlen(socknamebuf) > FILENAME_MAX) socknamebuf[FILENAME_MAX - 1] = 0; snprintf(SocketPath + strlen(SocketPath), sizeof(SocketPath) - strlen(SocketPath), "/%s", socknamebuf); SET_GUID(); Attacher(); /* NOTREACHED */ } if (!detached) PanicPid = getppid(); if (DefaultEsc == -1) DefaultEsc = Ctrl('a'); if (DefaultMetaEsc == -1) DefaultMetaEsc = 'a'; ap = av0 + strlen(av0) - 1; while (ap >= av0) { if (!strncmp("screen", ap, 6)) { memcpy(ap, "SCREEN", 6); /* name this process "SCREEN-BACKEND" */ break; } ap--; } if (ap < av0) *av0 = 'S'; if (!detached) { if (attach_fd == -1) { if ((n = secopen(attach_tty, O_RDWR | O_NONBLOCK, 0)) < 0) Panic(0, "Cannot reopen '%s' - please check.", attach_tty); } else n = dup(attach_fd); } else n = -1; /* * This guarantees that the session owner is listed, even when we * start detached. From now on we should not refer to 'LoginName' * any more, use users->u_name instead. */ if (UserAdd(LoginName, NULL) < 0) Panic(0, "Could not create user info"); if (!detached) { if (MakeDisplay(LoginName, attach_tty, attach_term, n, getppid(), &attach_Mode) == NULL) Panic(0, "Could not alloc display"); PanicPid = 0; D_encoding = nwin_options.encoding > 0 ? nwin_options.encoding : 0; } if (!freopen("/dev/null", "r", stdin) || !freopen("/dev/null", "w", stdout) || !freopen("/dev/null", "w", stderr)) Panic(0, "Cannot reassociate std streams"); if (SocketMatch) { /* user started us with -S option */ sprintf(socknamebuf, "%d.%s", (int)getpid(), SocketMatch); } else { sprintf(socknamebuf, "%d.%s.%s", (int)getpid(), stripdev(attach_tty), HostName); } for (ap = socknamebuf; *ap; ap++) if (*ap == '/') *ap = '-'; if (strlen(socknamebuf) > FILENAME_MAX) { socknamebuf[FILENAME_MAX] = 0; } snprintf(SocketPath + strlen(SocketPath), sizeof(SocketPath) - strlen(SocketPath), "/%s", socknamebuf); ServerSocket = MakeServerSocket(); #ifdef SYSTEM_SCREENRC (void)StartRc(SYSTEM_SCREENRC, 0); #endif (void)StartRc(RcFileName, 0); #ifdef ENABLE_UTMP InitUtmp(); #endif /* ENABLE_UTMP */ if (display) { if (InitTermcap(0, 0)) { fcntl(D_userfd, F_SETFL, 0); /* Flush sets FNBLOCK */ freetty(); if (D_userpid) Kill(D_userpid, SIG_BYE); eexit(1); } MakeDefaultCanvas(); InitTerm(0); #ifdef ENABLE_UTMP RemoveLoginSlot(); #endif } else MakeTermcap(1); InitKeytab(); MakeNewEnv(); xsignal(SIGHUP, SigHup); xsignal(SIGINT, FinitHandler); xsignal(SIGQUIT, FinitHandler); xsignal(SIGTERM, FinitHandler); xsignal(SIGTTIN, SIG_IGN); xsignal(SIGTTOU, SIG_IGN); if (display) { brktty(D_userfd); SetMode(&D_OldMode, &D_NewMode, D_flow, iflag); /* Note: SetMode must be called _before_ FinishRc. */ SetTTY(D_userfd, &D_NewMode); if (fcntl(D_userfd, F_SETFL, FNBLOCK)) Msg(errno, "Warning: NBLOCK fcntl failed"); } else brktty(-1); /* just try */ xsignal(SIGCHLD, SigChld); #ifdef SYSTEM_SCREENRC FinishRc(SYSTEM_SCREENRC); #endif FinishRc(RcFileName); if (mru_window == NULL) { if (MakeWindow(&nwin) == -1) { struct pollfd pfd[1]; pfd[0].fd = 0; pfd[0].events = POLLIN; Msg(0, "Sorry, could not find a PTY or TTY."); /* allow user to exit early by pressing any key. */ poll(pfd, ARRAY_SIZE(pfd), MsgWait); Finit(0); /* NOTREACHED */ } } else if (argc) { /* Screen was invoked with a command */ MakeWindow(&nwin); } if (display && default_startup) display_license(); xsignal(SIGINT, SigInt); if (rflag && (rflag & 1) == 0 && !quietflag) { Msg(0, "New screen..."); rflag = 0; } serv_read.type = EV_READ; serv_read.fd = ServerSocket; serv_read.handler = serv_read_fn; evenq(&serv_read); serv_select.priority = -10; serv_select.type = EV_ALWAYS; serv_select.handler = serv_select_fn; evenq(&serv_select); logflushev.type = EV_TIMEOUT; logflushev.handler = logflush_fn; sched(); /* NOTREACHED */ return 0; } static void SigChldHandler(void) { struct stat st; while (GotSigChld) { GotSigChld = 0; DoWait(); } if (stat(SocketPath, &st) == -1) { if (!RecoverSocket()) { Finit(1); } } } static void SigChld(int sigsig) { (void)sigsig; /* unused */ GotSigChld = 1; } void SigHup(int sigsig) { (void)sigsig; /* unused */ /* Hangup all displays */ while ((display = displays)) Hangup(); } /* * the backend's Interrupt handler * we cannot insert the intrc directly, as we never know * if fore is valid. */ static void SigInt(int sigsig) { (void)sigsig; /* unused */ xsignal(SIGINT, SigInt); InterruptPlease = 1; } static void CoreDump(int sigsig) { /* if running with s-bit, we must reset the s-bit, so that we get a * core file anyway. */ Display *disp; char buf[80]; (void)sigsig; /* unused */ if (setgid(getgid())) Panic(0, "setgid"); if (setuid(getuid())) Panic(0, "setuid"); unlink("core"); sprintf(buf, "\r\n[screen caught a fatal signal. (core dumped)]\r\n"); for (disp = displays; disp; disp = disp->d_next) { if (disp->d_nonblock < -1 || disp->d_nonblock > 1000000) continue; fcntl(disp->d_userfd, F_SETFL, 0); SetTTY(disp->d_userfd, &D_OldMode); write(disp->d_userfd, buf, strlen(buf)); Kill(disp->d_userpid, SIG_BYE); } abort(); } static void DoWait(void) { pid_t pid; Window *win; int wstat; while ((pid = waitpid(-1, &wstat, WNOHANG | WUNTRACED)) > 0) { for (win = mru_window; win; win = win->w_prev_mru) { if ((win->w_pid && pid == win->w_pid) || (win->w_deadpid && pid == win->w_deadpid)) { /* child has ceased to exist */ win->w_pid = 0; if (WIFSTOPPED(wstat)) { #ifdef SIGTTIN if (WSTOPSIG(wstat) == SIGTTIN) { Msg(0, "Suspended (tty input)"); continue; } #endif #ifdef SIGTTOU if (WSTOPSIG(wstat) == SIGTTOU) { Msg(0, "Suspended (tty output)"); continue; } #endif /* Try to restart process */ Msg(0, "Child has been stopped, restarting."); if (killpg(pid, SIGCONT)) kill(pid, SIGCONT); } else { /* Screen will detect the window has died when the window's * file descriptor signals EOF (which it will do when the process in * the window terminates). So do this in a timeout of 10 seconds. * (not doing this at all might also work) * See #27061 for more details. */ win->w_destroyev.data = (char *)win; win->w_exitstatus = wstat; SetTimeout(&win->w_destroyev, 10 * 1000); evenq(&win->w_destroyev); } break; } if (win->w_pwin && pid == win->w_pwin->p_pid) { FreePseudowin(win); break; } } } } static void FinitHandler(int sigsig) { (void)sigsig; /* unused */ Finit(1); } void Finit(int i) { xsignal(SIGCHLD, SIG_DFL); xsignal(SIGHUP, SIG_IGN); while (mru_window) { Window *p = mru_window; mru_window = mru_window->w_prev_mru; FreeWindow(p); } if (ServerSocket != -1) { xseteuid(real_uid); xsetegid(real_gid); (void)unlink(SocketPath); xseteuid(eff_uid); xsetegid(eff_gid); } for (display = displays; display; display = display->d_next) { if (D_status) RemoveStatus(); FinitTerm(); #ifdef ENABLE_UTMP RestoreLoginSlot(); #endif AddStr("[screen is terminating]\r\n"); Flush(3); SetTTY(D_userfd, &D_OldMode); fcntl(D_userfd, F_SETFL, 0); freetty(); Kill(D_userpid, SIG_BYE); } /* * we _cannot_ call eexit(i) here, * instead of playing with the Socket above. Sigh. */ exit(i); } void eexit(int e) { if (ServerSocket != -1) { if (setgid(real_gid)) AddStr("Failed to set gid\r\n"); if (setuid(real_uid)) AddStr("Failed to set uid\r\n"); if (unlink(SocketPath)) AddStr("Failed to remove socket\r\n"); } exit(e); } void Hangup(void) { if (display == NULL) return; if (D_userfd >= 0) { close(D_userfd); D_userfd = -1; } if (auto_detach || displays->d_next) Detach(D_HANGUP); else Finit(0); } /* * Detach now has the following modes: *D_DETACH SIG_BYE detach backend and exit attacher *D_HANGUP SIG_BYE detach backend and exit attacher *D_STOP SIG_STOP stop attacher (and detach backend) *D_REMOTE SIG_BYE remote detach -- reattach to new attacher *D_POWER SIG_POWER_BYE power detach -- attacher kills his parent *D_REMOTE_POWER SIG_POWER_BYE remote power detach -- both *D_LOCK SIG_LOCK lock the attacher * (jw) * we always remove our utmp slots. (even when "lock" or "stop") * Note: Take extra care here, we may be called by interrupt! */ void Detach(int mode) { int sign = 0; pid_t pid; Canvas *cv; Window *p; if (display == NULL) return; #define AddStrSocket(msg) do { \ if (SocketName) \ { \ AddStr("[" msg " from "); \ AddStr(SocketName); \ AddStr("]\r\n"); \ } \ else \ AddStr("[" msg "]\r\n"); \ } while (0) xsignal(SIGHUP, SIG_IGN); if (D_status) RemoveStatus(); FinitTerm(); if (!display) return; switch (mode) { case D_HANGUP: sign = SIG_BYE; break; case D_DETACH: AddStrSocket("detached"); sign = SIG_BYE; break; case D_STOP: sign = SIG_STOP; break; case D_REMOTE: AddStrSocket("remote detached"); sign = SIG_BYE; break; case D_POWER: AddStrSocket("power detached"); if (PowDetachString) { AddStr(PowDetachString); AddStr("\r\n"); } sign = SIG_POWER_BYE; break; case D_REMOTE_POWER: AddStrSocket("remote power detached"); if (PowDetachString) { AddStr(PowDetachString); AddStr("\r\n"); } sign = SIG_POWER_BYE; break; case D_LOCK: ClearAll(); ClearScrollbackBuffer(); sign = SIG_LOCK; /* tell attacher to lock terminal with a lockprg. */ break; } #ifdef ENABLE_UTMP if (displays->d_next == NULL) { for (p = mru_window; p; p = p->w_prev_mru) { if (p->w_slot != (slot_t) - 1 && !(p->w_lflag & 2)) { RemoveUtmp(p); /* * Set the slot to 0 to get the window * logged in again. */ p->w_slot = (slot_t) 0; } } } if (mode != D_HANGUP) RestoreLoginSlot(); #endif if (displays->d_next == NULL && console_window) { if (TtyGrabConsole(console_window->w_ptyfd, false, "detach")) { KillWindow(console_window); display = displays; /* restore display */ } } if (D_fore) { ReleaseAutoWritelock(display, D_fore); D_user->u_detachwin = D_fore->w_number; D_user->u_detachotherwin = D_other ? D_other->w_number : D_fore->w_number; } AutosaveLayout(D_layout); layout_last = D_layout; for (cv = D_cvlist; cv; cv = cv->c_next) { p = Layer2Window(cv->c_layer); SetCanvasWindow(cv, NULL); if (p) WindowChanged(p, 'u'); } pid = D_userpid; FreeDisplay(); if (displays == NULL) /* Flag detached-ness */ (void)chsock(); /* * tell father what to do. We do that after we * freed the tty, thus getty feels more comfortable on hpux * if it was a power detach. */ Kill(pid, sign); xsignal(SIGHUP, SigHup); #undef AddStrSocket } static int IsSymbol(char *e, char *s) { int l; l = strlen(s); return strncmp(e, s, l) == 0 && e[l] == '='; } void MakeNewEnv(void) { char **op, **np; static char stybuf[MAXSTR]; for (op = environ; *op; ++op) ; if (NewEnv) free((char *)NewEnv); NewEnv = np = malloc((unsigned)(op - environ + 7 + 1) * sizeof(char *)); if (!NewEnv) Panic(0, "%s", strnomem); sprintf(stybuf, "STY=%s", strlen(SocketName) <= MAXSTR - 5 ? SocketName : "?"); *np++ = stybuf; /* NewEnv[0] */ *np++ = Term; /* NewEnv[1] */ np++; /* room for SHELL */ np += 2; /* room for TERMCAP and WINDOW */ for (op = environ; *op; ++op) { if (!IsSymbol(*op, "TERM") && !IsSymbol(*op, "TERMCAP") && !IsSymbol(*op, "STY") && !IsSymbol(*op, "WINDOW") && !IsSymbol(*op, "SCREENCAP") && !IsSymbol(*op, "SHELL") && !IsSymbol(*op, "LINES") && !IsSymbol(*op, "COLUMNS") ) *np++ = *op; } *np = NULL; } #define PROCESS_MESSAGE(B) do { \ char *p = B; \ va_list ap; \ va_start(ap, fmt); \ (void)vsnprintf(p, sizeof(B) - 100, fmt, ap); \ va_end(ap); \ if (err) \ { \ p += strlen(p); \ *p++ = ':'; \ *p++ = ' '; \ strncpy(p, strerror(err), B + sizeof(B) - p - 1); \ B[sizeof(B) - 1] = 0; \ } \ } while (0) void Msg(int err, const char *fmt, ...) { char buf[MAXPATHLEN * 2]; PROCESS_MESSAGE(buf); if (display && displays) MakeStatus(buf); else if (displays) { for (display = displays; display; display = display->d_next) MakeStatus(buf); } else if (display) { /* no displays but a display - must have forked. * send message to backend! */ char *tty = D_usertty; Display *olddisplay = display; display = NULL; /* only send once */ SendErrorMsg(tty, buf); display = olddisplay; } else printf("%s\r\n", buf); if (queryflag >= 0) write(queryflag, buf, strlen(buf)); } /* * Call FinitTerm for all displays, write a message to each and call eexit(); */ void Panic(int err, const char *fmt, ...) { char buf[MAXPATHLEN * 2]; PROCESS_MESSAGE(buf); if (displays == NULL && display == NULL) { printf("%s\r\n", buf); if (PanicPid) Kill(PanicPid, SIG_BYE); } else if (displays == NULL) { /* no displays but a display - must have forked. * send message to backend! */ char *tty = D_usertty; display = NULL; SendErrorMsg(tty, buf); sleep(2); _exit(1); } else for (display = displays; display; display = display->d_next) { if (D_status) RemoveStatus(); FinitTerm(); Flush(3); #ifdef ENABLE_UTMP RestoreLoginSlot(); #endif SetTTY(D_userfd, &D_OldMode); fcntl(D_userfd, F_SETFL, 0); write(D_userfd, buf, strlen(buf)); write(D_userfd, "\n", 1); freetty(); if (D_userpid) Kill(D_userpid, SIG_BYE); } eexit(1); } void QueryMsg(int err, const char *fmt, ...) { char buf[MAXPATHLEN * 2]; if (queryflag < 0) return; PROCESS_MESSAGE(buf); write(queryflag, buf, strlen(buf)); } void Dummy(int err, const char *fmt, ...) { (void)err; /* unused */ (void)fmt; /* unused */ } #undef PROCESS_MESSAGE /* * '^' is allowed as an escape mechanism for control characters. jw. * * Added time insertion using ideas/code from /\ndy Jones * (andy@lingua.cltr.uq.OZ.AU) - thanks a lot! * */ void PutWinMsg(char *s, int start, int max) { int i, p, l, n; uint64_t r; struct mchar rend; struct mchar rendstack[MAX_WINMSG_REND]; int rendstackn = 0; if (s != g_winmsg->buf) { /* sorry, no fancy coloring available */ l = strlen(s); if (l > max) l = max; l -= start; s += start; while (l-- > 0) PUTCHARLP(*s++); return; } rend = D_rend; p = 0; l = strlen(s); for (i = 0; i < g_winmsg->numrend && max > 0; i++) { if (p > g_winmsg->rendpos[i] || g_winmsg->rendpos[i] > l) break; if (p < g_winmsg->rendpos[i]) { n = g_winmsg->rendpos[i] - p; if (n > max) n = max; max -= n; p += n; while (n-- > 0) { if (start-- > 0) s++; else PUTCHARLP(*s++); } } r = g_winmsg->rend[i]; if (r == 0) { if (rendstackn > 0) rend = rendstack[--rendstackn]; } else { rendstack[rendstackn++] = rend; ApplyAttrColor(r, &rend); } SetRendition(&rend); } if (p < l) { n = l - p; if (n > max) n = max; while (n-- > 0) { if (start-- > 0) s++; else PUTCHARLP(*s++); } } } static void serv_read_fn(Event *event, void *data) { (void)event; /* unused */ (void)data; /* unused */ ReceiveMsg(); } static void serv_select_fn(Event *event, void *data) { Window *p; (void)event; /* unused */ (void)data; /* unused */ /* XXX: messages?? */ if (GotSigChld) { SigChldHandler(); } if (InterruptPlease) { /* This approach is rather questionable in a multi-display * environment */ if (fore && displays) { char ibuf = displays->d_OldMode.tio.c_cc[VINTR]; write(W_UWP(fore) ? fore->w_pwin->p_ptyfd : fore->w_ptyfd, &ibuf, 1); } InterruptPlease = 0; } for (p = mru_window; p; p = p->w_prev_mru) { if (p->w_bell == BELL_FOUND || p->w_bell == BELL_VISUAL) { Canvas *cv; int visual = p->w_bell == BELL_VISUAL || visual_bell; p->w_bell = BELL_ON; for (display = displays; display; display = display->d_next) { for (cv = D_cvlist; cv; cv = cv->c_next) if (cv->c_layer->l_bottom == &p->w_layer) break; if (cv == NULL) { p->w_bell = BELL_DONE; Msg(0, "%s", MakeWinMsg(BellString, p, '%')); } else if (visual && !D_VB && (!D_status || !D_status_bell)) { Msg(0, "%s", VisualBellString); if (D_status) { D_status_bell = 1; SetTimeout(&D_statusev, VBellWait); } } } /* don't annoy the user with two messages */ if (p->w_monitor == MON_FOUND) p->w_monitor = MON_DONE; WindowChanged(p, WINESC_WFLAGS); } if (p->w_monitor == MON_FOUND) { Canvas *cv; p->w_monitor = MON_ON; for (display = displays; display; display = display->d_next) { for (cv = D_cvlist; cv; cv = cv->c_next) if (cv->c_layer->l_bottom == &p->w_layer) break; if (cv) continue; /* user already sees window */ if (!(ACLBYTE(p->w_mon_notify, D_user->u_id) & ACLBIT(D_user->u_id))) continue; /* user doesn't care */ Msg(0, "%s", MakeWinMsg(ActivityString, p, '%')); p->w_monitor = MON_DONE; } WindowChanged(p, WINESC_WFLAGS); } if (p->w_silence == SILENCE_FOUND) { /* Unset the flag if the user switched to this window. */ if (p->w_layer.l_cvlist) { p->w_silence = SILENCE_ON; WindowChanged(p, WINESC_WFLAGS); } } } for (display = displays; display; display = display->d_next) { Canvas *cv; if (D_status == STATUS_ON_WIN) continue; /* XXX: should use display functions! */ for (cv = D_cvlist; cv; cv = cv->c_next) { int lx, ly; /* normalize window, see resize.c */ lx = cv->c_layer->l_x; ly = cv->c_layer->l_y; if (lx == cv->c_layer->l_width) lx--; if (ly + cv->c_yoff < cv->c_ys) { int i, n = cv->c_ys - (ly + cv->c_yoff); cv->c_yoff = cv->c_ys - ly; RethinkViewportOffsets(cv); if (n > cv->c_layer->l_height) n = cv->c_layer->l_height; CV_CALL(cv, LScrollV(flayer, -n, 0, flayer->l_height - 1, 0); LayRedisplayLine(-1, -1, -1, 1); for (i = 0; i < n; i++) LayRedisplayLine(i, 0, flayer->l_width - 1, 1); if (cv == cv->c_display->d_forecv) LaySetCursor();) ; } else if (ly + cv->c_yoff > cv->c_ye) { int i, n = ly + cv->c_yoff - cv->c_ye; cv->c_yoff = cv->c_ye - ly; RethinkViewportOffsets(cv); if (n > cv->c_layer->l_height) n = cv->c_layer->l_height; CV_CALL(cv, LScrollV(flayer, n, 0, cv->c_layer->l_height - 1, 0); LayRedisplayLine(-1, -1, -1, 1); for (i = 0; i < n; i++) LayRedisplayLine(i + flayer->l_height - n, 0, flayer->l_width - 1, 1); if (cv == cv->c_display->d_forecv) LaySetCursor();) ; } if (lx + cv->c_xoff < cv->c_xs) { int i, n = cv->c_xs - (lx + cv->c_xoff); if (n < (cv->c_xe - cv->c_xs + 1) / 2) n = (cv->c_xe - cv->c_xs + 1) / 2; if (cv->c_xoff + n > cv->c_xs) n = cv->c_xs - cv->c_xoff; cv->c_xoff += n; RethinkViewportOffsets(cv); if (n > cv->c_layer->l_width) n = cv->c_layer->l_width; CV_CALL(cv, LayRedisplayLine(-1, -1, -1, 1); for (i = 0; i < flayer->l_height; i++) { LScrollH(flayer, -n, i, 0, flayer->l_width - 1, 0, NULL); LayRedisplayLine(i, 0, n - 1, 1);} if (cv == cv->c_display->d_forecv) LaySetCursor();) ; } else if (lx + cv->c_xoff > cv->c_xe) { int i, n = lx + cv->c_xoff - cv->c_xe; if (n < (cv->c_xe - cv->c_xs + 1) / 2) n = (cv->c_xe - cv->c_xs + 1) / 2; if (cv->c_xoff - n + cv->c_layer->l_width - 1 < cv->c_xe) n = cv->c_xoff + cv->c_layer->l_width - 1 - cv->c_xe; cv->c_xoff -= n; RethinkViewportOffsets(cv); if (n > cv->c_layer->l_width) n = cv->c_layer->l_width; CV_CALL(cv, LayRedisplayLine(-1, -1, -1, 1); for (i = 0; i < flayer->l_height; i++) { LScrollH(flayer, n, i, 0, flayer->l_width - 1, 0, NULL); LayRedisplayLine(i, flayer->l_width - n, flayer->l_width - 1, 1);} if (cv == cv->c_display->d_forecv) LaySetCursor();) ; } } } for (display = displays; display; display = display->d_next) { if (D_status == STATUS_ON_WIN || D_cvlist == NULL || D_cvlist->c_next == NULL) continue; CV_CALL(D_forecv, LayRestore(); LaySetCursor()); } } static void logflush_fn(Event *event, void *data) { Window *p; char *buf; int n; (void)data; /* unused */ if (!islogfile(NULL)) return; /* no more logfiles */ logfflush(NULL); n = log_flush ? log_flush : (logtstamp_after + 4) / 5; if (n) { SetTimeout(event, n * 1000); evenq(event); /* re-enqueue ourself */ } if (!logtstamp_on) return; /* write fancy time-stamp */ for (p = mru_window; p; p = p->w_prev_mru) { if (!p->w_log) continue; p->w_logsilence += n; if (p->w_logsilence < logtstamp_after) continue; if (p->w_logsilence - n >= logtstamp_after) continue; buf = MakeWinMsg(logtstamp_string, p, '%'); logfwrite(p->w_log, buf, strlen(buf)); } } /* * Interprets ^?, ^@ and other ^-control-char notation. * Interprets \ddd octal notation * * The result is placed in *cp, p is advanced behind the parsed expression and * returned. */ static char *ParseChar(char *p, char *cp) { if (*p == 0) return NULL; if (*p == '^' && p[1]) { if (*++p == '?') *cp = '\177'; else if (*p >= '@') *cp = Ctrl(*p); else return NULL; ++p; } else if (*p == '\\' && *++p <= '7' && *p >= '0') { *cp = 0; do *cp = *cp * 8 + *p - '0'; while (*++p <= '7' && *p >= '0'); } else *cp = *p++; return p; } static int ParseEscape(char *p) { unsigned char buf[2]; if (*p == 0) SetEscape(NULL, -1, -1); else { if ((p = ParseChar(p, (char *)buf)) == NULL || (p = ParseChar(p, (char *)buf + 1)) == NULL || *p) return -1; SetEscape(NULL, buf[0], buf[1]); } return 0; } static void SetTtyname(bool fatal, struct stat *st) { int ret; int saved_errno = 0; attach_tty_is_in_new_ns = false; memset(&attach_tty_name_in_ns, 0, ARRAY_SIZE(attach_tty_name_in_ns)); errno = 0; attach_tty = ttyname(0); if (!attach_tty) { if (errno == ENODEV) { saved_errno = errno; attach_tty = "/proc/self/fd/0"; attach_tty_is_in_new_ns = true; ret = readlink(attach_tty, attach_tty_name_in_ns, ARRAY_SIZE(attach_tty_name_in_ns)); if (ret < 0 || (size_t)ret >= ARRAY_SIZE(attach_tty_name_in_ns)) Panic(0, "Bad tty '%s'", attach_tty); } else if (fatal) { Panic(0, "Must be connected to a terminal."); } else { attach_tty = ""; } } if (attach_tty && strcmp(attach_tty, "")) { if (stat(attach_tty, st)) Panic(errno, "Cannot access '%s'", attach_tty); if (strlen(attach_tty) >= MAXPATHLEN) Panic(0, "TtyName too long - sorry."); /* Only call CheckTtyname() if the device does not exist in * another namespace. */ if (saved_errno != ENODEV && CheckTtyname(attach_tty)) Panic(0, "Bad tty '%s'", attach_tty); } } screen-5.0.2/sched.h0000664000175000017500000000370015224432722012705 0ustar alexalex/* Copyright (c) 2008, 2009 * Juergen Weigert (jnweiger@immd4.informatik.uni-erlangen.de) * Michael Schroeder (mlschroe@immd4.informatik.uni-erlangen.de) * Micah Cowan (micah@cowan.name) * Sadrul Habib Chowdhury (sadrul@users.sourceforge.net) * Copyright (c) 1993-2002, 2003, 2005, 2006, 2007 * Juergen Weigert (jnweiger@immd4.informatik.uni-erlangen.de) * Michael Schroeder (mlschroe@immd4.informatik.uni-erlangen.de) * Copyright (c) 1987 Oliver Laumann * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3, or (at your option) * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program (see the file COPYING); if not, see * https://www.gnu.org/licenses/, or contact Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02111-1301 USA * **************************************************************** * $Id$ GNU */ #ifndef SCREEN_SCHED_H #define SCREEN_SCHED_H #include #include typedef enum { EV_TIMEOUT = 0, EV_READ = 1, EV_WRITE = 2, EV_ALWAYS = 3 } EventType; typedef struct Event Event; struct Event { Event *next; void (*handler) (Event *, void *); void *data; int fd; EventType type; int priority; int timeout; /* timeout in milliseconds */ bool queued; /* in evs queue */ int *condpos; /* only active if condpos - condneg > 0 */ int *condneg; }; void evenq (Event *); void evdeq (Event *); void SetTimeout (Event *, int); void sched (void) __attribute__((__noreturn__)); #endif /* SCREEN_SCHED_H */ screen-5.0.2/sched.c0000664000175000017500000001156515224432722012710 0ustar alexalex/* Copyright (c) 2008, 2009 * Juergen Weigert (jnweiger@immd4.informatik.uni-erlangen.de) * Michael Schroeder (mlschroe@immd4.informatik.uni-erlangen.de) * Micah Cowan (micah@cowan.name) * Sadrul Habib Chowdhury (sadrul@users.sourceforge.net) * Copyright (c) 1993-2002, 2003, 2005, 2006, 2007 * Juergen Weigert (jnweiger@immd4.informatik.uni-erlangen.de) * Michael Schroeder (mlschroe@immd4.informatik.uni-erlangen.de) * Copyright (c) 1987 Oliver Laumann * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3, or (at your option) * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program (see the file COPYING); if not, see * https://www.gnu.org/licenses/, or contact Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02111-1301 USA * **************************************************************** */ #include "config.h" #include "sched.h" #include #include #include #include #include #include "screen.h" static Event *evs; static Event *tevs; static Event *nextev; static int calctimeout; static struct pollfd *pfd; static int pfd_cnt; static Event *calctimo(void); void evenq(Event *ev) { int i = 0; Event *evp, **evpp; if (ev->queued) return; evpp = &evs; if (ev->type == EV_TIMEOUT) { calctimeout = 1; evpp = &tevs; } for (; (evp = *evpp); evpp = &evp->next) if (ev->priority > evp->priority) break; ev->next = evp; *evpp = ev; ev->queued = true; /* check if we need more pollfd */ for (evp = evs; evp; evp = evp->next) if (evp->type == EV_READ || evp->type == EV_WRITE) i++; if (i > pfd_cnt) { pfd_cnt = i; pfd = realloc(pfd, pfd_cnt * sizeof(struct pollfd)); } } void evdeq(Event *ev) { Event *evp, **evpp; if (!ev || !ev->queued) return; evpp = &evs; if (ev->type == EV_TIMEOUT) { calctimeout = 1; evpp = &tevs; } for (; (evp = *evpp); evpp = &evp->next) if (evp == ev) break; *evpp = ev->next; ev->queued = false; if (ev == nextev) nextev = nextev->next; /* mark fd to be skipped (see checks in sched()) */ for (int i = 0; i < pfd_cnt; i++) if (pfd[i].fd == ev->fd) pfd[i].fd = -pfd[i].fd; } static Event *calctimo(void) { Event *ev, *min; long mins; if ((min = tevs) == NULL) return NULL; mins = min->timeout; for (ev = tevs->next; ev; ev = ev->next) { if (mins > ev->timeout) { min = ev; mins = ev->timeout; } } return min; } void sched(void) { Event *ev; Event *timeoutev = NULL; int timeout = 0; int i, n; for (;;) { if (calctimeout) timeoutev = calctimo(); if (timeoutev) { struct timeval now; gettimeofday(&now, NULL); /* tp - timeout */ timeout = timeoutev->timeout - (now.tv_sec * 1000 + now.tv_usec / 1000); if (timeout < 0) timeout = 0; } memset(pfd, 0, sizeof(struct pollfd) * pfd_cnt); i = 0; for (ev = evs; ev; ev = ev->next) { if (ev->condpos && *ev->condpos <= (ev->condneg ? *ev->condneg : 0)) goto skip; if (ev->type == EV_READ) { pfd[i].fd = ev->fd; pfd[i].events = POLLIN; } else if (ev->type == EV_WRITE) { pfd[i].fd = ev->fd; pfd[i].events = POLLOUT; } skip: if (ev->type == EV_READ || ev->type == EV_WRITE) i++; } n = poll(pfd, i, timeoutev ? timeout : 1000); if (n < 0) { if (errno != EINTR) { Panic(errno, "poll"); } n = 0; } else if (n == 0) { /* timeout */ if (timeoutev) { evdeq(timeoutev); timeoutev->handler(timeoutev, timeoutev->data); } } i = 0; for (ev = evs; ev; ev = nextev) { nextev = ev->next; switch (ev->type) { case EV_READ: case EV_WRITE: /* check if we parsed all events from poll() * if we did just continue, as we may still * need to run EV_ALWAYS event */ if (n == 0) continue; /* check if we have anything to do for EV_READ * or EV_WRITE, or if event is still queued, * if not skip to the next event */ if (!pfd[i].revents || pfd[i].fd < 0) { i++; continue; } /* this is one of events from poll(), decrease * counter */ n--; /* advance pollfd pointer */ i++; __attribute__ ((fallthrough)); default: if (ev->condpos && *ev->condpos <= (ev->condneg ? *ev->condneg : 0)) continue; ev->handler(ev, ev->data); } } } } void SetTimeout(Event *ev, int timo) { struct timeval now; gettimeofday(&now, NULL); ev->timeout = (now.tv_sec * 1000 + now.tv_usec / 1000) + timo; if (ev->queued) calctimeout = 1; } screen-5.0.2/resize.h0000664000175000017500000000101215224432722013112 0ustar alexalex#ifndef SCREEN_RESIZE_H #define SCREEN_RESIZE_H #include "window.h" int ChangeWindowSize (Window *, int, int, int); void ChangeScreenSize (int, int, int); void CheckScreenSize (int); void *xrealloc (void *, size_t); void ResizeLayersToCanvases (void); void ResizeLayer (Layer *, int, int, Display *); int MayResizeLayer (Layer *); void FreeAltScreen (Window *); void EnterAltScreen (Window *); void LeaveAltScreen (Window *); /* global variables */ extern struct winsize glwz; #endif /* SCREEN_RESIZE_H */ screen-5.0.2/resize.c0000664000175000017500000004660315224432722013124 0ustar alexalex/* Copyright (c) 2008, 2009 * Juergen Weigert (jnweiger@immd4.informatik.uni-erlangen.de) * Michael Schroeder (mlschroe@immd4.informatik.uni-erlangen.de) * Micah Cowan (micah@cowan.name) * Sadrul Habib Chowdhury (sadrul@users.sourceforge.net) * Copyright (c) 1993-2002, 2003, 2005, 2006, 2007 * Juergen Weigert (jnweiger@immd4.informatik.uni-erlangen.de) * Michael Schroeder (mlschroe@immd4.informatik.uni-erlangen.de) * Copyright (c) 1987 Oliver Laumann * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3, or (at your option) * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program (see the file COPYING); if not, see * https://www.gnu.org/licenses/, or contact Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02111-1301 USA * **************************************************************** */ #include "config.h" #include "resize.h" #include #include #include #include #include #include "screen.h" #include "process.h" #include "telnet.h" /* maximum window width */ #define MAXWIDTH 1000 static void CheckMaxSize(int); static void FreeMline(struct mline *); static int AllocMline(struct mline *ml, int); static void MakeBlankLine(uint32_t *, int); static void kaablamm(void); static int BcopyMline(struct mline *, int, struct mline *, int, int, int); static void SwapAltScreen(Window *); struct winsize glwz; static struct mline mline_zero = { .image = NULL, .attr = NULL, .font = NULL, .colorbg = NULL, .colorfg = NULL }; /* * ChangeFlag: 0: try to modify no window * 1: modify fore (and try to modify no other) + redisplay * 2: modify all windows * * Note: Activate() is only called if change_flag == 1 * i.e. on a WINCH event */ void CheckScreenSize(int change_flag) { int wi, he; if (display == NULL) { return; } if (ioctl(D_userfd, TIOCGWINSZ, (char *)&glwz) != 0) { wi = D_CO; he = D_LI; } else { wi = glwz.ws_col; he = glwz.ws_row; if (wi == 0) wi = D_CO; if (he == 0) he = D_LI; } if (D_width == wi && D_height == he) { return; } KillBlanker(); ResetIdle(); ChangeScreenSize(wi, he, change_flag); } void ChangeScreenSize(int wi, int he, int change_fore) { Window *p; Canvas *cv; int wwi; cv = &D_canvas; cv->c_xe = wi - 1; cv->c_ys = ((cv->c_slperp && cv->c_slperp->c_slnext) || captionalways) * captiontop + (D_has_hstatus == HSTATUS_FIRSTLINE); cv->c_ye = he - 1 - ((cv->c_slperp && cv->c_slperp->c_slnext) || captionalways) * !captiontop - (D_has_hstatus == HSTATUS_LASTLINE); cv->c_blank.l_height = cv->c_ye - cv->c_ys + 1; if (cv->c_slperp) { ResizeCanvas(cv); RecreateCanvasChain(); RethinkDisplayViewports(); } if (D_forecv == NULL) D_forecv = D_cvlist; if (D_forecv) D_fore = Layer2Window(D_forecv->c_layer); D_width = wi; D_height = he; CheckMaxSize(wi); if (D_CWS) { D_defwidth = D_CO; D_defheight = D_LI; } else { if (D_CZ0 && (wi == Z0width || wi == Z1width) && (D_CO == Z0width || D_CO == Z1width)) D_defwidth = D_CO; else D_defwidth = wi; D_defheight = he; } if (change_fore) ResizeLayersToCanvases(); if (change_fore == 2 && D_CWS == NULL && displays->d_next == NULL) { /* adapt all windows - to be removed ? */ for (p = mru_window; p; p = p->w_prev_mru) { wwi = wi; if (p->w_savelayer && p->w_savelayer->l_cvlist == NULL) ResizeLayer(p->w_savelayer, wwi, he, NULL); } } } void ResizeLayersToCanvases(void) { Canvas *cv; Layer *l; int lx, ly; D_kaablamm = 0; for (cv = D_cvlist; cv; cv = cv->c_next) { l = cv->c_layer; if (l == NULL) continue; if (l->l_width == cv->c_xe - cv->c_xs + 1 && l->l_height == cv->c_ye - cv->c_ys + 1) { continue; } if (MayResizeLayer(l)) { ResizeLayer(l, cv->c_xe - cv->c_xs + 1, cv->c_ye - cv->c_ys + 1, display); } /* normalize window, see screen.c */ lx = cv->c_layer->l_x; ly = cv->c_layer->l_y; if (ly + cv->c_yoff < cv->c_ys) { cv->c_yoff = cv->c_ys - ly; RethinkViewportOffsets(cv); } else if (ly + cv->c_yoff > cv->c_ye) { cv->c_yoff = cv->c_ye - ly; RethinkViewportOffsets(cv); } if (lx + cv->c_xoff < cv->c_xs) { int n = cv->c_xs - (lx + cv->c_xoff); if (n < (cv->c_xe - cv->c_xs + 1) / 2) n = (cv->c_xe - cv->c_xs + 1) / 2; if (cv->c_xoff + n > cv->c_xs) n = cv->c_xs - cv->c_xoff; cv->c_xoff += n; RethinkViewportOffsets(cv); } else if (lx + cv->c_xoff > cv->c_xe) { int n = lx + cv->c_xoff - cv->c_xe; if (n < (cv->c_xe - cv->c_xs + 1) / 2) n = (cv->c_xe - cv->c_xs + 1) / 2; if (cv->c_xoff - n + cv->c_layer->l_width - 1 < cv->c_xe) n = cv->c_xoff + cv->c_layer->l_width - 1 - cv->c_xe; cv->c_xoff -= n; RethinkViewportOffsets(cv); } } Redisplay(0); if (D_kaablamm) { kaablamm(); D_kaablamm = 0; } } int MayResizeLayer(Layer *l) { int cvs = 0; for (; l; l = l->l_next) { if (l->l_cvlist) if (++cvs > 1 || l->l_cvlist->c_lnext) { return 0; } } return 1; } /* * Easy implementation: rely on the fact that the only layers * supporting resize are Win and Blank. So just kill all overlays. * * This is a lot harder if done the right way... */ static void kaablamm(void) { Msg(0, "Aborted because of window size change."); } /* Kills non-resizable layers. */ #define RESIZE_OR_KILL_LAYERS(l, wi, he) \ do { \ Layer *_last = NULL; \ flayer = (l); \ while (flayer->l_next) { \ if (LayResize(wi, he) == 0) { \ _last = flayer; \ flayer = flayer->l_next; \ } else { \ Canvas *_cv; \ for (_cv = flayer->l_cvlist; _cv; _cv = _cv->c_lnext) \ _cv->c_display->d_kaablamm = 1; \ ExitOverlayPage(); \ if (_last) \ _last->l_next = flayer; \ } \ } \ /* We assume that the bottom-most layer, i.e. when flayer->l_next == 0, \ * is always resizable. Currently, WinLf and BlankLf can be the bottom-most layers. \ */ \ LayResize(wi, he); \ } while (0) void ResizeLayer(Layer *l, int wi, int he, Display *norefdisp) { Window *p; Canvas *cv; Layer *oldflayer = flayer; Display *d, *olddisplay = display; if (l->l_width == wi && l->l_height == he) return; p = Layer2Window(l); /* If 'flayer' and 'l' are for the same window, then we will not * restore 'flayer'. */ if (oldflayer && (l == oldflayer || Layer2Window(oldflayer) == p)) oldflayer = NULL; flayer = l; if (p) { /* It's a window layer. Kill the overlays on it in all displays. */ for (d = displays; d; d = d->d_next) for (cv = d->d_cvlist; cv; cv = cv->c_next) { if (p == Layer2Window(cv->c_layer)) { /* Canvas 'cv' on display 'd' shows this window. Remove any non-resizable * layers over it. */ RESIZE_OR_KILL_LAYERS(cv->c_layer, wi, he); } } } else { /* It's a Blank layer. Just kill the non-resizable overlays over it. */ RESIZE_OR_KILL_LAYERS(flayer, wi, he); } for (display = displays; display; display = display->d_next) { if (display == norefdisp) continue; for (cv = D_cvlist; cv; cv = cv->c_next) if (Layer2Window(cv->c_layer) == p) { CV_CALL(cv, LayRedisplayLine(-1, -1, -1, 0)); RefreshArea(cv->c_xs, cv->c_ys, cv->c_xe, cv->c_ye, 0); } if (D_kaablamm) { kaablamm(); D_kaablamm = 0; } } /* If we started resizing a non-flayer layer, then restore the flayer. * Otherwise, flayer should already be updated to the topmost foreground layer. */ if (oldflayer) flayer = oldflayer; display = olddisplay; } static void FreeMline(struct mline *ml) { if (ml->image) free(ml->image); if (ml->attr && ml->attr != null) free(ml->attr); if (ml->font && ml->font != null) free(ml->font); if (ml->colorbg && ml->colorbg != null) free(ml->colorbg); if (ml->colorfg && ml->colorfg != null) free(ml->colorfg); *ml = mline_zero; } static int AllocMline(struct mline *ml, int w) { ml->image = malloc(w * 4); ml->attr = null; ml->font = null; ml->colorbg = null; ml->colorfg = null; if (ml->image == NULL) return -1; return 0; } static int BcopyMline(struct mline *mlf, int xf, struct mline *mlt, int xt, int l, int w) { int r = 0; memmove(mlt->image + xt, mlf->image + xf, l * 4); if (mlf->attr != null && mlt->attr == null) { if ((mlt->attr = calloc(w, 4)) == NULL) mlt->attr = null, r = -1; } if (mlt->attr != null) memmove(mlt->attr + xt, mlf->attr + xf, l * 4); if (mlf->font != null && mlt->font == null) { if ((mlt->font = calloc(w, 4)) == NULL) mlt->font = null, r = -1; } if (mlt->font != null) memmove(mlt->font + xt, mlf->font + xf, l * 4); if (mlf->colorbg != null && mlt->colorbg == null) { if ((mlt->colorbg = calloc(w, 4)) == NULL) mlt->colorbg = null, r = -1; } if (mlt->colorbg != null) memmove(mlt->colorbg + xt, mlf->colorbg + xf, l * 4); if (mlf->colorfg != null && mlt->colorfg == null) { if ((mlt->colorfg = calloc(w, 4)) == NULL) mlt->colorfg = null, r = -1; } if (mlt->colorfg != null) memmove(mlt->colorfg + xt, mlf->colorfg + xf, l * 4); return r; } static int maxwidth; static void CheckMaxSize(int wi) { uint32_t *oldnull = null; uint32_t *oldblank = blank; Window *p; int i; struct mline *ml; if (wi > MAXWIDTH) wi = MAXWIDTH; if (wi <= maxwidth) return; maxwidth = wi + 1; blank = xrealloc(blank, maxwidth * 4); null = xrealloc(null, maxwidth * 4); mline_old.image = xrealloc(mline_old.image, maxwidth * 4); mline_old.attr = xrealloc(mline_old.attr, maxwidth * 4); mline_old.font = xrealloc(mline_old.font, maxwidth * 4); mline_old.colorbg = xrealloc(mline_old.colorbg, maxwidth * 4); mline_old.colorfg = xrealloc(mline_old.colorfg, maxwidth * 4); if (!(blank && null && mline_old.image && mline_old.attr && mline_old.font && mline_old.colorbg && mline_old.colorfg)) Panic(0, "%s", strnomem); MakeBlankLine(blank, maxwidth); memset(null, 0, maxwidth * 4); mline_blank.image = blank; mline_blank.attr = null; mline_null.image = null; mline_null.attr = null; mline_blank.font = null; mline_null.font = null; mline_blank.colorbg = null; mline_null.colorbg = null; mline_blank.colorfg = null; mline_null.colorfg = null; #define RESET_AFC(x, bl) \ do { \ if (x == old##bl) \ x = bl; \ } while (0) #define RESET_LINES(lines, count) \ do { \ ml = lines; \ for (i = 0; i < count; i++, ml++) { \ RESET_AFC(ml->image, blank); \ RESET_AFC(ml->attr, null); \ RESET_AFC(ml->font, null); \ RESET_AFC(ml->colorbg, null); \ RESET_AFC(ml->colorfg, null); \ } \ } while (0) /* We have to run through all windows to substitute * the null and blank references. */ for (p = mru_window; p; p = p->w_prev_mru) { RESET_LINES(p->w_mlines, p->w_height); RESET_LINES(p->w_hlines, p->w_histheight); RESET_LINES(p->w_alt.hlines, p->w_alt.histheight); RESET_LINES(p->w_alt.mlines, p->w_alt.height); } } void *xrealloc(void *mem, size_t len) { char *nmem; if (mem == NULL) return malloc(len); if ((nmem = realloc(mem, len))) return nmem; free(mem); return NULL; } static void MakeBlankLine(uint32_t *p, int n) { while (n--) *p++ = ' '; } #define OLDWIN(y) ((y < p->w_histheight) \ ? &p->w_hlines[(p->w_histidx + y) % p->w_histheight] \ : &p->w_mlines[y - p->w_histheight]) #define NEWWIN(y) ((y < hi) ? &nhlines[y] : &nmlines[y - hi]) int ChangeWindowSize(Window *p, int wi, int he, int hi) { struct mline *mlf = NULL, *mlt = NULL, *ml, *nmlines, *nhlines; int fy, ty, l, lx, lf, lt, yy, oty, addone; int ncx, ncy, naka, t; int y, shift; if (wi <= 0 || he <= 0) wi = he = hi = 0; if (p->w_type == W_TYPE_GROUP) return 0; if (wi > MAXWIDTH) { Msg(0, "Window width too large. Truncated to %d.", MAXWIDTH); wi = MAXWIDTH; } if (he > MAXWIDTH) { Msg(0, "Window height too large. Truncated to %d.", MAXWIDTH); he = MAXWIDTH; } if (p->w_width == wi && p->w_height == he && p->w_histheight == hi) { return 0; } CheckMaxSize(wi); fy = p->w_histheight + p->w_height - 1; ty = hi + he - 1; nmlines = nhlines = NULL; ncx = 0; ncy = 0; naka = 0; if (wi) { if (wi != p->w_width || he != p->w_height) { if ((nmlines = calloc(he, sizeof(struct mline))) == NULL) { KillWindow(p); Msg(0, "%s", strnomem); return -1; } } else { nmlines = p->w_mlines; fy -= he; ty -= he; ncx = p->w_x; ncy = p->w_y; naka = p->w_autoaka; } } if (hi) { if ((nhlines = calloc(hi, sizeof(struct mline))) == NULL) { Msg(0, "No memory for history buffer - turned off"); hi = 0; ty = he - 1; } } /* special case: cursor is at magic margin position */ addone = 0; if (p->w_width && p->w_x == p->w_width) { addone = 1; p->w_x--; } /* handle the cursor and autoaka lines now if the widths are equal */ if (p->w_width == wi) { ncx = p->w_x + addone; ncy = p->w_y + he - p->w_height; /* never lose sight of the line with the cursor on it */ shift = -ncy; for (yy = p->w_y + p->w_histheight - 1; yy >= 0 && ncy + shift < he; yy--) { ml = OLDWIN(yy); if (!ml->image) break; if (ml->image[p->w_width] == ' ') break; shift++; } if (shift < 0) shift = 0; ncy += shift; if (p->w_autoaka > 0) { naka = p->w_autoaka + he - p->w_height + shift; if (naka < 1 || naka > he) naka = 0; } while (shift-- > 0) { ml = OLDWIN(fy); FreeMline(ml); fy--; } } if (fy >= 0) mlf = OLDWIN(fy); if (ty >= 0) mlt = NEWWIN(ty); while (fy >= 0 && ty >= 0) { if (p->w_width == wi) { /* here is a simple shortcut: just copy over */ *mlt = *mlf; *mlf = mline_zero; if (--fy >= 0) mlf = OLDWIN(fy); if (--ty >= 0) mlt = NEWWIN(ty); continue; } /* calculate lenght */ for (l = p->w_width - 1; l > 0; l--) if (mlf->image[l] != ' ' || mlf->attr[l]) break; if (fy == p->w_y + p->w_histheight && l < p->w_x) l = p->w_x; /* cursor is non blank */ l++; lf = l; /* add wrapped lines to length */ for (yy = fy - 1; yy >= 0; yy--) { ml = OLDWIN(yy); if (ml->image[p->w_width] == ' ') break; l += p->w_width; } /* rewrap lines */ lt = (l - 1) % wi + 1; /* lf is set above */ oty = ty; while (l > 0 && fy >= 0 && ty >= 0) { lx = lt > lf ? lf : lt; if (mlt->image == NULL) { if (AllocMline(mlt, wi + 1)) goto nomem; MakeBlankLine(mlt->image + lt, wi - lt); mlt->image[wi] = ((oty == ty) ? ' ' : 0); } if (BcopyMline(mlf, lf - lx, mlt, lt - lx, lx, wi + 1)) goto nomem; /* did we copy the cursor ? */ if (fy == p->w_y + p->w_histheight && lf - lx <= p->w_x && lf > p->w_x) { ncx = p->w_x + lt - lf + addone; ncy = ty - hi; shift = wi ? -ncy + (l - lx) / wi : 0; if (ty + shift > hi + he - 1) shift = hi + he - 1 - ty; if (shift > 0) { for (y = hi + he - 1; y >= ty; y--) { mlt = NEWWIN(y); FreeMline(mlt); if (y - shift < ty) continue; ml = NEWWIN(y - shift); *mlt = *ml; *ml = mline_zero; } ncy += shift; ty += shift; mlt = NEWWIN(ty); if (naka > 0) naka = naka + shift > he ? 0 : naka + shift; } } /* did we copy autoaka line ? */ if (p->w_autoaka > 0 && fy == p->w_autoaka - 1 + p->w_histheight && lf - lx <= 0) naka = ty - hi >= 0 ? 1 + ty - hi : 0; lf -= lx; lt -= lx; l -= lx; if (lf == 0) { FreeMline(mlf); lf = p->w_width; if (--fy >= 0) mlf = OLDWIN(fy); } if (lt == 0) { lt = wi; if (--ty >= 0) mlt = NEWWIN(ty); } } } while (fy >= 0) { FreeMline(mlf); if (--fy >= 0) mlf = OLDWIN(fy); } while (ty >= 0) { if (AllocMline(mlt, wi + 1)) goto nomem; MakeBlankLine(mlt->image, wi + 1); if (--ty >= 0) mlt = NEWWIN(ty); } if (p->w_mlines && p->w_mlines != nmlines) free((char *)p->w_mlines); p->w_mlines = nmlines; if (p->w_hlines && p->w_hlines != nhlines) free((char *)p->w_hlines); p->w_hlines = nhlines; nmlines = nhlines = 0; /* change tabs */ if (p->w_width != wi) { if (wi) { t = p->w_tabs ? p->w_width : 0; p->w_tabs = xrealloc(p->w_tabs, (wi + 1) * 4); if (p->w_tabs == NULL) goto nomem; for (; t < wi; t++) p->w_tabs[t] = t && !(t & 7) ? 1 : 0; p->w_tabs[wi] = 0; } else { if (p->w_tabs) free(p->w_tabs); p->w_tabs = NULL; } } /* Change w_saved.y - this is only an estimate... */ p->w_saved.y += ncy - p->w_y; p->w_x = ncx; p->w_y = ncy; if (p->w_autoaka > 0) p->w_autoaka = naka; /* do sanity checks */ if (p->w_x > wi) p->w_x = wi; if (p->w_y >= he) p->w_y = he - 1; if (p->w_saved.x > wi) p->w_saved.x = wi; if (p->w_saved.y >= he) p->w_saved.y = he - 1; if (p->w_saved.y < 0) p->w_saved.y = 0; if (p->w_alt.cursor.x > wi) p->w_alt.cursor.x = wi; if (p->w_alt.cursor.y >= he) p->w_alt.cursor.y = he - 1; if (p->w_alt.cursor.y < 0) p->w_alt.cursor.y = 0; /* reset scrolling region */ p->w_top = 0; p->w_bot = he - 1; /* signal new size to window */ if (wi && (p->w_width != wi || p->w_height != he) && p->w_width != 0 && p->w_height != 0 && p->w_ptyfd >= 0 && p->w_pid) { glwz.ws_col = wi; glwz.ws_row = he; ioctl(p->w_ptyfd, TIOCSWINSZ, (char *)&glwz); } /* store new size */ p->w_width = wi; p->w_height = he; if(p->w_scrollback_height > hi) p->w_scrollback_height = hi; p->w_histidx = 0; p->w_histheight = hi; #ifdef ENABLE_TELNET if (p->w_type == W_TYPE_TELNET) TelWindowSize(p); #endif return 0; nomem: if (nmlines) { for (ty = he + hi - 1; ty >= 0; ty--) { mlt = NEWWIN(ty); FreeMline(mlt); } if (nmlines && p->w_mlines != nmlines) free((char *)nmlines); if (nhlines && p->w_hlines != nhlines) free((char *)nhlines); } KillWindow(p); Msg(0, "%s", strnomem); return -1; } void FreeAltScreen(Window *p) { int i; if (p->w_alt.mlines) { for (i = 0; i < p->w_alt.height; i++) FreeMline(p->w_alt.mlines + i); free(p->w_alt.mlines); } p->w_alt.mlines = NULL; p->w_alt.width = 0; p->w_alt.height = 0; if (p->w_alt.hlines) { for (i = 0; i < p->w_alt.histheight; i++) FreeMline(p->w_alt.hlines + i); free(p->w_alt.hlines); } p->w_alt.hlines = NULL; p->w_alt.histidx = 0; p->w_alt.histheight = 0; } static void SwapAltScreen(Window *p) { struct mline *ml; int t; #define SWAP(item, t) \ do { \ (t) = p->w_alt. item; \ p->w_alt. item = p->w_##item; \ p->w_##item = (t); \ } while (0) SWAP(mlines, ml); SWAP(width, t); SWAP(height, t); SWAP(histheight, t); SWAP(hlines, ml); SWAP(histidx, t); #undef SWAP } void EnterAltScreen(Window *p) { if (!p->w_alt.on) { /* If not already using the alternate screen buffer, then create a new one and swap it with the 'real' screen buffer. */ FreeAltScreen(p); SwapAltScreen(p); } else { /* Already using the alternate buffer. Just clear the screen. To do so, it is only necessary to reset the height(s) without resetting the width. */ p->w_height = 0; p->w_histheight = 0; } ChangeWindowSize(p, p->w_alt.width, p->w_alt.height, p->w_alt.histheight); p->w_alt.on = 1; } void LeaveAltScreen(Window *p) { if (!p->w_alt.on) return; SwapAltScreen(p); ChangeWindowSize(p, p->w_alt.width, p->w_alt.height, p->w_alt.histheight); FreeAltScreen(p); p->w_alt.on = 0; } screen-5.0.2/pty.h0000664000175000017500000000024515224432722012434 0ustar alexalex#ifndef SCREEN_PTY_H #define SCREEN_PTY_H int OpenPTY (char **); int ClosePTY (int); /* global variables */ extern int pty_preopen; #endif /* SCREEN_PTY_H */ screen-5.0.2/pty.c0000664000175000017500000000412015224432722012423 0ustar alexalex/* Copyright (c) 2008, 2009 * Juergen Weigert (jnweiger@immd4.informatik.uni-erlangen.de) * Michael Schroeder (mlschroe@immd4.informatik.uni-erlangen.de) * Micah Cowan (micah@cowan.name) * Sadrul Habib Chowdhury (sadrul@users.sourceforge.net) * Copyright (c) 1993-2002, 2003, 2005, 2006, 2007 * Juergen Weigert (jnweiger@immd4.informatik.uni-erlangen.de) * Michael Schroeder (mlschroe@immd4.informatik.uni-erlangen.de) * Copyright (c) 1987 Oliver Laumann * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3, or (at your option) * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program (see the file COPYING); if not, see * https://www.gnu.org/licenses/, or contact Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02111-1301 USA * **************************************************************** */ #include "config.h" #include "pty.h" #include #include "screen.h" #if defined(HAVE_PTY_H) # include #endif #if defined(HAVE_UTIL_H) # include #endif #if defined(HAVE_LIBUTIL_H) # include #endif int pty_preopen = 0; /***************************************************************/ int OpenPTY(char **ttyn) { static char TtyName[32]; int f, s; if (openpty(&f, &s, TtyName, NULL, NULL) != 0) return -1; close(s); tcflush(f, TCIOFLUSH); #if defined(LOCKPTY) && defined(TIOCEXCL) && defined(TIOCNXCL) (void)ioctl(f, TIOCEXCL, NULL); #endif pty_preopen = 1; *ttyn = TtyName; return f; } int ClosePTY(int fd) { #if defined(LOCKPTY) && defined(TIOCEXCL) && defined(TIOCNXCL) (void)ioctl(fd, TIOCNXCL, NULL); #endif return close(fd); } screen-5.0.2/process.h0000664000175000017500000000302515224432722013275 0ustar alexalex#ifndef SCREEN_PROCESS_H #define SCREEN_PROCESS_H #include "winmsgbuf.h" void InitKeytab (void); void ProcessInput (char *, size_t); void ProcessInput2 (char *, size_t); void DoProcess (Window *, char **, size_t *, struct paster *); void DoAction (struct action *); int FindCommnr (const char *); void DoCommand (char **, int *); void Activate (int); void KillWindow (Window *); void SetForeWindow (Window *); int Parse (char *, int, char **, int *); void SetEscape (struct acluser *, int, int); void DoScreen (char *, char **); int IsNumColon (char *, char *, int); void ShowWindows (struct action *, int); char *AddWindows (WinMsgBufContext *, int, int, int); char *AddWindowFlags (char *, int, Window *); char *AddOtherUsers (char *, int, Window *); int WindowByNoN (char *); Window *FindNiceWindow (Window *, char *); int CompileKeys (char *, int, unsigned char *); void RefreshXtermOSC (void); uint64_t ParseAttrColor (char *, int); void ApplyAttrColor (uint64_t, struct mchar *); void SwitchWindow (Window *); int StuffKey (int); /* global variables */ extern bool hardcopy_append; extern char *noargs[]; extern char NullStr[]; extern char *zmodem_recvcmd; extern char *zmodem_sendcmd; extern int idletimo; extern int kmap_extn; extern int zmodem_mode; extern int TtyMode; extern struct action idleaction; extern struct action dmtab[]; extern struct action ktab[]; extern struct action mmtab[]; extern struct action umtab[]; extern struct kmap_ext *kmap_exts; extern int maptimeout; #endif /* SCREEN_PROCESS_H */ screen-5.0.2/process.c0000664000175000017500000051233215224432722013276 0ustar alexalex/* Copyright (c) 2013, 2015 * Mike Gerwitz (mtg@gnu.org) * Copyright (c) 2010 * Juergen Weigert (jnweiger@immd4.informatik.uni-erlangen.de) * Sadrul Habib Chowdhury (sadrul@users.sourceforge.net) * Copyright (c) 2008, 2009 * Juergen Weigert (jnweiger@immd4.informatik.uni-erlangen.de) * Michael Schroeder (mlschroe@immd4.informatik.uni-erlangen.de) * Micah Cowan (micah@cowan.name) * Sadrul Habib Chowdhury (sadrul@users.sourceforge.net) * Copyright (c) 1993-2002, 2003, 2005, 2006, 2007 * Juergen Weigert (jnweiger@immd4.informatik.uni-erlangen.de) * Michael Schroeder (mlschroe@immd4.informatik.uni-erlangen.de) * Copyright (c) 1987 Oliver Laumann * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3, or (at your option) * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program (see the file COPYING); if not, see * https://www.gnu.org/licenses/, or contact Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02111-1301 USA * **************************************************************** */ #include "config.h" #include "process.h" #include #include #include #include #include #include #include #include #include #include "screen.h" #include "display.h" #include "encoding.h" #include "fileio.h" #include "help.h" #include "input.h" #include "kmapdef.h" #include "layout.h" #include "list_generic.h" #include "logfile.h" #include "mark.h" #include "misc.h" #include "resize.h" #include "search.h" #include "socket.h" #include "telnet.h" #include "termcap.h" #include "tty.h" #include "utmp.h" #include "viewport.h" #include "winmsg.h" static int CheckArgNum(int, char **); static void ClearAction(struct action *); static void SaveAction(struct action *, int, char **, int *); static Window *NextWindow(void); static Window *PreviousWindow(void); static Window *ParentWindow(void); static int MoreWindows(void); static void CollapseWindowlist(void); static void LogToggle(bool); static void ShowInfo(void); static void ShowDInfo(void); static Window *WindowByName(char *); static int WindowByNumber(char *); static int ParseSwitch(struct action *, bool *); static int ParseOnOff(struct action *, bool *); static int ParseWinNum(struct action *, int *); static int ParseBase(struct action *, char *, int *, int, char *); static int ParseSaveStr(struct action *, char **); static int ParseNum(struct action *, int *); static int ParseNum1000(struct action *, int *); static char **SaveArgs(char **); static bool IsNum(char *); static void ColonFin(char *, size_t, void *); static void InputSelect(void); static void InputSetenv(char *); static void InputAKA(void); static int InputSu(struct acluser **, char *); static void suFin(char *, size_t, void *); static void AKAFin(char *, size_t, void *); static void copy_reg_fn(char *, size_t, void *); static void ins_reg_fn(char *, size_t, void *); static void process_fn(char *, size_t, void *); static void digraph_fn(char *, size_t, void *); static int digraph_find(const char *buf); static void confirm_fn(char *, size_t, void *); static int IsOnDisplay(Window *); static void ResizeRegions(char *, int); static void ResizeFin(char *, size_t, void *); static struct action *FindKtab(char *, int); static void SelectFin(char *, size_t, void *); static void SelectLayoutFin(char *, size_t, void *); static void ShowWindowsX(char *); char NullStr[] = ""; struct plop plop_tab[MAX_PLOP_DEFS]; #ifndef PTY_MODE #define PTY_MODE 0620 #endif int TtyMode = PTY_MODE; bool hardcopy_append = false; bool all_norefresh = 0; int zmodem_mode = 0; char *zmodem_sendcmd; char *zmodem_recvcmd; static char *zmodes[4] = { "off", "auto", "catch", "pass" }; int idletimo; struct action idleaction; char **blankerprg; struct action ktab[256 + KMAP_KEYS]; /* command key translation table */ struct kclass { struct kclass *next; char *name; struct action ktab[256 + KMAP_KEYS]; }; struct kclass *kclasses; struct action umtab[KMAP_KEYS + KMAP_AKEYS]; struct action dmtab[KMAP_KEYS + KMAP_AKEYS]; struct action mmtab[KMAP_KEYS + KMAP_AKEYS]; struct kmap_ext *kmap_exts; int kmap_extn; int maptimeout = 300; #ifndef MAX_DIGRAPH #define MAX_DIGRAPH 512 #endif struct digraph { unsigned char d[2]; int value; }; /* digraph table taken from old vim and rfc1345 */ static struct digraph digraphs[MAX_DIGRAPH + 1] = { {{' ', ' '}, 160}, /*   */ {{'N', 'S'}, 160}, /*   */ {{'~', '!'}, 161}, /* ¡ */ {{'!', '!'}, 161}, /* ¡ */ {{'!', 'I'}, 161}, /* ¡ */ {{'c', '|'}, 162}, /* ¢ */ {{'c', 't'}, 162}, /* ¢ */ {{'$', '$'}, 163}, /* £ */ {{'P', 'd'}, 163}, /* £ */ {{'o', 'x'}, 164}, /* ¤ */ {{'C', 'u'}, 164}, /* ¤ */ {{'C', 'u'}, 164}, /* ¤ */ {{'E', 'u'}, 164}, /* ¤ */ {{'Y', '-'}, 165}, /* Â¥ */ {{'Y', 'e'}, 165}, /* Â¥ */ {{'|', '|'}, 166}, /* ¦ */ {{'B', 'B'}, 166}, /* ¦ */ {{'p', 'a'}, 167}, /* § */ {{'S', 'E'}, 167}, /* § */ {{'"', '"'}, 168}, /* ¨ */ {{'\'', ':'}, 168}, /* ¨ */ {{'c', 'O'}, 169}, /* © */ {{'C', 'o'}, 169}, /* © */ {{'a', '-'}, 170}, /* ª */ {{'<', '<'}, 171}, /* « */ {{'-', ','}, 172}, /* ¬ */ {{'N', 'O'}, 172}, /* ¬ */ {{'-', '-'}, 173}, /* ­ */ {{'r', 'O'}, 174}, /* ® */ {{'R', 'g'}, 174}, /* ® */ {{'-', '='}, 175}, /* ¯ */ {{'\'', 'm'}, 175}, /* ¯ */ {{'~', 'o'}, 176}, /* ° */ {{'D', 'G'}, 176}, /* ° */ {{'+', '-'}, 177}, /* ± */ {{'2', '2'}, 178}, /* ² */ {{'2', 'S'}, 178}, /* ² */ {{'3', '3'}, 179}, /* ³ */ {{'3', 'S'}, 179}, /* ³ */ {{'\'', '\''}, 180}, /* ´ */ {{'j', 'u'}, 181}, /* µ */ {{'M', 'y'}, 181}, /* µ */ {{'p', 'p'}, 182}, /* ¶ */ {{'P', 'I'}, 182}, /* ¶ */ {{'~', '.'}, 183}, /* · */ {{'.', 'M'}, 183}, /* · */ {{',', ','}, 184}, /* ¸ */ {{'\'', ','}, 184}, /* ¸ */ {{'1', '1'}, 185}, /* ¹ */ {{'1', 'S'}, 185}, /* ¹ */ {{'o', '-'}, 186}, /* º */ {{'>', '>'}, 187}, /* » */ {{'1', '4'}, 188}, /* ¼ */ {{'1', '2'}, 189}, /* ½ */ {{'3', '4'}, 190}, /* ¾ */ {{'~', '?'}, 191}, /* ¿ */ {{'?', '?'}, 191}, /* ¿ */ {{'?', 'I'}, 191}, /* ¿ */ {{'A', '`'}, 192}, /* À */ {{'A', '!'}, 192}, /* À */ {{'A', '\''}, 193}, /* à */ {{'A', '^'}, 194}, /*  */ {{'A', '>'}, 194}, /*  */ {{'A', '~'}, 195}, /* à */ {{'A', '?'}, 195}, /* à */ {{'A', '"'}, 196}, /* Ä */ {{'A', ':'}, 196}, /* Ä */ {{'A', '@'}, 197}, /* Ã… */ {{'A', 'A'}, 197}, /* Ã… */ {{'A', 'E'}, 198}, /* Æ */ {{'C', ','}, 199}, /* Ç */ {{'E', '`'}, 200}, /* È */ {{'E', '!'}, 200}, /* È */ {{'E', '\''}, 201}, /* É */ {{'E', '^'}, 202}, /* Ê */ {{'E', '>'}, 202}, /* Ê */ {{'E', '"'}, 203}, /* Ë */ {{'E', ':'}, 203}, /* Ë */ {{'I', '`'}, 204}, /* ÃŒ */ {{'I', '!'}, 204}, /* ÃŒ */ {{'I', '\''}, 205}, /* à */ {{'I', '^'}, 206}, /* ÃŽ */ {{'I', '>'}, 206}, /* ÃŽ */ {{'I', '"'}, 207}, /* à */ {{'I', ':'}, 207}, /* à */ {{'D', '-'}, 208}, /* à */ {{'N', '~'}, 209}, /* Ñ */ {{'N', '?'}, 209}, /* Ñ */ {{'O', '`'}, 210}, /* Ã’ */ {{'O', '!'}, 210}, /* Ã’ */ {{'O', '\''}, 211}, /* Ó */ {{'O', '^'}, 212}, /* Ô */ {{'O', '>'}, 212}, /* Ô */ {{'O', '~'}, 213}, /* Õ */ {{'O', '?'}, 213}, /* Õ */ {{'O', '"'}, 214}, /* Ö */ {{'O', ':'}, 214}, /* Ö */ {{'/', '\\'}, 215}, /* × */ {{'*', 'x'}, 215}, /* × */ {{'O', '/'}, 216}, /* Ø */ {{'U', '`'}, 217}, /* Ù */ {{'U', '!'}, 217}, /* Ù */ {{'U', '\''}, 218}, /* Ú */ {{'U', '^'}, 219}, /* Û */ {{'U', '>'}, 219}, /* Û */ {{'U', '"'}, 220}, /* Ü */ {{'U', ':'}, 220}, /* Ü */ {{'Y', '\''}, 221}, /* à */ {{'I', 'p'}, 222}, /* Þ */ {{'T', 'H'}, 222}, /* Þ */ {{'s', 's'}, 223}, /* ß */ {{'s', '"'}, 223}, /* ß */ {{'a', '`'}, 224}, /* à */ {{'a', '!'}, 224}, /* à */ {{'a', '\''}, 225}, /* á */ {{'a', '^'}, 226}, /* â */ {{'a', '>'}, 226}, /* â */ {{'a', '~'}, 227}, /* ã */ {{'a', '?'}, 227}, /* ã */ {{'a', '"'}, 228}, /* ä */ {{'a', ':'}, 228}, /* ä */ {{'a', 'a'}, 229}, /* Ã¥ */ {{'a', 'e'}, 230}, /* æ */ {{'c', ','}, 231}, /* ç */ {{'e', '`'}, 232}, /* è */ {{'e', '!'}, 232}, /* è */ {{'e', '\''}, 233}, /* é */ {{'e', '^'}, 234}, /* ê */ {{'e', '>'}, 234}, /* ê */ {{'e', '"'}, 235}, /* ë */ {{'e', ':'}, 235}, /* ë */ {{'i', '`'}, 236}, /* ì */ {{'i', '!'}, 236}, /* ì */ {{'i', '\''}, 237}, /* í */ {{'i', '^'}, 238}, /* î */ {{'i', '>'}, 238}, /* î */ {{'i', '"'}, 239}, /* ï */ {{'i', ':'}, 239}, /* ï */ {{'d', '-'}, 240}, /* ð */ {{'n', '~'}, 241}, /* ñ */ {{'n', '?'}, 241}, /* ñ */ {{'o', '`'}, 242}, /* ò */ {{'o', '!'}, 242}, /* ò */ {{'o', '\''}, 243}, /* ó */ {{'o', '^'}, 244}, /* ô */ {{'o', '>'}, 244}, /* ô */ {{'o', '~'}, 245}, /* õ */ {{'o', '?'}, 245}, /* õ */ {{'o', '"'}, 246}, /* ö */ {{'o', ':'}, 246}, /* ö */ {{':', '-'}, 247}, /* ÷ */ {{'o', '/'}, 248}, /* ø */ {{'u', '`'}, 249}, /* ù */ {{'u', '!'}, 249}, /* ù */ {{'u', '\''}, 250}, /* ú */ {{'u', '^'}, 251}, /* û */ {{'u', '>'}, 251}, /* û */ {{'u', '"'}, 252}, /* ü */ {{'u', ':'}, 252}, /* ü */ {{'y', '\''}, 253}, /* ý */ {{'i', 'p'}, 254}, /* þ */ {{'t', 'h'}, 254}, /* þ */ {{'y', '"'}, 255}, /* ÿ */ {{'y', ':'}, 255}, /* ÿ */ {{'"', '['}, 196}, /* Ä */ {{'"', '\\'}, 214}, /* Ö */ {{'"', ']'}, 220}, /* Ü */ {{'"', '{'}, 228}, /* ä */ {{'"', '|'}, 246}, /* ö */ {{'"', '}'}, 252}, /* ü */ {{'"', '~'}, 223} /* ß */ }; #define RESIZE_FLAG_H 1 #define RESIZE_FLAG_V 2 #define RESIZE_FLAG_L 4 static char *resizeprompts[] = { "resize # lines: ", "resize -h # columns: ", "resize -v # lines: ", "resize -b # columns: ", "resize -l # lines: ", "resize -l -h # columns: ", "resize -l -v # lines: ", "resize -l -b # columns: ", }; static int parse_input_int(const char *buf, size_t len, int *val) { int x = 0; size_t i; if (len >= 1 && ((*buf == 'U' && buf[1] == '+') || (*buf == '0' && (buf[1] == 'x' || buf[1] == 'X')))) { x = 0; for (i = 2; i < len; i++) { if (buf[i] >= '0' && buf[i] <= '9') x = x * 16 | (buf[i] - '0'); else if (buf[i] >= 'a' && buf[i] <= 'f') x = x * 16 | (buf[i] - ('a' - 10)); else if (buf[i] >= 'A' && buf[i] <= 'F') x = x * 16 | (buf[i] - ('A' - 10)); else return 0; } } else if (buf[0] == '0') { x = 0; for (i = 1; i < len; i++) { if (buf[i] < '0' || buf[i] > '7') return 0; x = x * 8 | (buf[i] - '0'); } } else return 0; *val = x; return 1; } char *noargs[1]; int enter_window_name_mode = 0; void InitKeytab(void) { unsigned int i; char *argarr[2]; for (i = 0; i < ARRAY_SIZE(ktab); i++) { ktab[i].nr = RC_ILLEGAL; ktab[i].args = noargs; ktab[i].argl = NULL; } for (i = 0; i < KMAP_KEYS + KMAP_AKEYS; i++) { umtab[i].nr = RC_ILLEGAL; umtab[i].args = noargs; umtab[i].argl = NULL; dmtab[i].nr = RC_ILLEGAL; dmtab[i].args = noargs; dmtab[i].argl = NULL; mmtab[i].nr = RC_ILLEGAL; mmtab[i].args = noargs; mmtab[i].argl = NULL; } argarr[1] = NULL; for (i = 0; i < NKMAPDEF; i++) { if (i + KMAPDEFSTART < T_CAPS) continue; if (i + KMAPDEFSTART >= T_CAPS + KMAP_KEYS) continue; if (kmapdef[i] == NULL) continue; argarr[0] = kmapdef[i]; SaveAction(dmtab + i + (KMAPDEFSTART - T_CAPS), RC_STUFF, argarr, NULL); } for (i = 0; i < NKMAPADEF; i++) { if (i + KMAPADEFSTART < T_CURSOR) continue; if (i + KMAPADEFSTART >= T_CURSOR + KMAP_AKEYS) continue; if (kmapadef[i] == NULL) continue; argarr[0] = kmapadef[i]; SaveAction(dmtab + i + (KMAPADEFSTART - T_CURSOR + KMAP_KEYS), RC_STUFF, argarr, NULL); } for (i = 0; i < NKMAPMDEF; i++) { if (i + KMAPMDEFSTART < T_CAPS) continue; if (i + KMAPMDEFSTART >= T_CAPS + KMAP_KEYS) continue; if (kmapmdef[i] == NULL) continue; argarr[0] = kmapmdef[i]; argarr[1] = NULL; SaveAction(mmtab + i + (KMAPMDEFSTART - T_CAPS), RC_STUFF, argarr, NULL); } ktab['h'].nr = RC_HARDCOPY; ktab['z'].nr = ktab[Ctrl('z')].nr = RC_SUSPEND; ktab['c'].nr = ktab[Ctrl('c')].nr = RC_SCREEN; ktab[' '].nr = ktab[Ctrl(' ')].nr = ktab['n'].nr = ktab[Ctrl('n')].nr = RC_NEXT; ktab['N'].nr = RC_NUMBER; ktab[Ctrl('h')].nr = ktab[0177].nr = ktab['p'].nr = ktab[Ctrl('p')].nr = RC_PREV; ktab['u'].nr = ktab[Ctrl('u')].nr = RC_PARENT; { char *args[2]; args[0] = "--confirm"; args[1] = NULL; SaveAction(ktab + 'k', RC_KILL, args, NULL); SaveAction(ktab + Ctrl('k'), RC_KILL, args, NULL); } ktab['l'].nr = ktab[Ctrl('l')].nr = RC_REDISPLAY; ktab['w'].nr = ktab[Ctrl('w')].nr = RC_WINDOWS; ktab['v'].nr = RC_VERSION; ktab[Ctrl('v')].nr = RC_DIGRAPH; ktab['q'].nr = ktab[Ctrl('q')].nr = RC_XON; ktab['s'].nr = ktab[Ctrl('s')].nr = RC_XOFF; ktab['i'].nr = ktab[Ctrl('i')].nr = RC_INFO; ktab['m'].nr = ktab[Ctrl('m')].nr = RC_LASTMSG; ktab['A'].nr = RC_TITLE; #if defined(ENABLE_UTMP) ktab['L'].nr = RC_LOGIN; #endif ktab[','].nr = RC_LICENSE; ktab['W'].nr = RC_WIDTH; ktab['.'].nr = RC_DUMPTERMCAP; { char *args[2]; args[0] = "--confirm"; args[1] = NULL; SaveAction(ktab + Ctrl('\\'), RC_QUIT, args, NULL); } ktab['d'].nr = ktab[Ctrl('d')].nr = RC_DETACH; { char *args[2]; args[0] = "--confirm"; args[1] = NULL; SaveAction(ktab + 'D', RC_POW_DETACH, args, NULL); } ktab['r'].nr = ktab[Ctrl('r')].nr = RC_WRAP; ktab['f'].nr = ktab[Ctrl('f')].nr = RC_FLOW; ktab['C'].nr = RC_CLEAR; ktab['Z'].nr = RC_RESET; ktab['H'].nr = RC_LOG; ktab['M'].nr = RC_MONITOR; ktab['?'].nr = RC_HELP; ktab['*'].nr = RC_DISPLAYS; { char *args[2]; args[0] = "-"; args[1] = NULL; SaveAction(ktab + '-', RC_SELECT, args, NULL); } for (i = 0; i < 10; i++) { char *args[2], arg1[10]; args[0] = arg1; args[1] = NULL; sprintf(arg1, "%d", i); SaveAction(ktab + '0' + i, RC_SELECT, args, NULL); } ktab['\''].nr = RC_SELECT; /* calling a window by name */ { char *args[2]; args[0] = "-b"; args[1] = NULL; SaveAction(ktab + '"', RC_WINDOWLIST, args, NULL); } ktab[Ctrl('G')].nr = RC_VBELL; ktab[':'].nr = RC_COLON; ktab['['].nr = ktab[Ctrl('[')].nr = RC_COPY; { char *args[2]; args[0] = "."; args[1] = NULL; SaveAction(ktab + ']', RC_PASTE, args, NULL); SaveAction(ktab + Ctrl(']'), RC_PASTE, args, NULL); } ktab['{'].nr = RC_HISTORY; ktab['}'].nr = RC_HISTORY; ktab['>'].nr = RC_WRITEBUF; ktab['<'].nr = RC_READBUF; ktab['='].nr = RC_REMOVEBUF; ktab['x'].nr = ktab[Ctrl('x')].nr = RC_LOCKSCREEN; ktab['b'].nr = ktab[Ctrl('b')].nr = RC_BREAK; ktab['B'].nr = RC_POW_BREAK; ktab['_'].nr = RC_SILENCE; ktab['S'].nr = RC_SPLIT; ktab['Q'].nr = RC_ONLY; ktab['X'].nr = RC_REMOVE; ktab['F'].nr = RC_FIT; ktab['\t'].nr = RC_FOCUS; { char *args[2]; args[0] = "prev"; args[1] = NULL; SaveAction(ktab + T_BACKTAB - T_CAPS + 256, RC_FOCUS, args, NULL); } { char *args[2]; args[0] = "-v"; args[1] = NULL; SaveAction(ktab + '|', RC_SPLIT, args, NULL); } /* These come last; they may want overwrite others: */ if (DefaultEsc >= 0) { ClearAction(&ktab[DefaultEsc]); ktab[DefaultEsc].nr = RC_OTHER; } if (DefaultMetaEsc >= 0) { ClearAction(&ktab[DefaultMetaEsc]); ktab[DefaultMetaEsc].nr = RC_META; } idleaction.nr = RC_BLANKER; idleaction.args = noargs; idleaction.argl = NULL; } static struct action *FindKtab(char *class, int create) { struct kclass *kp, **kpp; int i; if (class == NULL) return ktab; for (kpp = &kclasses; (kp = *kpp) != NULL; kpp = &kp->next) if (!strcmp(kp->name, class)) break; if (kp == NULL) { if (!create) return NULL; if (strlen(class) > 80) { Msg(0, "Command class name too long."); return NULL; } kp = malloc(sizeof(struct kclass)); if (kp == NULL) { Msg(0, "%s", strnomem); return NULL; } kp->name = SaveStr(class); for (i = 0; i < (int)(ARRAY_SIZE(kp->ktab)); i++) { kp->ktab[i].nr = RC_ILLEGAL; kp->ktab[i].args = noargs; kp->ktab[i].argl = NULL; kp->ktab[i].quiet = 0; } kp->next = NULL; *kpp = kp; } return kp->ktab; } static void ClearAction(struct action *act) { char **p; if (act->nr == RC_ILLEGAL) return; act->nr = RC_ILLEGAL; if (act->args == noargs) return; for (p = act->args; *p; p++) free(*p); free((char *)act->args); act->args = noargs; act->argl = NULL; } /* * ProcessInput: process input from display and feed it into * the layer on canvas D_forecv. */ /* * This ProcessInput just does the keybindings and passes * everything else on to ProcessInput2. */ void ProcessInput(char *ibuf, size_t ilen) { int ch; size_t slen; unsigned char *s, *q; int i, l; char *p; if (display == NULL || ilen == 0) return; if (D_seql) evdeq(&D_mapev); slen = ilen; s = (unsigned char *)ibuf; while (ilen-- > 0) { ch = *s++; if (D_dontmap || !D_nseqs) { D_dontmap = 0; continue; } for (;;) { if (*D_seqp != ch) { l = D_seqp[D_seqp[-D_seql - 1] + 1]; if (l) { D_seqp += l * 2 + 4; continue; } D_mapdefault = 0; l = D_seql; p = (char *)D_seqp - l; D_seql = 0; D_seqp = D_kmaps + 3; if (l == 0) break; if ((q = D_seqh) != NULL) { D_seqh = NULL; i = q[0] << 8 | q[1]; i &= ~KMAP_NOTIMEOUT; if (StuffKey(i)) ProcessInput2((char *)q + 3, q[2]); if (display == NULL) return; l -= q[2]; p += q[2]; } else D_dontmap = 1; ProcessInput(p, l); if (display == NULL) return; evdeq(&D_mapev); continue; } if (D_seql++ == 0) { /* Finish old stuff */ slen -= ilen + 1; if (slen) ProcessInput2(ibuf, slen); if (display == NULL) return; D_seqh = NULL; } ibuf = (char *)s; slen = ilen; D_seqp++; l = D_seql; if (l == D_seqp[-l - 1]) { if (D_seqp[l] != l) { q = D_seqp + 1 + l; if (D_kmaps + D_nseqs > q && q[2] > l && !memcmp(D_seqp - l, q + 3, l)) { D_seqh = D_seqp - 3 - l; D_seqp = q + 3 + l; break; } } i = D_seqp[-l - 3] << 8 | D_seqp[-l - 2]; i &= ~KMAP_NOTIMEOUT; p = (char *)D_seqp - l; D_seql = 0; D_seqp = D_kmaps + 3; D_seqh = NULL; if (StuffKey(i)) ProcessInput2(p, l); if (display == NULL) return; } break; } } if (D_seql) { l = D_seql; for (s = D_seqp;; s += i * 2 + 4) { if (s[-l - 3] & KMAP_NOTIMEOUT >> 8) break; if ((i = s[s[-l - 1] + 1]) == 0) { SetTimeout(&D_mapev, maptimeout); evenq(&D_mapev); break; } } } ProcessInput2(ibuf, slen); } /* * Here only the screen escape commands are handled. */ void ProcessInput2(char *ibuf, size_t ilen) { char *s; int ch; size_t slen; struct action *ktabp; while (ilen && display) { flayer = D_forecv->c_layer; fore = D_fore; slen = ilen; s = ibuf; if (!D_ESCseen) { while (ilen > 0) { if ((unsigned char)*s++ == D_user->u_Esc) break; ilen--; } slen -= ilen; if (slen) DoProcess(fore, &ibuf, &slen, NULL); if (ilen == 1) { D_ESCseen = ktab; WindowChanged(fore, WINESC_ESC_SEEN); } if (ilen > 0) ilen--; } if (ilen == 0) return; ktabp = D_ESCseen ? D_ESCseen : ktab; if (D_ESCseen) { D_ESCseen = NULL; WindowChanged(fore, WINESC_ESC_SEEN); } ch = (unsigned char)*s; /* * As users have different esc characters, but a common ktab[], * we fold back the users esc and meta-esc key to the Default keys * that can be looked up in the ktab[]. grmbl. jw. * XXX: make ktab[] a per user thing. */ if (ch == D_user->u_Esc) ch = DefaultEsc; else if (ch == D_user->u_MetaEsc) ch = DefaultMetaEsc; if (ch >= 0) DoAction(&ktabp[ch]); ibuf = (char *)(s + 1); ilen--; } } void DoProcess(Window *window, char **bufp, size_t *lenp, struct paster *pa) { size_t oldlen; Display *d = display; /* XXX -> PasteStart */ if (pa && *lenp > 1 && window && window->w_slowpaste) { /* schedule slowpaste event */ SetTimeout(&window->w_paster.pa_slowev, window->w_slowpaste); evenq(&window->w_paster.pa_slowev); return; } while (flayer && *lenp) { if (!pa && window && window->w_paster.pa_pastelen && flayer == window->w_paster.pa_pastelayer) { WBell(window, visual_bell); *bufp += *lenp; *lenp = 0; display = d; return; } oldlen = *lenp; LayProcess(bufp, lenp); if (pa && !pa->pa_pastelayer) break; /* flush rest of paste */ if (*lenp == oldlen) { if (pa) { display = d; return; } /* We're full, let's beep */ WBell(window, visual_bell); break; } } *bufp += *lenp; *lenp = 0; display = d; if (pa && pa->pa_pastelen == 0) FreePaster(pa); } int FindCommnr(const char *str) { int x, m, l = 0, r = RC_LAST; while (l <= r) { m = (l + r) / 2; x = strcmp(str, comms[m].name); if (x > 0) l = m + 1; else if (x < 0) r = m - 1; else return m; } return RC_ILLEGAL; } static int CheckArgNum(int nr, char **args) { int i, n; static char *argss[] = { "no", "one", "two", "three", "four", "OOPS" }; static char *orformat[] = { "%s: %s: %s argument%s required", "%s: %s: %s or %s argument%s required", "%s: %s: %s, %s or %s argument%s required", "%s: %s: %s, %s, %s or %s argument%s required" }; n = comms[nr].flags & ARGS_MASK; for (i = 0; args[i]; i++) ; if (comms[nr].flags & ARGS_ORMORE) { if (i < n) { Msg(0, "%s: %s: at least %s argument%s required", rc_name, comms[nr].name, argss[n], n != 1 ? "s" : ""); return -1; } } else if ((comms[nr].flags & ARGS_PLUS1) && (comms[nr].flags & ARGS_PLUS2) && (comms[nr].flags & ARGS_PLUS3)) { if (i != n && i != n + 1 && i != n + 2 && i != n + 3) { Msg(0, orformat[3], rc_name, comms[nr].name, argss[n], argss[n + 1], argss[n + 2], argss[n + 3], ""); return -1; } } else if ((comms[nr].flags & ARGS_PLUS1) && (comms[nr].flags & ARGS_PLUS2)) { if (i != n && i != n + 1 && i != n + 2) { Msg(0, orformat[2], rc_name, comms[nr].name, argss[n], argss[n + 1], argss[n + 2], ""); return -1; } } else if ((comms[nr].flags & ARGS_PLUS1) && (comms[nr].flags & ARGS_PLUS3)) { if (i != n && i != n + 1 && i != n + 3) { Msg(0, orformat[2], rc_name, comms[nr].name, argss[n], argss[n + 1], argss[n + 3], ""); return -1; } } else if ((comms[nr].flags & ARGS_PLUS2) && (comms[nr].flags & ARGS_PLUS3)) { if (i != n && i != n + 2 && i != n + 3) { Msg(0, orformat[2], rc_name, comms[nr].name, argss[n], argss[n + 2], argss[n + 3], ""); return -1; } } else if (comms[nr].flags & ARGS_PLUS1) { if (i != n && i != n + 1) { Msg(0, orformat[1], rc_name, comms[nr].name, argss[n], argss[n + 1], n != 0 ? "s" : ""); return -1; } } else if (comms[nr].flags & ARGS_PLUS2) { if (i != n && i != n + 2) { Msg(0, orformat[1], rc_name, comms[nr].name, argss[n], argss[n + 2], "s"); return -1; } } else if (comms[nr].flags & ARGS_PLUS3) { if (i != n && i != n + 3) { Msg(0, orformat[1], rc_name, comms[nr].name, argss[n], argss[n + 3], ""); return -1; } } else if (i != n) { Msg(0, orformat[0], rc_name, comms[nr].name, argss[n], n != 1 ? "s" : ""); return -1; } return i; } static void StuffFin(char *buf, size_t len, void *data) { (void)data; /* unused */ if (!flayer) return; while (len) LayProcess(&buf, &len); } /* If the command is not 'quieted', then use Msg to output the message. If it's a remote * query, then Msg takes care of also outputting the message to the querying client. * * If we want the command to be quiet, and it's a remote query, then use QueryMsg so that * the response does go back to the querying client. * * If the command is quieted, and it's not a remote query, then just don't print the message. */ #define OutputMsg (!act->quiet ? Msg : queryflag >= 0 ? QueryMsg : Dummy) static void DoCommandSelect(struct action *act) { char **args = act->args; int n; if (!*args) InputSelect(); else if (args[0][0] == '-' && !args[0][1]) { SetForeWindow(NULL); Activate(0); } else if (args[0][0] == '.' && !args[0][1]) { if (!fore) { OutputMsg(0, "select . needs a window"); queryflag = -1; } else { SetForeWindow(fore); Activate(0); } } else if (ParseWinNum(act, &n) == 0) SwitchWindow(GetWindowByNumber(n)); else if (queryflag >= 0) queryflag = -1; /* ParseWinNum already prints out an appropriate error message. */ } static void DoCommandMultiinput(struct action *act) { char **args = act->args; if (!*args) { if (!fore) OutputMsg(0, "multiinput needs a window"); else fore->w_miflag = fore->w_miflag ? 0 : 1; } else { int n; if (ParseWinNum(act, &n) == 0) { Window *p = GetWindowByNumber(n); if (p) p->w_miflag = p->w_miflag ? 0 : 1; else ShowWindows(act, n); } } } static void DoCommandDefautonuke(struct action *act) { int msgok = display && !*rc_name; if (ParseOnOff(act, &defautonuke) == 0 && msgok) OutputMsg(0, "Default autonuke turned %s", defautonuke ? "on" : "off"); if (display && *rc_name) D_auto_nuke = defautonuke; } static void DoCommandAutonuke(struct action *act) { int msgok = display && !*rc_name; if (ParseOnOff(act, &D_auto_nuke) == 0 && msgok) OutputMsg(0, "Autonuke turned %s", D_auto_nuke ? "on" : "off"); } static void DoCommandDefobuflimit(struct action *act) { int msgok = display && !*rc_name; if (ParseNum(act, &defobuflimit) == 0 && msgok) OutputMsg(0, "Default limit set to %d", defobuflimit); if (display && *rc_name) { D_obufmax = defobuflimit; D_obuflenmax = D_obuflen - D_obufmax; } } static void DoCommandObuflimit(struct action *act) { int msgok = display && !*rc_name; char **args = act->args; if (*args == NULL) OutputMsg(0, "Limit is %d, current buffer size is %d", D_obufmax, D_obuflen); else if (ParseNum(act, &D_obufmax) == 0 && msgok) OutputMsg(0, "Limit set to %d", D_obufmax); D_obuflenmax = D_obuflen - D_obufmax; } static void DoCommandDumptermcap(struct action *act) { (void)act; /* unused */ struct acluser *user = display ? D_user : users; WriteFile(user, NULL, DUMP_TERMCAP); } static void DoCommandHardcopy(struct action *act) { char **args = act->args; int mode = DUMP_HARDCOPY; char *file = NULL; struct acluser *user = display ? D_user : users; if (args[0]) { if (!strcmp(*args, "-h")) { mode = DUMP_SCROLLBACK; file = args[1]; } else if (!strcmp(*args, "--") && args[1]) file = args[1]; else file = args[0]; } if (args[0] && file == args[0] && args[1]) { OutputMsg(0, "%s: hardcopy: too many arguments", rc_name); return; } WriteFile(user, file, mode); } static void DoCommandDeflog(struct action *act) { (void)ParseOnOff(act, &nwin_default.Lflag); } static void DoCommandLog(struct action *act) { bool b = fore->w_log ? true : false; if (ParseSwitch(act, &b) == 0) LogToggle(b); } static void DoCommandSuspend(struct action *act) { (void)act; /* unused */ Detach(D_STOP); } static void DoCommandNext(struct action *act) { (void)act; /* unused */ if (MoreWindows()) SwitchWindow(NextWindow()); } static void DoCommandPrev(struct action *act) { (void)act; /* unused */ if (MoreWindows()) SwitchWindow(PreviousWindow()); } static void DoCommandParent(struct action *act) { (void)act; /* unused */ if (MoreWindows()) { Window *w = ParentWindow(); if (w == NULL && fore != NULL) Msg(0, "Window has no parent."); else SwitchWindow(w); } } static void DoCommandKill(struct action *act) { char **args = act->args; char *name; int n; if (*args) { if (!strcmp(*args, "--confirm")) { Input(fore->w_pwin ? "Really kill this filter [y/n]" : "Really kill this window [y/n]", 1, INP_RAW, confirm_fn, NULL, RC_KILL); return; } else { OutputMsg(0, "usage: kill [--confirm]"); return; } } n = fore->w_number; if (fore->w_pwin) { FreePseudowin(fore); OutputMsg(0, "Filter removed."); return; } name = SaveStr(fore->w_title); KillWindow(fore); OutputMsg(0, "Window %d (%s) killed.", n, name); if (name) free(name); } static void DoCommandQuit(struct action *act) { char **args = act->args; if (*args) { if (!strcmp(*args, "--confirm")) { Input("Really quit and kill all your windows [y/n]", 1, INP_RAW, confirm_fn, NULL, RC_QUIT); return; } else { OutputMsg(0, "usage: quit [--confirm]"); return; } } Finit(0); /* does not return */ } static void DoCommandDetach(struct action *act) { char **args = act->args; if (*args && !strcmp(*args, "-h")) Hangup(); else Detach(D_DETACH); } static void DoCommandPow_detach(struct action *act) { char **args = act->args; if (*args) { if (!strcmp(*args, "--confirm")) { Input("Really detach and send HANGUP to parent process [y/n]", 1, INP_RAW, confirm_fn, NULL, RC_POW_DETACH); return; } else { OutputMsg(0, "usage: pow_detach [--confirm]"); return; } } Detach(D_POWER); /* detach and kill Attacher's parent */ } static void DoCommandZmodem(struct action *act) { char **args = act->args; int msgok = display && !*rc_name; if (*args && !strcmp(*args, "sendcmd")) { if (args[1]) { free(zmodem_sendcmd); zmodem_sendcmd = SaveStr(args[1]); } if (msgok) OutputMsg(0, "zmodem sendcmd: %s", zmodem_sendcmd); return; } if (*args && !strcmp(*args, "recvcmd")) { if (args[1]) { free(zmodem_recvcmd); zmodem_recvcmd = SaveStr(args[1]); } if (msgok) OutputMsg(0, "zmodem recvcmd: %s", zmodem_recvcmd); return; } if (*args) { int i; for (i = 0; i < 4; i++) if (!strcmp(zmodes[i], *args)) break; if (i == 4 && !strcmp(*args, "on")) i = 1; if (i == 4) { OutputMsg(0, "usage: zmodem off|auto|catch|pass"); return; } zmodem_mode = i; } if (msgok) OutputMsg(0, "zmodem mode is %s", zmodes[zmodem_mode]); } static void DoCommandUnbindall(struct action *act) { (void)act; /* unused */ for (size_t i = 0; i < ARRAY_SIZE(ktab); i++) ClearAction(&ktab[i]); OutputMsg(0, "Unbound all keys."); } static void DoCommandZombie(struct action *act) { char **args = act->args; int *argl = act->argl; char *s = NULL; if (!(s = *args)) { ZombieKey_destroy = 0; return; } if (*argl == 0 || *argl > 2) { OutputMsg(0, "%s:zombie: one or two characters expected.", rc_name); return; } if (args[1]) { if (!strcmp(args[1], "onerror")) { ZombieKey_onerror = 1; } else { OutputMsg(0, "usage: zombie [keys [onerror]]"); return; } } else ZombieKey_onerror = 0; ZombieKey_destroy = args[0][0]; ZombieKey_resurrect = *argl == 2 ? args[0][1] : 0; } static void DoCommandWall(struct action *act) { char **args = act->args; char *s = D_user->u_name; OutputMsg(0, "%s: %s", s, *args); } static void DoCommandAt(struct action *act) { char **args = act->args; int *argl = act->argl; struct acluser *user = display ? D_user : users; char *s; size_t n; /* where this AT command comes from: */ if (!user) return; s = SaveStr(user->u_name); /* DO NOT RETURN FROM HERE WITHOUT RESETTING THIS: */ EffectiveAclUser = user; n = strlen(args[0]); if (n) n--; /* * the windows/displays loops are quite dangerous here, take extra * care not to trigger landmines. Things may appear/disappear while * we are walking along. */ switch (args[0][n]) { case '*': /* user */ { Display *nd; struct acluser *u; if (!n) u = user; else { for (u = users; u; u = u->u_next) { if (!strncmp(*args, u->u_name, n)) goto out; } if (!u) { args[0][n] = '\0'; OutputMsg(0, "Did not find any user matching '%s'", args[0]); goto out; } } for (display = displays; display; display = nd) { nd = display->d_next; if (D_forecv == NULL) continue; flayer = D_forecv->c_layer; fore = D_fore; if (D_user != u) continue; DoCommand(args + 1, argl + 1); if (display) OutputMsg(0, "command from %s: %s %s", s, args[1], args[2] ? args[2] : ""); display = NULL; flayer = NULL; fore = NULL; } } break; case '%': /* display */ { Display *nd; for (display = displays; display; display = nd) { nd = display->d_next; if (D_forecv == NULL) continue; fore = D_fore; flayer = D_forecv->c_layer; if (strncmp(args[0], D_usertty, n) && (strncmp("/dev/", D_usertty, 5) || strncmp(args[0], D_usertty + 5, n)) && (strncmp("/dev/tty", D_usertty, 8) || strncmp(args[0], D_usertty + 8, n))) continue; DoCommand(args + 1, argl + 1); if (display) OutputMsg(0, "command from %s: %s %s", s, args[1], args[2] ? args[2] : ""); display = NULL; fore = NULL; flayer = NULL; } } break; case '#': /* window */ n--; /* FALLTHROUGH */ default: { int ch; int i = 0; n++; ch = args[0][n]; args[0][n] = '\0'; if (!*args[0] || (i = WindowByNumber(args[0])) < 0) { args[0][n] = ch; /* must restore string in case of bind */ /* try looping over titles */ for (fore = mru_window; fore; fore = fore->w_prev_mru) { if (strncmp(args[0], fore->w_title, n)) continue; /* * consider this a bug or a feature: * while looping through windows, we have fore AND * display context. This will confuse users who try to * set up loops inside of loops, but often allows to do * what you mean, even when you address your context wrong. */ i = 0; /* XXX: other displays? */ if (fore->w_layer.l_cvlist) display = fore->w_layer.l_cvlist->c_display; flayer = fore->w_savelayer ? fore->w_savelayer : &fore->w_layer; DoCommand(args + 1, argl + 1); /* may destroy our display */ if (fore && fore->w_layer.l_cvlist) { display = fore->w_layer.l_cvlist->c_display; OutputMsg(0, "command from %s: %s %s", s, args[1], args[2] ? args[2] : ""); } } display = NULL; fore = NULL; if (i < 0) OutputMsg(0, "%s: at '%s': no such window.\n", rc_name, args[0]); goto out; } else if ((fore = GetWindowByNumber(i))) { args[0][n] = ch; /* must restore string in case of bind */ if (fore->w_layer.l_cvlist) display = fore->w_layer.l_cvlist->c_display; flayer = fore->w_savelayer ? fore->w_savelayer : &fore->w_layer; DoCommand(args + 1, argl + 1); if (fore && fore->w_layer.l_cvlist) { display = fore->w_layer.l_cvlist->c_display; OutputMsg(0, "command from %s: %s %s", s, args[1], args[2] ? args[2] : ""); } display = NULL; fore = NULL; } else OutputMsg(0, "%s: at [identifier][%%|*|#] command [args]", rc_name); } } out: free(s); EffectiveAclUser = NULL; } static void DoCommandReadreg(struct action *act) { char **args = act->args; int *argl = act->argl; int i = fore ? fore->w_encoding : display ? display->d_encoding : 0; char ch; char *s; int n; if (args[0] && args[1] && !strcmp(args[0], "-e")) { i = FindEncoding(args[1]); if (i == -1) { OutputMsg(0, "%s: readreg: unknown encoding", rc_name); return; } args += 2; } /* * Without arguments we prompt for a destination register. * It will receive the copybuffer contents. * This is not done by RC_PASTE, as we prompt for source * (not dest) there. */ if (*args == NULL) { Input("Copy to register:", 1, INP_RAW, copy_reg_fn, NULL, 0); return; } if (*argl != 1) { OutputMsg(0, "%s: copyreg: character, ^x, or (octal) \\032 expected.", rc_name); return; } ch = args[0][0]; /* * With two arguments we *really* read register contents from file */ if (args[1]) { if (args[2]) { OutputMsg(0, "%s: readreg: too many arguments", rc_name); return; } if ((s = ReadFile(args[1], &n))) { struct plop *pp = plop_tab + (int)(unsigned char)ch; if (pp->buf) free(pp->buf); pp->buf = s; pp->len = n; pp->enc = i; } } else { /* * with one argument we copy the copybuffer into a specified register * This could be done with RC_PASTE too, but is here to be consistent * with the zero argument call. */ copy_reg_fn(&ch, 0, NULL); } } static void DoCommandRegister(struct action *act) { char **args = act->args; int *argl = act->argl; int i = fore ? fore->w_encoding : display ? display->d_encoding : 0; struct acluser *user = display ? D_user : users; int argc = CheckArgNum(act->nr, args); char ch; if (args[0] && args[1] && !strcmp(args[0], "-e")) { i = FindEncoding(args[1]); if (i == -1) { OutputMsg(0, "%s: register: unknown encoding", rc_name); return; } args += 2; argc -= 2; } if (argc != 2) { OutputMsg(0, "%s: register: illegal number of arguments.", rc_name); return; } if (*argl != 1) { OutputMsg(0, "%s: register: character, ^x, or (octal) \\032 expected.", rc_name); return; } ch = args[0][0]; if (ch == '.') { if (user->u_plop.buf != NULL) UserFreeCopyBuffer(user); if (args[1] && args[1][0]) { user->u_plop.buf = SaveStrn(args[1], argl[1]); user->u_plop.len = argl[1]; user->u_plop.enc = i; } } else { struct plop *plp = plop_tab + (int)(unsigned char)ch; if (plp->buf) free(plp->buf); plp->buf = SaveStrn(args[1], argl[1]); plp->len = argl[1]; plp->enc = i; } } static void DoCommandProcess(struct action *act) { char **args = act->args; int *argl = act->argl; char ch; if (*args == NULL) { Input("Process register:", 1, INP_RAW, process_fn, NULL, 0); return; } if (*argl != 1) { OutputMsg(0, "%s: process: character, ^x, or (octal) \\032 expected.", rc_name); return; } ch = args[0][0]; process_fn(&ch, 0, NULL); } static void DoCommandStuff(struct action *act) { char **args = act->args; int *argl = act->argl; char *s; size_t len; s = *args; if (!args[0]) { Input("Stuff:", 100, INP_COOKED, StuffFin, NULL, 0); return; } len = *argl; if (args[1]) { int i; if (strcmp(s, "-k")) { OutputMsg(0, "%s: stuff: invalid option %s", rc_name, s); return; } s = args[1]; for (i = T_CAPS; i < T_OCAPS; i++) if (strcmp(term[i].tcname, s) == 0) return; if (i == T_OCAPS) { OutputMsg(0, "%s: stuff: unknown key '%s'", rc_name, s); return; } if (StuffKey(i - T_CAPS) == 0) return; s = display ? D_tcs[i].str : NULL; if (s == NULL) return; len = strlen(s); } while (len) LayProcess(&s, &len); } static void DoCommandRedisplay(struct action *act) { (void)act; /* unused */ Activate(-1); } static void DoCommandWindows(struct action *act) { char **args = act->args; if (args[0]) ShowWindowsX(args[0]); else ShowWindows(act, -1); } static void DoCommandVersion(struct action *act) { (void)act; /* unused */ OutputMsg(0, "screen %s", version); } static void DoCommandInfo(struct action *act) { (void)act; /* unused */ ShowInfo(); } static void DoCommandDinfo(struct action *act) { (void)act; /* unused */ ShowDInfo(); } static void DoCommandCommand(struct action *act) { char **args = act->args; int argc = CheckArgNum(act->nr, args); struct action *ktabp = ktab; if (argc == 2 && !strcmp(*args, "-c")) { if ((ktabp = FindKtab(args[1], 0)) == NULL) { OutputMsg(0, "Unknown command class '%s'", args[1]); return; } } if (D_ESCseen != ktab || ktabp != ktab) { if (D_ESCseen != ktabp) { D_ESCseen = ktabp; WindowChanged(fore, WINESC_ESC_SEEN); } return; } if (D_ESCseen) { D_ESCseen = NULL; WindowChanged(fore, WINESC_ESC_SEEN); } if (MoreWindows()) SwitchWindow(display && D_other ? D_other : NextWindow()); } static void DoCommandOther(struct action *act) { (void)act; /* unused */ if (MoreWindows()) SwitchWindow(display && D_other ? D_other : NextWindow()); } static void DoCommandMeta(struct action *act) { struct acluser *user = display ? D_user : users; char ch = user->u_Esc; char *s = &ch; size_t len = 1; (void)act; /* unused */ if (ch != -1) LayProcess(&s, &len); } static void DoCommandXon(struct action *act) { char ch = Ctrl('q'); char *s = &ch; size_t len = 1; (void)act; /* unused */ LayProcess(&s, &len); } static void DoCommandXoff(struct action *act) { char ch = Ctrl('s'); char *s = &ch; size_t len = 1; (void)act; /* unused */ LayProcess(&s, &len); } static void DoCommandBreaktype(struct action *act) { static char *types[] = { "TIOCSBRK", "TCSBRK", "tcsendbreak", NULL }; char **args = act->args; char ch; int n; if (*args) { if (ParseNum(act, &n)) for (n = 0; n < (int)(ARRAY_SIZE(types)); n++) { int i; for (i = 0; i < 4; i++) { ch = args[0][i]; if (ch >= 'a' && ch <= 'z') ch -= 'a' - 'A'; if (ch != types[n][i] && (ch + ('a' - 'A')) != types[n][i]) break; } if (i == 4) break; } if (n < 0 || n >= (int)(ARRAY_SIZE(types))) OutputMsg(0, "%s invalid, chose one of %s, %s or %s", *args, types[0], types[1], types[2]); else { breaktype = n; OutputMsg(0, "breaktype set to (%d) %s", n, types[n]); } } } static void DoCommandPow_break(struct action *act) { char **args = act->args; int n = 0; if (*args && ParseNum(act, &n)) return; SendBreak(fore, n, true); } static void DoCommandBreak(struct action *act) { char **args = act->args; int n = 0; if (*args && ParseNum(act, &n)) return; SendBreak(fore, n, false); } static void DoCommandLockscreen(struct action *act) { (void)act; /* unused */ Detach(D_LOCK); } static void DoCommandWidth(struct action *act) { char **args = act->args; int w, h; int what = 0; if (*args && !strcmp(*args, "-w")) what = 1; else if (*args && !strcmp(*args, "-d")) what = 2; if (what) args++; if (what == 0 && flayer && !display) what = 1; if (what == 1) { if (!flayer) { OutputMsg(0, "%s: width: window required", rc_name); return; } w = flayer->l_width; h = flayer->l_height; } else { if (!display) { OutputMsg(0, "%s: width: display required", rc_name); return; } w = D_width; h = D_height; } if (*args && args[0][0] == '-') { OutputMsg(0, "%s: width: unknown option %s", rc_name, *args); return; } if (!*args) { if (w == Z0width) w = Z1width; else if (w == Z1width) w = Z0width; else if (w > (Z0width + Z1width) / 2) w = Z0width; else w = Z1width; } else { w = atoi(*args); if (args[1]) h = atoi(args[1]); } if (*args && args[1] && args[2]) { OutputMsg(0, "%s: width: too many arguments", rc_name); return; } if (w <= 0) { OutputMsg(0, "Illegal width"); return; } if (h <= 0) { OutputMsg(0, "Illegal height"); return; } if (what == 1) { if (flayer->l_width == w && flayer->l_height == h) return; ResizeLayer(flayer, w, h, NULL); return; } if (D_width == w && D_height == h) return; if (what == 2) { ChangeScreenSize(w, h, 1); } else { if (ResizeDisplay(w, h) == 0) { Activate(D_fore ? D_fore->w_norefresh : 0); /* autofit */ ResizeLayer(D_forecv->c_layer, D_forecv->c_xe - D_forecv->c_xs + 1, D_forecv->c_ye - D_forecv->c_ys + 1, NULL); return; } if (h == D_height) OutputMsg(0, "Your termcap does not specify how to change the terminal's width to %d.", w); else if (w == D_width) OutputMsg(0, "Your termcap does not specify how to change the terminal's height to %d.", h); else OutputMsg(0, "Your termcap does not specify how to change the terminal's resolution to %dx%d.", w, h); } } static void DoCommandHeight(struct action *act) { char **args = act->args; int w, h; int what = 0; if (*args && !strcmp(*args, "-w")) what = 1; else if (*args && !strcmp(*args, "-d")) what = 2; if (what) args++; if (what == 0 && flayer && !display) what = 1; if (what == 1) { if (!flayer) { OutputMsg(0, "%s: height: window required", rc_name); return; } w = flayer->l_width; h = flayer->l_height; } else { if (!display) { OutputMsg(0, "%s: height: display required", rc_name); return; } w = D_width; h = D_height; } if (*args && args[0][0] == '-') { OutputMsg(0, "%s: height: unknown option %s", rc_name, *args); return; } if (!*args) { #define H0height 42 #define H1height 24 if (h == H0height) h = H1height; else if (h == H1height) h = H0height; else if (h > (H0height + H1height) / 2) h = H0height; else h = H1height; } else { h = atoi(*args); if (args[1]) w = atoi(args[1]); } if (*args && args[1] && args[2]) { OutputMsg(0, "%s: height: too many arguments", rc_name); return; } if (w <= 0) { OutputMsg(0, "Illegal width"); return; } if (h <= 0) { OutputMsg(0, "Illegal height"); return; } if (what == 1) { if (flayer->l_width == w && flayer->l_height == h) return; ResizeLayer(flayer, w, h, NULL); return; } if (D_width == w && D_height == h) return; if (what == 2) { ChangeScreenSize(w, h, 1); } else { if (ResizeDisplay(w, h) == 0) { Activate(D_fore ? D_fore->w_norefresh : 0); /* autofit */ ResizeLayer(D_forecv->c_layer, D_forecv->c_xe - D_forecv->c_xs + 1, D_forecv->c_ye - D_forecv->c_ys + 1, NULL); return; } if (h == D_height) OutputMsg(0, "Your termcap does not specify how to change the terminal's width to %d.", w); else if (w == D_width) OutputMsg(0, "Your termcap does not specify how to change the terminal's height to %d.", h); else OutputMsg(0, "Your termcap does not specify how to change the terminal's resolution to %dx%d.", w, h); } } static void DoCommandDefdynamictitle(struct action *act) { (void)act; /* unused */ (void)ParseOnOff(act, &nwin_default.dynamicaka); } static void DoCommandDynamictitle(struct action *act) { (void)act; /* unused */ (void)ParseOnOff(act, &fore->w_dynamicaka); } static void DoCommandTitle(struct action *act) { char **args = act->args; if (queryflag >= 0) { if (fore) OutputMsg(0, "%s", fore->w_title); else queryflag = -1; return; } if (*args == NULL) InputAKA(); else ChangeAKA(fore, *args, strlen(*args)); } static void DoCommandColon(struct action *act) { char **args = act->args; Input(":", MAXSTR, INP_EVERY, ColonFin, NULL, 0); if (*args && **args) { char *s = *args; size_t len = strlen(s); LayProcess(&s, &len); } } static void DoCommandLastmsg(struct action *act) { (void)act; /* unused */ if (D_status_lastmsg) OutputMsg(0, "%s", D_status_lastmsg); } static void DoCommandScreen(struct action *act) { char **args = act->args; DoScreen("key", args); } static void DoCommandWrap(struct action *act) { int msgok = display && !*rc_name; if (ParseSwitch(act, &fore->w_wrap) == 0 && msgok) OutputMsg(0, "%cwrap", fore->w_wrap ? '+' : '-'); } static void DoCommandFlow(struct action *act) { char **args = act->args; int msgok = display && !*rc_name; bool b; if (*args) { if (args[0][0] == 'a') { fore->w_flow = (fore->w_flow & FLOW_AUTO) ? FLOW_AUTOFLAG | FLOW_AUTO | FLOW_ON : FLOW_AUTOFLAG; } else if (ParseOnOff(act, &b) == 0) fore->w_flow = (fore->w_flow & FLOW_AUTO) | b ? FLOW_ON : FLOW_OFF; } else { if (fore->w_flow & FLOW_AUTOFLAG) fore->w_flow = (fore->w_flow & FLOW_AUTO) | FLOW_ON; else if (fore->w_flow & FLOW_ON) fore->w_flow &= ~FLOW_ON; else fore->w_flow = fore->w_flow ? FLOW_AUTOFLAG | FLOW_AUTO | FLOW_ON : FLOW_AUTOFLAG; } SetFlow(fore->w_flow & FLOW_ON); if (msgok) OutputMsg(0, "%cflow%s", (fore->w_flow & FLOW_ON) ? '+' : '-', (fore->w_flow & FLOW_AUTOFLAG) ? "(auto)" : ""); } static void DoCommandDefwritelock(struct action *act) { char **args = act->args; bool b; if (args[0][0] == 'a') nwin_default.wlock = WLOCK_AUTO; else if (ParseOnOff(act, &b) == 0) nwin_default.wlock = b ? WLOCK_ON : WLOCK_OFF; } static void DoCommandWritelock(struct action *act) { char **args = act->args; bool b; if (*args) { if (args[0][0] == 'a') { fore->w_wlock = WLOCK_AUTO; } else { if (ParseOnOff(act, &b)) return; fore->w_wlock = b ? WLOCK_ON : WLOCK_OFF; } /* * user may have permission to change the writelock setting, * but he may never aquire the lock himself without write permission */ if (!AclCheckPermWin(D_user, ACL_WRITE, fore)) fore->w_wlockuser = D_user; } OutputMsg(0, "writelock %s", (fore->w_wlock == WLOCK_AUTO) ? "auto" : ((fore->w_wlock == WLOCK_OFF) ? "off" : "on")); } static void DoCommandClear(struct action *act) { (void)act; /* unused */ ResetAnsiState(fore); WriteString(fore, "\033[H\033[J", 6); } static void DoCommandReset(struct action *act) { (void)act; /* unused */ ResetAnsiState(fore); if (fore->w_zdisplay) zmodem_abort(fore, fore->w_zdisplay); WriteString(fore, "\033c", 2); } static void DoCommandMonitor(struct action *act) { bool b = fore->w_monitor != MON_OFF; int i; if (display) b = b && (ACLBYTE(fore->w_mon_notify, D_user->u_id) & ACLBIT(D_user->u_id)); if (ParseSwitch(act, &b)) return; if (b) { if (display) /* we tell only this user */ ACLBYTE(fore->w_mon_notify, D_user->u_id) |= ACLBIT(D_user->u_id); else for (i = 0; i < maxusercount; i++) ACLBYTE(fore->w_mon_notify, i) |= ACLBIT(i); if (fore->w_monitor == MON_OFF) fore->w_monitor = MON_ON; OutputMsg(0, "Window %d (%s) is now being monitored for all activity.", fore->w_number, fore->w_title); } else { if (display) /* we remove only this user */ ACLBYTE(fore->w_mon_notify, D_user->u_id) &= ~ACLBIT(D_user->u_id); else for (i = 0; i < maxusercount; i++) ACLBYTE(fore->w_mon_notify, i) &= ~ACLBIT(i); for (i = maxusercount - 1; i >= 0; i--) if (ACLBYTE(fore->w_mon_notify, i)) return; if (i < 0) fore->w_monitor = MON_OFF; OutputMsg(0, "Window %d (%s) is no longer being monitored for activity.", fore->w_number, fore->w_title); } } static void DoCommandDisplays(struct action *act) { (void)act; /* unused */ display_displays(); } static void DoCommandWindowlist(struct action *act) { char **args = act->args; int argc = CheckArgNum(act->nr, args); int msgok = display && !*rc_name; if (!*args) display_windows(0, WLIST_NUM, NULL); else if (!strcmp(*args, "string")) { if (args[1]) { if (wliststr) free(wliststr); wliststr = SaveStr(args[1]); } if (msgok) OutputMsg(0, "windowlist string is '%s'", wliststr); } else if (!strcmp(*args, "title")) { if (args[1]) { if (wlisttit) free(wlisttit); wlisttit = SaveStr(args[1]); } if (msgok) OutputMsg(0, "windowlist title is '%s'", wlisttit); } else { int flag = 0; int blank = 0; int i; for (i = 0; i < argc; i++) if (!args[i]) continue; else if (!strcmp(args[i], "-m")) flag |= WLIST_MRU; else if (!strcmp(args[i], "-b")) blank = 1; else if (!strcmp(args[i], "-g")) flag |= WLIST_NESTED; else { OutputMsg(0, "usage: windowlist [-b] [-g] [-m] [string [string] | title [title]]"); return; } if (i == argc) display_windows(blank, flag, NULL); } } static void DoCommandHelp(struct action *act) { char **args = act->args; int argc = CheckArgNum(act->nr, args); if (argc == 2 && !strcmp(*args, "-c")) { struct action *ktabp; if ((ktabp = FindKtab(args[1], 0)) == NULL) { OutputMsg(0, "Unknown command class '%s'", args[1]); return; } display_help(args[1], ktabp); } else display_help(NULL, ktab); } static void DoCommandLicense(struct action *act) { (void)act; /* unused */ display_license(); } static void DoCommandCopy(struct action *act) { (void)act; /* unused */ if (flayer->l_layfn != &WinLf) { OutputMsg(0, "Must be on a window layer"); return; } MarkRoutine(); WindowChanged(fore, WINESC_COPY_MODE); } static void DoCommandHistory(struct action *act) { static char *pasteargs[] = { ".", NULL }; static int pasteargl[] = { 1 }; struct acluser *user = display ? D_user : users; char **args; int *argl; int enc = -1; size_t l = 0; char *s, *ss, *dbuf; char ch, dch; if (flayer->l_layfn != &WinLf) { OutputMsg(0, "Must be on a window layer"); return; } if (GetHistory() == 0) return; if (user->u_plop.buf == NULL) return; args = pasteargs; argl = pasteargl; /* * without args we prompt for one(!) register to be pasted in the window */ if ((s = *args) == NULL) { Input("Paste from register:", 1, INP_RAW, ins_reg_fn, NULL, 0); return; } if (args[1] == NULL && !fore) /* no window? */ return; /* * with two arguments we paste into a destination register * (no window needed here). */ if (args[1] && argl[1] != 1) { OutputMsg(0, "%s: paste destination: character, ^x, or (octal) \\032 expected.", rc_name); return; } else if (fore) enc = fore->w_encoding; /* * measure length of needed buffer */ for (ss = s = *args; (ch = *ss); ss++) { if (ch == '.') { if (enc == -1) enc = user->u_plop.enc; if (enc != user->u_plop.enc) l += RecodeBuf((unsigned char *)user->u_plop.buf, user->u_plop.len, user->u_plop.enc, enc, NULL); else l += user->u_plop.len; } else { if (enc == -1) enc = plop_tab[(int)(unsigned char)ch].enc; if (enc != plop_tab[(int)(unsigned char)ch].enc) l += RecodeBuf((unsigned char *)plop_tab[(int)(unsigned char)ch].buf, plop_tab[(int)(unsigned char)ch].len, plop_tab[(int)(unsigned char)ch].enc, enc, NULL); else l += plop_tab[(int)(unsigned char)ch].len; } } if (l == 0) { OutputMsg(0, "empty buffer"); return; } /* * shortcut: * if there is only one source and the destination is a window, then * pass a pointer rather than duplicating the buffer. */ if (s[1] == 0 && args[1] == NULL) if (enc == (*s == '.' ? user->u_plop.enc : plop_tab[(int)(unsigned char)*s].enc)) { MakePaster(&fore->w_paster, *s == '.' ? user->u_plop.buf : plop_tab[(int)(unsigned char)*s].buf, l, 0); return; } /* * if no shortcut, we construct a buffer */ if ((dbuf = malloc(l)) == NULL) { OutputMsg(0, "%s", strnomem); return; } l = 0; /* * concatenate all sources into our own buffer, copy buffer is * special and is skipped if no display exists. */ for (ss = s; (ch = *ss); ss++) { struct plop *pp = (ch == '.' ? &user->u_plop : &plop_tab[(int)(unsigned char)ch]); if (pp->enc != enc) { l += RecodeBuf((unsigned char *)pp->buf, pp->len, pp->enc, enc, (unsigned char *)dbuf + l); continue; } memmove(dbuf + l, pp->buf, pp->len); l += pp->len; } /* * when called with one argument we paste our buffer into the window */ if (args[1] == NULL) { MakePaster(&fore->w_paster, dbuf, l, 1); } else { /* * we have two arguments, the second is already in dch. * use this as destination rather than the window. */ dch = args[1][0]; if (dch == '.') { if (user->u_plop.buf != NULL) UserFreeCopyBuffer(user); user->u_plop.buf = dbuf; user->u_plop.len = l; user->u_plop.enc = enc; } else { struct plop *pp = plop_tab + (int)(unsigned char)dch; if (pp->buf) free(pp->buf); pp->buf = dbuf; pp->len = l; pp->enc = enc; } } } static void DoCommandPaste(struct action *act) { struct acluser *user = display ? D_user : users; char **args = act->args; int *argl = act->argl; int enc = -1; size_t l = 0; char *s, *ss, *dbuf; char ch, dch; /* * without args we prompt for one(!) register to be pasted in the window */ if ((s = *args) == NULL) { Input("Paste from register:", 1, INP_RAW, ins_reg_fn, NULL, 0); return; } if (args[1] == NULL && !fore) /* no window? */ return; /* * with two arguments we paste into a destination register * (no window needed here). */ if (args[1] && argl[1] != 1) { OutputMsg(0, "%s: paste destination: character, ^x, or (octal) \\032 expected.", rc_name); return; } else if (fore) enc = fore->w_encoding; /* * measure length of needed buffer */ for (ss = s = *args; (ch = *ss); ss++) { if (ch == '.') { if (enc == -1) enc = user->u_plop.enc; if (enc != user->u_plop.enc) l += RecodeBuf((unsigned char *)user->u_plop.buf, user->u_plop.len, user->u_plop.enc, enc, NULL); else l += user->u_plop.len; } else { if (enc == -1) enc = plop_tab[(int)(unsigned char)ch].enc; if (enc != plop_tab[(int)(unsigned char)ch].enc) l += RecodeBuf((unsigned char *)plop_tab[(int)(unsigned char)ch].buf, plop_tab[(int)(unsigned char)ch].len, plop_tab[(int)(unsigned char)ch].enc, enc, NULL); else l += plop_tab[(int)(unsigned char)ch].len; } } if (l == 0) { OutputMsg(0, "empty buffer"); return; } /* * shortcut: * if there is only one source and the destination is a window, then * pass a pointer rather than duplicating the buffer. */ if (s[1] == 0 && args[1] == NULL) if (enc == (*s == '.' ? user->u_plop.enc : plop_tab[(int)(unsigned char)*s].enc)) { MakePaster(&fore->w_paster, *s == '.' ? user->u_plop.buf : plop_tab[(int)(unsigned char)*s].buf, l, 0); return; } /* * if no shortcut, we construct a buffer */ if ((dbuf = malloc(l)) == NULL) { OutputMsg(0, "%s", strnomem); return; } l = 0; /* * concatenate all sources into our own buffer, copy buffer is * special and is skipped if no display exists. */ for (ss = s; (ch = *ss); ss++) { struct plop *pp = (ch == '.' ? &user->u_plop : &plop_tab[(int)(unsigned char)ch]); if (pp->enc != enc) { l += RecodeBuf((unsigned char *)pp->buf, pp->len, pp->enc, enc, (unsigned char *)dbuf + l); continue; } memmove(dbuf + l, pp->buf, pp->len); l += pp->len; } /* * when called with one argument we paste our buffer into the window */ if (args[1] == NULL) { MakePaster(&fore->w_paster, dbuf, l, 1); } else { /* * we have two arguments, the second is already in dch. * use this as destination rather than the window. */ dch = args[1][0]; if (dch == '.') { if (user->u_plop.buf != NULL) UserFreeCopyBuffer(user); user->u_plop.buf = dbuf; user->u_plop.len = l; user->u_plop.enc = enc; } else { struct plop *pp = plop_tab + (int)(unsigned char)dch; if (pp->buf) free(pp->buf); pp->buf = dbuf; pp->len = l; pp->enc = enc; } } } static void DoCommandWritebuf(struct action *act) { struct acluser *user = display ? D_user : users; char **args = act->args; int enc = -1; size_t l = 0; char *newbuf; struct plop oldplop; if (!user->u_plop.buf) { OutputMsg(0, "empty buffer"); return; } oldplop = user->u_plop; if (args[0] && args[1] && !strcmp(args[0], "-e")) { enc = FindEncoding(args[1]); if (enc == -1) { OutputMsg(0, "%s: writebuf: unknown encoding", rc_name); return; } if (enc != oldplop.enc) { l = RecodeBuf((unsigned char *)oldplop.buf, oldplop.len, oldplop.enc, enc, NULL); newbuf = malloc(l + 1); if (!newbuf) { OutputMsg(0, "%s", strnomem); return; } user->u_plop.len = RecodeBuf((unsigned char *)oldplop.buf, oldplop.len, oldplop.enc, enc, (unsigned char *)newbuf); user->u_plop.buf = newbuf; user->u_plop.enc = enc; } args += 2; } if (args[0] && args[1]) OutputMsg(0, "%s: writebuf: too many arguments", rc_name); else WriteFile(user, args[0], DUMP_EXCHANGE); if (user->u_plop.buf != oldplop.buf) free(user->u_plop.buf); user->u_plop = oldplop; } static void DoCommandReadbuf(struct action *act) { struct acluser *user = display ? D_user : users; char **args = act->args; char *s; int i; int l = 0; i = fore ? fore->w_encoding : display ? display->d_encoding : 0; if (args[0] && args[1] && !strcmp(args[0], "-e")) { i = FindEncoding(args[1]); if (i == -1) { OutputMsg(0, "%s: readbuf: unknown encoding", rc_name); return; } args += 2; } if (args[0] && args[1]) { OutputMsg(0, "%s: readbuf: too many arguments", rc_name); return; } if ((s = ReadFile(args[0] ? args[0] : BufferFile, &l))) { if (user->u_plop.buf) UserFreeCopyBuffer(user); user->u_plop.len = l; user->u_plop.buf = s; user->u_plop.enc = i; OutputMsg(0, "Read contents of %s into copybuffer", args[0] ? args[0] : BufferFile); } } static void DoCommandRemovebuf(struct action *act) { (void)act; /* unused */ KillBuffers(); } static void DoCommandIgnorecase(struct action *act) { int msgok = display && !*rc_name; (void)ParseSwitch(act, &search_ic); if (msgok) OutputMsg(0, "Will %signore case in searches", search_ic ? "" : "not "); } static void DoCommandEscape(struct action *act) { char **args = act->args; int *argl = act->argl; struct acluser *user = display ? D_user : users; if (*argl == 0) SetEscape(user, -1, -1); else if (*argl == 2) SetEscape(user, (int)(unsigned char)args[0][0], (int)(unsigned char)args[0][1]); else { OutputMsg(0, "%s: two characters required after escape.", rc_name); return; } /* Change defescape if master user. This is because we only * have one ktab. */ if (display && user != users) return; if (*argl == 0) SetEscape(NULL, -1, -1); else if (*argl == 2) SetEscape(NULL, (int)(unsigned char)args[0][0], (int)(unsigned char)args[0][1]); CheckEscape(); } static void DoCommandDefescape(struct action *act) { char **args = act->args; int *argl = act->argl; if (*argl == 0) SetEscape(NULL, -1, -1); else if (*argl == 2) SetEscape(NULL, (int)(unsigned char)args[0][0], (int)(unsigned char)args[0][1]); else { OutputMsg(0, "%s: two characters required after defescape.", rc_name); return; } CheckEscape(); } static void DoCommandChdir(struct action *act) { char **args = act->args; char *s; s = *args ? *args : home; if (chdir(s) == -1) OutputMsg(errno, "%s", s); } static void DoCommandShell(struct action *act) { if (ParseSaveStr(act, &ShellProg) == 0) ShellArgs[0] = ShellProg; } static void DoCommandHardcopydir(struct action *act) { char **args = act->args; int msgok = display && !*rc_name; if (*args) (void)ParseSaveStr(act, &hardcopydir); if (msgok) OutputMsg(0, "hardcopydir is %s\n", hardcopydir && *hardcopydir ? hardcopydir : ""); } static void DoCommandLogfile(struct action *act) { char **args = act->args; int msgok = display && !*rc_name; if (*args) { char buf[MAXPATHLEN]; if (args[1] && !(strcmp(*args, "flush"))) { log_flush = atoi(args[1]); if (msgok) OutputMsg(0, "log flush timeout set to %ds\n", log_flush); return; } if (ParseSaveStr(act, &screenlogfile)) return; if (fore && fore->w_log) if (DoStartLog(fore, buf, ARRAY_SIZE(buf))) OutputMsg(0, "Error opening logfile \"%s\"", buf); if (!msgok) return; } OutputMsg(0, "logfile is '%s'", screenlogfile); } static void DoCommandLogtstamp(struct action *act) { char **args = act->args; int msgok = display && !*rc_name; if (!*args || !strcmp(*args, "on") || !strcmp(*args, "off")) { if (ParseSwitch(act, &logtstamp_on) == 0 && msgok) OutputMsg(0, "timestamps turned %s", logtstamp_on ? "on" : "off"); } else if (!strcmp(*args, "string")) { if (args[1]) { if (logtstamp_string) free(logtstamp_string); logtstamp_string = SaveStr(args[1]); } if (msgok) OutputMsg(0, "logfile timestamp is '%s'", logtstamp_string); } else if (!strcmp(*args, "after")) { if (args[1]) { logtstamp_after = atoi(args[1]); if (!msgok) return; } OutputMsg(0, "timestamp printed after %ds\n", logtstamp_after); } else OutputMsg(0, "usage: logtstamp [after [n]|string [str]|on|off]"); } static void DoCommandShelltitle(struct action *act) { (void)ParseSaveStr(act, &nwin_default.aka); } static void DoCommandTerminfo(struct action *act) { (void)act; /* unused */ if (!rc_name || !*rc_name) OutputMsg(0, "Sorry, too late now. Place that in your .screenrc file."); } static void DoCommandSleep(struct action *act) { (void)act; /* unused */ } static void DoCommandTerm(struct action *act) { char *s = NULL; if (ParseSaveStr(act, &s)) return; if (strlen(s) > MAXTERMLEN) { OutputMsg(0, "%s: term: argument too long ( < %d)", rc_name, MAXTERMLEN); free(s); return; } strncpy(screenterm, s, MAXTERMLEN); screenterm[MAXTERMLEN] = '\0'; free(s); MakeTermcap((display == NULL)); } static void DoCommandEcho(struct action *act) { char **args = act->args; int argc = CheckArgNum(act->nr, args); int msgok = display && !*rc_name; char *s = NULL; if (!msgok && (!rc_name || strcmp(rc_name, "-X"))) return; /* * user typed ^A:echo... well, echo isn't FinishRc's job, * but as he wanted to test us, we show good will */ if (argc > 1 && !strcmp(*args, "-n")) { args++; argc--; } s = *args; if (argc > 1 && !strcmp(*args, "-p")) { args++; argc--; s = *args; if (s) s = MakeWinMsg(s, fore, '%'); } if (s) OutputMsg(0, "%s", s); else { OutputMsg(0, "%s: 'echo [-n] [-p] \"string\"' expected.", rc_name); queryflag = -1; } } static void DoCommandBell(struct action *act) { char **args = act->args; if (*args == NULL) { char buf[256]; AddXChars(buf, ARRAY_SIZE(buf), BellString); OutputMsg(0, "bell_msg is '%s'", buf); return; } (void)ParseSaveStr(act, &BellString); } static void DoCommandBufferfile(struct action *act) { char **args = act->args; int msgok = display && !*rc_name; if (*args == NULL) BufferFile = SaveStr(DEFAULT_BUFFERFILE); else if (ParseSaveStr(act, &BufferFile)) return; if (msgok) OutputMsg(0, "Bufferfile is now '%s'", BufferFile); } static void DoCommandActivity(struct action *act) { (void)ParseSaveStr(act, &ActivityString); } static void DoCommandPow_detach_msg(struct action *act) { char **args = act->args; if (*args == NULL) { char buf[256]; AddXChars(buf, ARRAY_SIZE(buf), PowDetachString); OutputMsg(0, "pow_detach_msg is '%s'", buf); return; } (void)ParseSaveStr(act, &PowDetachString); } #if defined(ENABLE_UTMP) && defined(LOGOUTOK) static void DoCommandLogin(struct action *act) { char **args = act->args; bool b = fore->w_slot != (slot_t)(-1); if (*args && !strcmp(*args, "always")) { fore->w_lflag = 3; if (!displays && b) SlotToggle(b); return; } if (*args && !strcmp(*args, "attached")) { fore->w_lflag = 1; if (!displays && b) SlotToggle(0); return; } if (ParseSwitch(act, &b) == 0) SlotToggle(b); } static void DoCommandDeflogin(struct action *act) { char **args = act->args; bool b; if (!strcmp(*args, "always")) nwin_default.lflag |= 2; else if (!strcmp(*args, "attached")) nwin_default.lflag &= ~2; else if (ParseOnOff(act, &b) == 0) nwin_default.lflag = b ? 1 : 0; } #endif static void DoCommandDefflow(struct action *act) { char **args = act->args; bool b; if (args[0] && args[1] && args[1][0] == 'i') { iflag = true; for (display = displays; display; display = display->d_next) { if (!D_flow) continue; D_NewMode.tio.c_cc[VINTR] = D_OldMode.tio.c_cc[VINTR]; D_NewMode.tio.c_lflag |= ISIG; SetTTY(D_userfd, &D_NewMode); } } if (args[0] && args[0][0] == 'a') nwin_default.flowflag = FLOW_AUTOFLAG; else if (ParseOnOff(act, &b) == 0) nwin_default.flowflag = b ? FLOW_ON : FLOW_OFF; } static void DoCommandDefwrap(struct action *act) { (void)ParseOnOff(act, &nwin_default.wrap); } static void DoCommandDefc1(struct action *act) { (void)ParseOnOff(act, &nwin_default.c1); } static void DoCommandDefbce(struct action *act) { bool b; if (ParseOnOff(act, &b) == 0) nwin_default.bce = b ? 1 : 0; } static void DoCommandDefgr(struct action *act) { bool b; if (ParseOnOff(act, &b) == 0) nwin_default.gr = b ? 1 : 0; } static void DoCommandDefmonitor(struct action *act) { bool b; if (ParseOnOff(act, &b) == 0) nwin_default.monitor = b ? MON_ON : MON_OFF; } static void DoCommandDefmousetrack(struct action *act) { bool b; if (ParseOnOff(act, &b) == 0) defmousetrack = b ? 1000 : 0; } static void DoCommandMousetrack(struct action *act) { char **args = act->args; bool b; if (!args[0]) { OutputMsg(0, "Mouse tracking for this display is turned %s", D_mousetrack ? "on" : "off"); } else if (ParseOnOff(act, &b) == 0) { D_mousetrack = b ? 1000 : 0; if (D_fore) MouseMode(D_fore->w_mouse); } } static void DoCommandDefsilence(struct action *act) { bool b; if (ParseOnOff(act, &b) == 0) nwin_default.silence = b ? SILENCE_ON : SILENCE_OFF; } static void DoCommandVerbose(struct action *act) { char **args = act->args; if (!*args) OutputMsg(0, "W%s echo command when creating windows.", VerboseCreate ? "ill" : "on't"); else (void)ParseOnOff(act, &VerboseCreate); } static void DoCommandHardstatus(struct action *act) { char **args = act->args; int msgok = display && !*rc_name; char *s = NULL; if (display) { OutputMsg(0, "%s", ""); /* wait till mintime (keep gcc quiet) */ RemoveStatus(); } if (args[0] && strcmp(args[0], "on") && strcmp(args[0], "off")) { Display *olddisplay = display; int old_use, new_use = -1; s = args[0]; if (!strncmp(s, "always", 6)) s += 6; if (!strcmp(s, "firstline")) new_use = HSTATUS_FIRSTLINE; else if (!strcmp(s, "lastline")) new_use = HSTATUS_LASTLINE; else if (!strcmp(s, "ignore")) new_use = HSTATUS_IGNORE; else if (!strcmp(s, "message")) new_use = HSTATUS_MESSAGE; else if (!strcmp(args[0], "string")) { if (!args[1]) { char buf[256]; AddXChars(buf, ARRAY_SIZE(buf), hstatusstring); OutputMsg(0, "hardstatus string is '%s'", buf); return; } } else { OutputMsg(0, "%s: usage: hardstatus [always]lastline|ignore|message|string [string]", rc_name); return; } if (new_use != -1) { hardstatusemu = new_use | (s == args[0] ? 0 : HSTATUS_ALWAYS); for (display = displays; display; display = display->d_next) { RemoveStatus(); new_use = hardstatusemu & ~HSTATUS_ALWAYS; if (D_HS && s == args[0]) new_use = HSTATUS_HS; ShowHStatus(NULL); old_use = D_has_hstatus; D_has_hstatus = new_use; if ((new_use == HSTATUS_LASTLINE && old_use != HSTATUS_LASTLINE) || (new_use != HSTATUS_LASTLINE && old_use == HSTATUS_LASTLINE)) ChangeScreenSize(D_width, D_height, 1); if ((new_use == HSTATUS_FIRSTLINE && old_use != HSTATUS_FIRSTLINE) || (new_use != HSTATUS_FIRSTLINE && old_use == HSTATUS_FIRSTLINE)) ChangeScreenSize(D_width, D_height, 1); RefreshHStatus(); } } if (args[1]) { if (hstatusstring) free(hstatusstring); hstatusstring = SaveStr(args[1]); for (display = displays; display; display = display->d_next) RefreshHStatus(); } display = olddisplay; return; } (void)ParseSwitch(act, &use_hardstatus); if (msgok) OutputMsg(0, "messages displayed on %s", use_hardstatus ? "hardstatus line" : "window"); } static void DoCommandStatus(struct action *act) { char **args = act->args; if (display) { Msg(0, "%s", ""); /* wait till mintime (keep gcc quiet) */ RemoveStatus(); } { int i = 0; while ((i <= 1) && args[i]) { if ((strcmp(args[i], "top") == 0) || (strcmp(args[i], "up") == 0)) { statuspos.row = STATUS_TOP; } else if ((strcmp(args[i], "bottom") == 0) || (strcmp(args[i], "down") == 0)) { statuspos.row = STATUS_BOTTOM; } else if (strcmp(args[i], "left") == 0) { statuspos.col = STATUS_LEFT; } else if (strcmp(args[i], "right") == 0) { statuspos.col = STATUS_RIGHT; } else { Msg(0, "%s: usage: status [top|up|down|bottom] [left|right]", rc_name); break; } i++; } } } static void DoCommandCaption(struct action *act) { char **args = act->args; if (!*args) return; if (strcmp(args[0], "top") == 0) { captiontop = 1; args++; } else if(strcmp(args[0], "bottom") == 0) { captiontop = 0; args++; } if (strcmp(args[0], "always") == 0 || strcmp(args[0], "splitonly") == 0) { Display *olddisplay = display; captionalways = args[0][0] == 'a'; for (display = displays; display; display = display->d_next) ChangeScreenSize(D_width, D_height, 1); display = olddisplay; } else if (strcmp(args[0], "string") == 0) { if (!args[1]) { char buf[256]; AddXChars(buf, ARRAY_SIZE(buf), captionstring); OutputMsg(0, "caption string is '%s'", buf); return; } } else { OutputMsg(0, "%s: usage: caption [ top | bottom ] always|splitonly|string ", rc_name); return; } if (!args[1]) return; if (captionstring) free(captionstring); captionstring = SaveStr(args[1]); RedisplayDisplays(0); } static void DoCommandConsole(struct action *act) { bool b = (console_window != NULL); if (ParseSwitch(act, &b)) return; if (TtyGrabConsole(fore->w_ptyfd, b, rc_name)) return; if (b == 0) OutputMsg(0, "%s: releasing console %s", rc_name, HostName); else if (console_window) OutputMsg(0, "%s: stealing console %s from window %d (%s)", rc_name, HostName, console_window->w_number, console_window->w_title); else OutputMsg(0, "%s: grabbing console %s", rc_name, HostName); console_window = b ? fore : NULL; } static void DoCommandAllpartial(struct action *act) { int msgok = display && !*rc_name; if (ParseOnOff(act, &all_norefresh)) return; if (!all_norefresh && fore) Activate(-1); if (msgok) OutputMsg(0, all_norefresh ? "No refresh on window change!\n" : "Window specific refresh\n"); } static void DoCommandPartial(struct action *act) { bool b = fore->w_norefresh; (void)ParseSwitch(act, &b); fore->w_norefresh = b; } static void DoCommandVbell(struct action *act) { int msgok = display && !*rc_name; if (ParseSwitch(act, &visual_bell) || !msgok) return; if (visual_bell == 0) OutputMsg(0, "switched to audible bell."); else OutputMsg(0, "switched to visual bell."); } static void DoCommandVbellwait(struct action *act) { int msgok = display && !*rc_name; if (ParseNum1000(act, &VBellWait) == 0 && msgok) OutputMsg(0, "vbellwait set to %.10g seconds", VBellWait / 1000.); } static void DoCommandMsgwait(struct action *act) { int msgok = display && !*rc_name; if (ParseNum1000(act, &MsgWait) == 0 && msgok) OutputMsg(0, "msgwait set to %.10g seconds", MsgWait / 1000.); } static void DoCommandMsgminwait(struct action *act) { int msgok = display && !*rc_name; if (ParseNum1000(act, &MsgMinWait) == 0 && msgok) OutputMsg(0, "msgminwait set to %.10g seconds", MsgMinWait / 1000.); } static void DoCommandSilencewait(struct action *act) { int msgok = display && !*rc_name; if (ParseNum(act, &SilenceWait)) return; if (SilenceWait < 1) SilenceWait = 1; for (Window *win = mru_window; win; win = win->w_prev_mru) win->w_silencewait = SilenceWait; if (msgok) OutputMsg(0, "silencewait set to %d seconds", SilenceWait); } static void DoCommandBumpright(struct action *act) { Window *win = NextWindow(); (void)act; /* unused */ if (fore->w_number < win->w_number) SwapWindows(fore->w_number, win->w_number); } static void DoCommandBumpleft(struct action *act) { Window *win = PreviousWindow(); (void)act; /* unused */ if (fore->w_number > win->w_number) SwapWindows(fore->w_number, win->w_number); } static void DoCommandCollapse(struct action *act) { (void)act; /* unused */ CollapseWindowlist(); } static void DoCommandNumber(struct action *act) { char **args = act->args; if (*args == NULL) OutputMsg(0, queryflag >= 0 ? "%d (%s)" : "This is window %d (%s).", fore->w_number, fore->w_title); else { int old = fore->w_number; int rel = 0, parse; int n = 0; if (args[0][0] == '+') rel = 1; else if (args[0][0] == '-') rel = -1; if (rel) ++act->args[0]; parse = ParseNum(act, &n); if (rel) --act->args[0]; if (parse) return; if (rel > 0) n += old; else if (rel < 0) n = old - n; if (!SwapWindows(old, n)) { /* Window number could not be changed. */ queryflag = -1; return; } } } static void DoCommandZombie_timeout(struct action *act) { char **args = act->args; int argc = CheckArgNum(act->nr, args); if (argc != 1) { Msg(0, "Setting zombie polling needs a timeout arg\n"); return; } nwin_default.poll_zombie_timeout = atoi(args[0]); if (fore) fore->w_poll_zombie_timeout = nwin_default.poll_zombie_timeout; } static void DoCommandSort(struct action *act) { (void)act; /* unused */ if (first_window == last_window) { Msg(0, "Less than two windows, sorting makes no sense.\n"); return; } for (Window *w1 = first_window; w1; w1 = w1->w_next) { for (Window *w2 = w1; w2; w2 = w2->w_next) { if (strcmp(w2->w_title, w1->w_title) < 0) { Window *tmp; SwapWindows(w1->w_number, w2->w_number); /* swap pointers back, to continue looping correctly */ tmp = w1; w1 = w2; w2 = tmp; } } } WindowChanged(NULL, 0); } static void DoCommandSilence(struct action *act) { char **args = act->args; int msgok = display && !*rc_name; bool b = fore->w_silence != 0; int i = fore->w_silencewait; if (args[0] && (args[0][0] == '-' || (args[0][0] >= '0' && args[0][0] <= '9'))) { if (ParseNum(act, &i)) return; b = i > 0; } else if (ParseSwitch(act, &b)) return; if (b) { if (display) /* we tell only this user */ ACLBYTE(fore->w_lio_notify, D_user->u_id) |= ACLBIT(D_user->u_id); else for (int n = 0; n < maxusercount; n++) ACLBYTE(fore->w_lio_notify, n) |= ACLBIT(n); fore->w_silencewait = i; fore->w_silence = SILENCE_ON; SetTimeout(&fore->w_silenceev, fore->w_silencewait * 1000); evenq(&fore->w_silenceev); if (!msgok) return; OutputMsg(0, "The window is now being monitored for %d sec. silence.", fore->w_silencewait); } else { if (display) /* we remove only this user */ ACLBYTE(fore->w_lio_notify, D_user->u_id) &= ~ACLBIT(D_user->u_id); else for (int n = 0; n < maxusercount; n++) ACLBYTE(fore->w_lio_notify, n) &= ~ACLBIT(n); for (i = maxusercount - 1; i >= 0; i--) if (ACLBYTE(fore->w_lio_notify, i)) break; if (i < 0) { fore->w_silence = SILENCE_OFF; evdeq(&fore->w_silenceev); } if (!msgok) return; OutputMsg(0, "The window is no longer being monitored for silence."); } } static void DoCommandDefscrollback(struct action *act) { (void)ParseNum(act, &nwin_default.histheight); } static void DoCommandScrollback(struct action *act) { int msgok = display && !*rc_name; int n = 0; if (flayer->l_layfn == &MarkLf) { OutputMsg(0, "Cannot resize scrollback buffer in copy/scrollback mode."); return; } (void)ParseNum(act, &n); ChangeWindowSize(fore, fore->w_width, fore->w_height, n); if (msgok) OutputMsg(0, "scrollback set to %d", fore->w_histheight); } static void DoCommandSessionname(struct action *act) { char **args = act->args; if (*args == NULL) OutputMsg(0, "This session is named '%s'\n", SocketName); else { char buf[MAXPATHLEN]; char *s = NULL; if (ParseSaveStr(act, &s)) return; if (!*s || strlen(s) + (SocketName - SocketPath) > MAXPATHLEN - 13 || strchr(s, '/')) { OutputMsg(0, "%s: bad session name '%s'\n", rc_name, s); free(s); return; } strncpy(buf, SocketPath, SocketName - SocketPath); sprintf(buf + (SocketName - SocketPath), "%d.%s", (int)getpid(), s); free(s); if ((access(buf, F_OK) == 0) || (errno != ENOENT)) { OutputMsg(0, "%s: inappropriate path: '%s'.", rc_name, buf); return; } if (rename(SocketPath, buf)) { OutputMsg(errno, "%s: failed to rename(%s, %s)", rc_name, SocketPath, buf); return; } strncpy(SocketPath, buf, ARRAY_SIZE(SocketPath)); MakeNewEnv(); WindowChanged(NULL, WINESC_SESS_NAME); } } static void DoCommandSetenv(struct action *act) { char **args = act->args; if (!args[0] || !args[1]) { InputSetenv(args[0]); } else { setenv(args[0], args[1], 1); MakeNewEnv(); } } static void DoCommandUnsetenv(struct action *act) { char **args = act->args; if (*args) unsetenv(*args); MakeNewEnv(); } static void DoCommandDefslowpaste(struct action *act) { (void)ParseNum(act, &nwin_default.slow); } static void DoCommandSlowpaste(struct action *act) { char **args = act->args; int msgok = display && !*rc_name; if (*args == NULL) OutputMsg(0, fore->w_slowpaste ? "Slowpaste in window %d is %d milliseconds." : "Slowpaste in window %d is unset.", fore->w_number, fore->w_slowpaste); else if (ParseNum(act, &fore->w_slowpaste) == 0 && msgok) OutputMsg(0, fore->w_slowpaste ? "Slowpaste in window %d set to %d milliseconds." : "Slowpaste in window %d now unset.", fore->w_number, fore->w_slowpaste); } static void DoCommandMarkkeys(struct action *act) { char **args = act->args; int *argl = act->argl; if (CompileKeys(*args, *argl, mark_key_tab)) OutputMsg(0, "%s: markkeys: syntax error.", rc_name); } static void DoCommandPastefont(struct action *act) { int msgok = display && !*rc_name; if (ParseSwitch(act, &pastefont) == 0 && msgok) OutputMsg(0, "Will %spaste font settings", pastefont ? "" : "not "); } static void DoCommandCrlf(struct action *act) { (void)ParseSwitch(act, &join_with_cr); } static void DoCommandCompacthist(struct action *act) { int msgok = display && !*rc_name; if (ParseSwitch(act, &compacthist) == 0 && msgok) OutputMsg(0, "%scompacting history lines", compacthist ? "" : "not "); } static void DoCommandHardcopy_append(struct action *act) { (void)ParseOnOff(act, &hardcopy_append); } static void DoCommandVbell_msg(struct action *act) { char **args = act->args; if (*args == NULL) { char buf[256]; AddXChars(buf, ARRAY_SIZE(buf), VisualBellString); OutputMsg(0, "vbell_msg is '%s'", buf); return; } (void)ParseSaveStr(act, &VisualBellString); } static void DoCommandDefmode(struct action *act) { char **args = act->args; int msgok = display && !*rc_name; int n = 0; if (ParseBase(act, *args, &n, 8, "octal")) return; if (n < 0 || n > 0777) { OutputMsg(0, "%s: mode: Invalid tty mode %o", rc_name, n); return; } TtyMode = n; if (msgok) OutputMsg(0, "Ttymode set to %03o", TtyMode); } static void DoCommandAutodetach(struct action *act) { (void)ParseOnOff(act, &auto_detach); } static void DoCommandStartup_message(struct action *act) { (void)ParseOnOff(act, &default_startup); } static void DoCommandBind(struct action *act) { char **args = act->args; int argc = CheckArgNum(act->nr, args); int *argl = act->argl; int n = 0; struct action *ktabp = ktab; int kflag = 0; for (;;) { if (argc > 2 && !strcmp(*args, "-c")) { ktabp = FindKtab(args[1], 1); if (ktabp == NULL) break; args += 2; argl += 2; argc -= 2; } else if (argc > 1 && !strcmp(*args, "-k")) { kflag = 1; args++; argl++; argc--; } else break; } if (kflag) { for (n = 0; n < KMAP_KEYS; n++) if (strcmp(term[n + T_CAPS].tcname, *args) == 0) break; if (n == KMAP_KEYS) { OutputMsg(0, "%s: bind: unknown key '%s'", rc_name, *args); return; } n += 256; } else if (*argl != 1) { OutputMsg(0, "%s: bind: character, ^x, or (octal) \\032 expected.", rc_name); return; } else n = (unsigned char)args[0][0]; if (args[1]) { int i; if ((i = FindCommnr(args[1])) == RC_ILLEGAL) { OutputMsg(0, "%s: bind: unknown command '%s'", rc_name, args[1]); return; } if (CheckArgNum(i, args + 2) < 0) return; ClearAction(&ktabp[n]); SaveAction(ktabp + n, i, args + 2, argl + 2); } else ClearAction(&ktabp[n]); } static void DoCommandBindkey(struct action *act) { char **args = act->args; int *argl = act->argl; struct action *newact; int newnr, fl = 0, kf = 0, af = 0, df = 0, mf = 0; Display *olddisplay = display; int used = 0; struct kmap_ext *kme = NULL; int i; for (; *args && **args == '-'; args++, argl++) { if (strcmp(*args, "-t") == 0) fl = KMAP_NOTIMEOUT; else if (strcmp(*args, "-k") == 0) kf = 1; else if (strcmp(*args, "-a") == 0) af = 1; else if (strcmp(*args, "-d") == 0) df = 1; else if (strcmp(*args, "-m") == 0) mf = 1; else if (strcmp(*args, "--") == 0) { args++; argl++; break; } else { OutputMsg(0, "%s: bindkey: invalid option %s", rc_name, *args); return; } } if (df && mf) { OutputMsg(0, "%s: bindkey: -d does not work with -m", rc_name); return; } if (*args == NULL) { if (mf) display_bindkey("Edit mode", mmtab); else if (df) display_bindkey("Default", dmtab); else display_bindkey("User", umtab); return; } if (kf == 0) { if (af) { OutputMsg(0, "%s: bindkey: -a only works with -k", rc_name); return; } if (*argl == 0) { OutputMsg(0, "%s: bindkey: empty string makes no sense", rc_name); return; } for (i = 0, kme = kmap_exts; i < kmap_extn; i++, kme++) if (kme->str == NULL) { if (args[1]) break; } else if (*argl == (kme->fl & ~KMAP_NOTIMEOUT) && memcmp(kme->str, *args, *argl) == 0) break; if (i == kmap_extn) { if (!args[1]) { OutputMsg(0, "%s: bindkey: keybinding not found", rc_name); return; } kmap_extn += 8; kmap_exts = xrealloc((char *)kmap_exts, kmap_extn * sizeof(struct kmap_ext)); kme = kmap_exts + i; memset((char *)kme, 0, 8 * sizeof(struct kmap_ext)); for (; i < kmap_extn; i++, kme++) { kme->str = NULL; kme->dm.nr = kme->mm.nr = kme->um.nr = RC_ILLEGAL; kme->dm.args = kme->mm.args = kme->um.args = noargs; kme->dm.argl = kme->mm.argl = kme->um.argl = NULL; } i -= 8; kme -= 8; } if (df == 0 && kme->dm.nr != RC_ILLEGAL) used = 1; if (mf == 0 && kme->mm.nr != RC_ILLEGAL) used = 1; if ((df || mf) && kme->um.nr != RC_ILLEGAL) used = 1; i += KMAP_KEYS + KMAP_AKEYS; newact = df ? &kme->dm : mf ? &kme->mm : &kme->um; } else { for (i = T_CAPS; i < T_OCAPS; i++) if (strcmp(term[i].tcname, *args) == 0) break; if (i == T_OCAPS) { OutputMsg(0, "%s: bindkey: unknown key '%s'", rc_name, *args); return; } if (af && i >= T_CURSOR && i < T_OCAPS) i -= T_CURSOR - KMAP_KEYS; else i -= T_CAPS; newact = df ? &dmtab[i] : mf ? &mmtab[i] : &umtab[i]; } if (args[1]) { if ((newnr = FindCommnr(args[1])) == RC_ILLEGAL) { OutputMsg(0, "%s: bindkey: unknown command '%s'", rc_name, args[1]); return; } if (CheckArgNum(newnr, args + 2) < 0) return; ClearAction(newact); SaveAction(newact, newnr, args + 2, argl + 2); if (kf == 0 && args[1]) { if (kme->str) free(kme->str); kme->str = SaveStrn(*args, *argl); kme->fl = fl | *argl; } } else ClearAction(newact); for (display = displays; display; display = display->d_next) remap(i, args[1] ? 1 : 0); if (kf == 0 && !args[1]) { if (!used && kme->str) { free(kme->str); kme->str = NULL; kme->fl = 0; } } display = olddisplay; } static void DoCommandMaptimeout(struct action *act) { char **args = act->args; int msgok = display && !*rc_name; int n = 0; if (*args) { if (ParseNum(act, &n)) return; if (n < 0) { OutputMsg(0, "%s: maptimeout: illegal time %d", rc_name, n); return; } maptimeout = n; } if (*args == NULL || msgok) OutputMsg(0, "maptimeout is %dms", maptimeout); } static void DoCommandMapnotnext(struct action *act) { (void)act; /* unused */ D_dontmap = 1; } static void DoCommandMapdefault(struct action *act) { (void)act; /* unused */ D_mapdefault = 1; } static void DoCommandAclchg(struct action *act) { char **args = act->args; int argc = CheckArgNum(act->nr, args); UsersAcl(NULL, argc, args); } static void DoCommandAcldel(struct action *act) { char **args = act->args; int msgok = display && !*rc_name; if (UserDel(args[0], NULL)) return; if (msgok) OutputMsg(0, "%s removed from acl database", args[0]); } static void DoCommandAclgrp(struct action *act) { char **args = act->args; int msgok = display && !*rc_name; /* * modify a user to gain or lose rights granted to a group. * This group is actually a normal user whose rights were defined * with chacl in the usual way. */ if (args[1]) { if (strcmp(args[1], "none")) { /* link a user to another user */ if (AclLinkUser(args[0], args[1])) return; if (msgok) OutputMsg(0, "User %s joined acl-group %s", args[0], args[1]); } else { /* remove all groups from user */ struct acluser *u; struct aclusergroup *g; if (!(u = *FindUserPtr(args[0]))) return; while ((g = u->u_group)) { u->u_group = g->next; free((char *)g); } } } else { /* show all groups of user */ char buf[256], *p = buf; int ngroups = 0; struct acluser *u; struct aclusergroup *g; if (!(u = *FindUserPtr(args[0]))) { if (msgok) OutputMsg(0, "User %s does not exist.", args[0]); return; } g = u->u_group; while (g) { ngroups++; sprintf(p, "%s ", g->u->u_name); p += strlen(p); if (p > buf + 200) break; g = g->next; } if (ngroups) *(--p) = '\0'; OutputMsg(0, "%s's group%s: %s.", args[0], (ngroups == 1) ? "" : "s", (ngroups == 0) ? "none" : buf); } } static void DoCommandAclumask(struct action *act) { char **args = act->args; char *s = NULL; while ((s = *args++)) { char *err = NULL; if (AclUmask(display ? D_user : users, s, &err)) OutputMsg(0, "umask: %s\n", err); } } static void DoCommandMultiuser(struct action *act) { int msgok = display && !*rc_name; bool b; if (ParseOnOff(act, &b)) return; multi = b ? "" : NULL; chsock(); if (msgok) OutputMsg(0, "Multiuser mode %s", multi ? "enabled" : "disabled"); } static void DoCommandExec(struct action *act) { char **args = act->args; winexec(args); } static void DoCommandNonblock(struct action *act) { char **args = act->args; int msgok = display && !*rc_name; bool b = D_nonblock >= 0; int n = 0; if (*args && ((args[0][0] >= '0' && args[0][0] <= '9') || args[0][0] == '.')) { if (ParseNum1000(act, &n)) return; } else if (!ParseSwitch(act, &b)) n = b == 0 ? -1 : 1000; else return; if (msgok && n == -1) OutputMsg(0, "display set to blocking mode"); else if (msgok && n == 0) OutputMsg(0, "display set to nonblocking mode, no timeout"); else if (msgok) OutputMsg(0, "display set to nonblocking mode, %.10gs timeout", n / 1000.); D_nonblock = n; if (D_nonblock <= 0) evdeq(&D_blockedev); } static void DoCommandDefnonblock(struct action *act) { char **args = act->args; bool b; if (*args && ((args[0][0] >= '0' && args[0][0] <= '9') || args[0][0] == '.')) { if (ParseNum1000(act, &defnonblock)) return; } else if (!ParseOnOff(act, &b)) defnonblock = b == 0 ? -1 : 1000; else return; if (display && *rc_name) { D_nonblock = defnonblock; if (D_nonblock <= 0) evdeq(&D_blockedev); } } static void DoCommandGr(struct action *act) { int msgok = display && !*rc_name; bool b; if (fore->w_gr == 2) fore->w_gr = 0; b = fore->w_gr; if (ParseSwitch(act, &b) == 0 && msgok) { fore->w_gr = b ? 1 : 0; OutputMsg(0, "Will %suse GR", fore->w_gr ? "" : "not "); } if (fore->w_gr == 0 && fore->w_FontE) fore->w_gr = 2; } static void DoCommandC1(struct action *act) { int msgok = display && !*rc_name; if (ParseSwitch(act, &fore->w_c1) == 0 && msgok) OutputMsg(0, "Will %suse C1", fore->w_c1 ? "" : "not "); } static void DoCommandEncoding(struct action *act) { char **args = act->args; int msgok = display && !*rc_name; if (*args && !strcmp(args[0], "-d")) { if (!args[1]) OutputMsg(0, "encodings directory is %s", screenencodings ? screenencodings : ""); else { free(screenencodings); screenencodings = SaveStr(args[1]); } return; } if (*args && !strcmp(args[0], "-l")) { if (!args[1]) OutputMsg(0, "encoding: -l: argument required"); else if (LoadFontTranslation(-1, args[1])) OutputMsg(0, "encoding: could not load utf8 encoding file"); else if (msgok) OutputMsg(0, "encoding: utf8 encoding file loaded"); return; } for (int i = 0; i < 2; i++) { int n; if (args[i] == NULL) break; if (!strcmp(args[i], ".")) continue; n = FindEncoding(args[i]); if (n == -1) { OutputMsg(0, "encoding: unknown encoding '%s'", args[i]); break; } if (i == 0 && fore) { WinSwitchEncoding(fore, n); ResetCharsets(fore); } else if (i && display) D_encoding = n; } } static void DoCommandDefencoding(struct action *act) { char **args = act->args; int n; n = FindEncoding(*args); if (n == -1) { OutputMsg(0, "defencoding: unknown encoding '%s'", *args); return; } nwin_default.encoding = n; } static void DoCommandDefutf8(struct action *act) { int msgok = display && !*rc_name; bool b = nwin_default.encoding == UTF8; if (ParseSwitch(act, &b) == 0) { nwin_default.encoding = b ? UTF8 : 0; if (msgok) OutputMsg(0, "Will %suse UTF-8 encoding for new windows", b ? "" : "not "); } } static void DoCommandUtf8(struct action *act) { char **args = act->args; int msgok = display && !*rc_name; for (int i = 0; i < 2; i++) { int n; if (i && args[i] == NULL) break; if (args[i] == NULL) n = fore->w_encoding != UTF8; else if (strcmp(args[i], "off") == 0) n = 0; else if (strcmp(args[i], "on") == 0) n = 1; else { OutputMsg(0, "utf8: illegal argument (%s)", args[i]); break; } if (i == 0) { WinSwitchEncoding(fore, n ? UTF8 : 0); if (msgok) OutputMsg(0, "Will %suse UTF-8 encoding", n ? "" : "not "); } else if (display) D_encoding = n ? UTF8 : 0; if (args[i] == NULL) break; } } static void DoCommandPrintcmd(struct action *act) { char **args = act->args; int msgok = display && !*rc_name; if (*args) { if (printcmd) free(printcmd); printcmd = NULL; if (**args) printcmd = SaveStr(*args); } if (*args == NULL || msgok) { if (printcmd) OutputMsg(0, "using '%s' as print command", printcmd); else OutputMsg(0, "using termcap entries for printing"); return; } } static void DoCommandDigraph(struct action *act) { char **args = act->args; int *argl = act->argl; if (argl && argl[0] > 0 && args[1] && argl[1] > 0) { int i; if (argl[0] != 2) { OutputMsg(0, "Two characters expected to define a digraph"); return; } i = digraph_find(args[0]); digraphs[i].d[0] = args[0][0]; digraphs[i].d[1] = args[0][1]; if (!parse_input_int(args[1], argl[1], &digraphs[i].value)) { if (!(digraphs[i].value = atoi(args[1]))) { if (!args[1][1]) digraphs[i].value = (int)args[1][0]; else { int t; unsigned char *s = (unsigned char *)args[1]; digraphs[i].value = 0; while (*s) { t = FromUtf8(*s++, &digraphs[i].value); if (t == -1) continue; if (t == -2) digraphs[i].value = 0; else digraphs[i].value = t; break; } } } } return; } Input("Enter digraph: ", 10, INP_EVERY, digraph_fn, NULL, 0); if (*args && **args) { char *s = *args; size_t len = strlen(s); LayProcess(&s, &len); } } static void DoCommandDefhstatus(struct action *act) { char **args = act->args; if (*args == NULL) { char buf[256] = { 0 }; if (nwin_default.hstatus) AddXChars(buf, ARRAY_SIZE(buf), nwin_default.hstatus); OutputMsg(0, "default hstatus is '%s'", buf); return; } (void)ParseSaveStr(act, &nwin_default.hstatus); if (*nwin_default.hstatus == 0) { free(nwin_default.hstatus); nwin_default.hstatus = NULL; } } static void DoCommandHstatus(struct action *act) { (void)ParseSaveStr(act, &fore->w_hstatus); if (*fore->w_hstatus == 0) { free(fore->w_hstatus); fore->w_hstatus = NULL; } WindowChanged(fore, WINESC_HSTATUS); } static void DoCommandDefcharset(struct action *act) { char **args = act->args; size_t len; if (*args == NULL) { char buf[256] = { 0 }; if (nwin_default.charset) AddXChars(buf, ARRAY_SIZE(buf), nwin_default.charset); OutputMsg(0, "default charset is '%s'", buf); return; } len = strlen(*args); if (len == 0 || len > 6) { OutputMsg(0, "%s: defcharset: string has illegal size.", rc_name); return; } if (len > 4 && (((args[0][4] < '0' || args[0][4] > '3') && args[0][4] != '.') || ((args[0][5] < '0' || args[0][5] > '3') && args[0][5] && args[0][5] != '.'))) { OutputMsg(0, "%s: defcharset: illegal mapping number.", rc_name); return; } if (nwin_default.charset) free(nwin_default.charset); nwin_default.charset = SaveStr(*args); } static void DoCommandCharset(struct action *act) { char **args = act->args; size_t len; if (*args == NULL) { char buf[256] = { 0 }; if (nwin_default.charset) AddXChars(buf, ARRAY_SIZE(buf), nwin_default.charset); OutputMsg(0, "default charset is '%s'", buf); return; } len = strlen(*args); if (len == 0 || len > 6) { OutputMsg(0, "%s: charset: string has illegal size.", rc_name); return; } if (len > 4 && (((args[0][4] < '0' || args[0][4] > '3') && args[0][4] != '.') || ((args[0][5] < '0' || args[0][5] > '3') && args[0][5] && args[0][5] != '.'))) { OutputMsg(0, "%s: charset: illegal mapping number.", rc_name); return; } SetCharsets(fore, *args); } static void DoCommandRendition(struct action *act) { char **args = act->args; int *argl = act->argl; int msgok = display && !*rc_name; int i = -1; if (!*args) return; if (strcmp(args[0], "bell") == 0) { i = REND_BELL; } else if (strcmp(args[0], "monitor") == 0) { i = REND_MONITOR; } else if (strcmp(args[0], "silence") == 0) { i = REND_SILENCE; } else if (strcmp(args[0], "so") != 0) { OutputMsg(0, "Invalid option '%s' for rendition", args[0]); return; } ++args; ++argl; if (i != -1) { renditions[i] = ParseAttrColor(args[0], 1); WindowChanged(NULL, WINESC_WIN_NAMES); WindowChanged(NULL, WINESC_WIN_NAMES_NOCUR); WindowChanged(NULL, 0); return; } /* sorendition */ if (args[0]) { uint64_t i = ParseAttrColor(args[0], 1); if (i == 0) return; ApplyAttrColor(i, &mchar_so); WindowChanged(NULL, 0); } if (msgok) OutputMsg(0, "Standout attributes 0x%02x colorbg 0x%02x colorfg 0x%02x", (unsigned char)mchar_so.attr, (unsigned char)mchar_so.colorbg, (unsigned char)mchar_so.colorfg); } static void DoCommandSorendition(struct action *act) { char **args = act->args; int msgok = display && !*rc_name; if (args[0]) { uint64_t i = ParseAttrColor(args[0], 1); if (i == 0) return; ApplyAttrColor(i, &mchar_so); WindowChanged(NULL, 0); } if (msgok) OutputMsg(0, "Standout attributes 0x%02x colorbg 0x%02x colorfg 0x%02x", (unsigned char)mchar_so.attr, (unsigned char)mchar_so.colorbg, (unsigned char)mchar_so.colorfg); } static void DoCommandSource(struct action *act) { char **args = act->args; do_source(*args); } static void DoCommandSu(struct action *act) { char **args = act->args; char *s = NULL; if (!*args) { OutputMsg(0, "%s:%s screen login", HostName, SocketPath); InputSu(&D_user, NULL); } else if (!args[1]) InputSu(&D_user, args[0]); else if (!args[2]) s = DoSu(&D_user, args[0], args[1], "\377"); else s = DoSu(&D_user, args[0], args[1], args[2]); if (s) OutputMsg(0, "%s", s); } static void DoCommandSplit(struct action *act) { char **args = act->args; char *s = NULL; s = args[0]; if (s && !strcmp(s, "-v")) AddCanvas(SLICE_HORI); else AddCanvas(SLICE_VERT); Activate(-1); } static void DoCommandRemove(struct action *act) { (void)act; /* unused */ RemCanvas(); Activate(-1); } static void DoCommandOnly(struct action *act) { (void)act; /* unused */ OneCanvas(); Activate(-1); } static void DoCommandFit(struct action *act) { (void)act; /* unused */ D_forecv->c_xoff = D_forecv->c_xs; D_forecv->c_yoff = D_forecv->c_ys; RethinkViewportOffsets(D_forecv); ResizeLayer(D_forecv->c_layer, D_forecv->c_xe - D_forecv->c_xs + 1, D_forecv->c_ye - D_forecv->c_ys + 1, NULL); flayer = D_forecv->c_layer; LaySetCursor(); } static void DoCommandFocus(struct action *act) { char **args = act->args; Canvas *cv = NULL; if (!*args || !strcmp(*args, "next")) cv = D_forecv->c_next ? D_forecv->c_next : D_cvlist; else if (!strcmp(*args, "prev")) { for (cv = D_cvlist; cv->c_next && cv->c_next != D_forecv; cv = cv->c_next) ; } else if (!strcmp(*args, "top")) cv = D_cvlist; else if (!strcmp(*args, "bottom")) { for (cv = D_cvlist; cv->c_next; cv = cv->c_next) ; } else if (!strcmp(*args, "up")) cv = FindCanvas(D_forecv->c_xs, D_forecv->c_ys - 1); else if (!strcmp(*args, "down")) cv = FindCanvas(D_forecv->c_xs, D_forecv->c_ye + 2); else if (!strcmp(*args, "left")) cv = FindCanvas(D_forecv->c_xs - 1, D_forecv->c_ys); else if (!strcmp(*args, "right")) cv = FindCanvas(D_forecv->c_xe + 1, D_forecv->c_ys); else { OutputMsg(0, "%s: usage: focus [next|prev|up|down|left|right|top|bottom]", rc_name); return; } SetForeCanvas(display, cv); } static void DoCommandResize(struct action *act) { char **args = act->args; int i = 0; if (D_forecv->c_slorient == SLICE_UNKN) { OutputMsg(0, "resize: need more than one region"); return; } for (; *args; args++) { if (!strcmp(*args, "-h")) i |= RESIZE_FLAG_H; else if (!strcmp(*args, "-v")) i |= RESIZE_FLAG_V; else if (!strcmp(*args, "-b")) i |= RESIZE_FLAG_H | RESIZE_FLAG_V; else if (!strcmp(*args, "-p")) i |= D_forecv->c_slorient == SLICE_VERT ? RESIZE_FLAG_H : RESIZE_FLAG_V; else if (!strcmp(*args, "-l")) i |= RESIZE_FLAG_L; else break; } if (*args && args[1]) { OutputMsg(0, "%s: usage: resize [-h] [-v] [-l] [num]\n", rc_name); return; } if (*args) ResizeRegions(*args, i); else Input(resizeprompts[i], 20, INP_EVERY, ResizeFin, NULL, i); } static void DoCommandSetsid(struct action *act) { (void)ParseSwitch(act, &separate_sids); } static void DoCommandEval(struct action *act) { char **args = act->args; args = SaveArgs(args); for (int i = 0; args[i]; i++) { if (args[i][0]) ColonFin(args[i], strlen(args[i]), NULL); free(args[i]); } free(args); } static void DoCommandAltscreen(struct action *act) { int msgok = display && !*rc_name; (void)ParseSwitch(act, &use_altscreen); if (msgok) OutputMsg(0, "Will %sdo alternate screen switching", use_altscreen ? "" : "not "); } static void DoCommandAuth(struct action *act) { int msgok = display && !*rc_name; (void)ParseSwitch(act, &do_auth); if (msgok) OutputMsg(0, "Authentication: %s" , do_auth ? "enabled" : "disabled"); } static void DoCommandBacktick(struct action *act) { char **args = act->args; int argc = CheckArgNum(act->nr, args); int n = 0; if (ParseBase(act, *args, &n, 10, "decimal")) return; if (!args[1]) setbacktick(n, 0, 0, NULL); else { int lifespan, tick; if (argc < 4) { OutputMsg(0, "%s: usage: backtick num [lifespan tick cmd args...]", rc_name); return; } if (ParseBase(act, args[1], &lifespan, 10, "decimal")) return; if (ParseBase(act, args[2], &tick, 10, "decimal")) return; setbacktick(n, lifespan, tick, SaveArgs(args + 3)); } WindowChanged(NULL, WINESC_BACKTICK); } static void DoCommandBlanker(struct action *act) { (void)act; /* unused */ if (blankerprg) { RunBlanker(blankerprg); return; } ClearAll(); CursorVisibility(-1); D_blocked = 4; } static void DoCommandBlankerprg(struct action *act) { char **args = act->args; if (!args[0]) { if (blankerprg) { char path[MAXPATHLEN]; char *p = path, **pp; for (pp = blankerprg; *pp; pp++) p += snprintf(p, ARRAY_SIZE(path) - (p - path) - 1, "%s ", *pp); *(p - 1) = '\0'; OutputMsg(0, "blankerprg: %s", path); } else OutputMsg(0, "No blankerprg set."); return; } if (blankerprg) { char **pp; for (pp = blankerprg; *pp; pp++) free(*pp); free(blankerprg); blankerprg = NULL; } if (args[0][0]) blankerprg = SaveArgs(args); } static void DoCommandIdle(struct action *act) { char **args = act->args; int *argl = act->argl; int argc = CheckArgNum(act->nr, args); int msgok = display && !*rc_name; if (*args) { Display *olddisplay = display; if (!strcmp(*args, "off")) idletimo = 0; else if (args[0][0]) idletimo = atoi(*args) * 1000; if (argc > 1) { int i; if ((i = FindCommnr(args[1])) == RC_ILLEGAL) { OutputMsg(0, "%s: idle: unknown command '%s'", rc_name, args[1]); return; } if (CheckArgNum(i, args + 2) < 0) return; ClearAction(&idleaction); SaveAction(&idleaction, i, args + 2, argl + 2); } for (display = displays; display; display = display->d_next) ResetIdle(); display = olddisplay; } if (msgok) { if (idletimo) OutputMsg(0, "idle timeout %ds, %s", idletimo / 1000, comms[idleaction.nr].name); else OutputMsg(0, "idle off"); } } static void DoCommandFocusminsize(struct action *act) { char **args = act->args; int msgok = display && !*rc_name; int n = 0; for (int i = 0; i < 2 && args[i]; i++) { if (!strcmp(args[i], "max") || !strcmp(args[i], "_")) n = -1; else n = atoi(args[i]); if (i == 0) focusminwidth = n; else focusminheight = n; } if (msgok) { char b[2][20]; for (int i = 0; i < 2; i++) { n = i == 0 ? focusminwidth : focusminheight; if (n == -1) strncpy(b[i], "max", 20); else sprintf(b[i], "%d", n); } OutputMsg(0, "focus min size is %s %s\n", b[0], b[1]); } } static void DoCommandGroup(struct action *act) { char **args = act->args; int msgok = display && !*rc_name; if (*args) { fore->w_group = NULL; if (args[0][0]) { fore->w_group = WindowByName(*args); if (fore->w_group == fore || (fore->w_group && fore->w_group->w_type != W_TYPE_GROUP)) fore->w_group = NULL; } WindowChanged(NULL, WINESC_WIN_NAMES); WindowChanged(NULL, WINESC_WIN_NAMES_NOCUR); WindowChanged(NULL, 0); } if (msgok) { if (fore->w_group) OutputMsg(0, "window group is %d (%s)\n", fore->w_group->w_number, fore->w_group->w_title); else OutputMsg(0, "window belongs to no group"); } } static void DoCommandLayout(struct action *act) { char **args = act->args; int msgok = display && !*rc_name; if (!*args) return; // A number of the subcommands for "layout" are ignored, or not processed correctly when there // is no attached display. if (!strcmp(args[0], "title")) { if (!display) { if (!args[1]) // There is no display, and there is no new title. Ignore. return; if (!layout_attach || layout_attach == &layout_last_marker) layout_attach = CreateLayout(args[1], 0); else RenameLayout(layout_attach, args[1]); return; } if (!D_layout) { OutputMsg(0, "not on a layout"); return; } if (!args[1]) { OutputMsg(0, "current layout is %d (%s)", D_layout->lay_number, D_layout->lay_title); return; } RenameLayout(D_layout, args[1]); } else if (!strcmp(args[0], "number")) { if (!display) { if (args[1] && layout_attach && layout_attach != &layout_last_marker) RenumberLayout(layout_attach, atoi(args[1])); return; } if (!D_layout) { OutputMsg(0, "not on a layout"); return; } if (!args[1]) { OutputMsg(0, "This is layout %d (%s).\n", D_layout->lay_number, D_layout->lay_title); return; } RenumberLayout(D_layout, atoi(args[1])); return; } else if (!strcmp(args[0], "autosave")) { if (!display) { if (args[1] && layout_attach && layout_attach != &layout_last_marker) { if (!strcmp(args[1], "on")) layout_attach->lay_autosave = 1; else if (!strcmp(args[1], "off")) layout_attach->lay_autosave = 0; } return; } if (!D_layout) { OutputMsg(0, "not on a layout"); return; } if (args[1]) { if (!strcmp(args[1], "on")) D_layout->lay_autosave = 1; else if (!strcmp(args[1], "off")) D_layout->lay_autosave = 0; else { OutputMsg(0, "invalid argument. Give 'on' or 'off"); return; } } if (msgok) OutputMsg(0, "autosave is %s", D_layout->lay_autosave ? "on" : "off"); } else if (!strcmp(args[0], "new")) { char *t = args[1]; int n = 0; if (t) { while (*t >= '0' && *t <= '9') t++; if (t != args[1] && (!*t || *t == ':')) { n = atoi(args[1]); if (*t) t++; } else t = args[1]; } if (!t || !*t) t = "layout"; NewLayout(t, n); Activate(-1); } else if (!strcmp(args[0], "save")) { if (!args[1]) { OutputMsg(0, "usage: layout save "); return; } if (display) SaveLayout(args[1], &D_canvas); } else if (!strcmp(args[0], "select")) { if (!display) { if (args[1]) layout_attach = FindLayout(args[1]); return; } if (!args[1]) { Input("Switch to layout: ", 20, INP_COOKED, SelectLayoutFin, NULL, 0); return; } SelectLayoutFin(args[1], strlen(args[1]), NULL); } else if (!strcmp(args[0], "next")) { if (!display) { if (layout_attach && layout_attach != &layout_last_marker) layout_attach = layout_attach->lay_next ? layout_attach->lay_next : layouts;; return; } Layout *lay = D_layout; if (lay) lay = lay->lay_next ? lay->lay_next : layouts; else lay = layouts; if (!lay) { OutputMsg(0, "no layout defined"); return; } if (lay == D_layout) return; LoadLayout(lay); Activate(-1); } else if (!strcmp(args[0], "prev")) { Layout *lay = display ? D_layout : layout_attach; Layout *target = lay; if (lay) { for (lay = layouts; lay->lay_next && lay->lay_next != target; lay = lay->lay_next) ; } else lay = layouts; if (!display) { layout_attach = lay; return; } if (!lay) { OutputMsg(0, "no layout defined"); return; } if (lay == D_layout) return; LoadLayout(lay); Activate(-1); } else if (!strcmp(args[0], "attach")) { if (!args[1]) { if (!layout_attach) OutputMsg(0, "no attach layout set"); else if (layout_attach == &layout_last_marker) OutputMsg(0, "will attach to last layout"); else OutputMsg(0, "will attach to layout %d (%s)", layout_attach->lay_number, layout_attach->lay_title); return; } if (!strcmp(args[1], ":last")) layout_attach = &layout_last_marker; else if (!args[1][0]) layout_attach = NULL; else { Layout *lay; lay = FindLayout(args[1]); if (!lay) { OutputMsg(0, "unknown layout '%s'", args[1]); return; } layout_attach = lay; } } else if (!strcmp(args[0], "show")) { ShowLayouts(-1); } else if (!strcmp(args[0], "remove")) { Layout *lay = display ? D_layout : layouts; if (args[1]) { lay = layouts ? FindLayout(args[1]) : NULL; if (!lay) { OutputMsg(0, "unknown layout '%s'", args[1]); return; } } if (lay) RemoveLayout(lay); } else if (!strcmp(args[0], "dump")) { if (!display) OutputMsg(0, "Must have a display for 'layout dump'."); else if (!LayoutDumpCanvas(&D_canvas, args[1] ? args[1] : "layout-dump")) OutputMsg(errno, "Error dumping layout."); else OutputMsg(0, "Layout dumped to \"%s\"", args[1] ? args[1] : "layout-dump"); } else OutputMsg(0, "unknown layout subcommand"); } static void DoCommandCjkwidth(struct action *act) { int msgok = display && !*rc_name; if (ParseSwitch(act, &cjkwidth) == 0) { if (msgok) OutputMsg(0, "Treat ambiguous width characters as %s width", cjkwidth ? "full" : "half"); } } static void DoCommandTruecolor(struct action *act) { if (ParseOnOff(act, &hastruecolor) == 0) Activate(-1); } void DoAction(struct action *act) { int nr = act->nr; char **args = act->args; int argc, n; Display *odisplay = display; if (nr == RC_ILLEGAL) { return; } n = comms[nr].flags; /* Commands will have a CAN_QUERY flag, depending on whether they have * something to return on a query. For example, 'windows' can return a result, * but 'other' cannot. * If some command causes an error, then it should reset queryflag to -1, so that * the process requesting the query can be notified that an error happened. */ if (!(n & CAN_QUERY) && queryflag >= 0) { /* Query flag is set, but this command cannot be queried. */ OutputMsg(0, "%s command cannot be queried.", comms[nr].name); queryflag = -1; return; } if ((n & NEED_DISPLAY) && display == NULL) { OutputMsg(0, "%s: %s: display required", rc_name, comms[nr].name); queryflag = -1; return; } if ((n & NEED_FORE) && fore == NULL) { OutputMsg(0, "%s: %s: window required", rc_name, comms[nr].name); queryflag = -1; return; } if ((n & NEED_LAYER) && flayer == NULL) { OutputMsg(0, "%s: %s: display or window required", rc_name, comms[nr].name); queryflag = -1; return; } if ((argc = CheckArgNum(nr, args)) < 0) return; if (display) { if (AclCheckPermCmd(D_user, ACL_EXEC, &comms[nr])) { OutputMsg(0, "%s: %s: permission denied (user %s)", rc_name, comms[nr].name, (EffectiveAclUser ? EffectiveAclUser : D_user)->u_name); queryflag = -1; return; } } switch (nr) { case RC_SELECT: DoCommandSelect(act); break; case RC_MULTIINPUT: DoCommandMultiinput(act); break; case RC_DEFAUTONUKE: DoCommandDefautonuke(act); break; case RC_AUTONUKE: DoCommandAutonuke(act); break; case RC_DEFOBUFLIMIT: DoCommandDefobuflimit(act); break; case RC_OBUFLIMIT: DoCommandObuflimit(act); break; case RC_DUMPTERMCAP: DoCommandDumptermcap(act); break; case RC_HARDCOPY: DoCommandHardcopy(act); break; case RC_DEFLOG: DoCommandDeflog(act); break; case RC_LOG: DoCommandLog(act); break; case RC_SUSPEND: DoCommandSuspend(act); break; case RC_NEXT: DoCommandNext(act); break; case RC_PREV: DoCommandPrev(act); break; case RC_PARENT: DoCommandParent(act); break; case RC_KILL: DoCommandKill(act); break; case RC_QUIT: DoCommandQuit(act); break; case RC_DETACH: DoCommandDetach(act); break; case RC_POW_DETACH: DoCommandPow_detach(act); break; case RC_ZMODEM: DoCommandZmodem(act); break; case RC_UNBINDALL: DoCommandUnbindall(act); break; case RC_ZOMBIE: DoCommandZombie(act); break; case RC_WALL: DoCommandWall(act); break; case RC_AT: DoCommandAt(act); break; case RC_READREG: DoCommandReadreg(act); break; case RC_REGISTER: DoCommandRegister(act); break; case RC_PROCESS: DoCommandProcess(act); break; case RC_STUFF: DoCommandStuff(act); break; case RC_REDISPLAY: DoCommandRedisplay(act); break; case RC_WINDOWS: DoCommandWindows(act); break; case RC_VERSION: DoCommandVersion(act); break; case RC_INFO: DoCommandInfo(act); break; case RC_DINFO: DoCommandDinfo(act); break; case RC_COMMAND: DoCommandCommand(act); break; case RC_OTHER: DoCommandOther(act); break; case RC_META: DoCommandMeta(act); break; case RC_XON: DoCommandXon(act); break; case RC_XOFF: DoCommandXoff(act); break; case RC_DEFBREAKTYPE: case RC_BREAKTYPE: DoCommandBreaktype(act); break; case RC_POW_BREAK: DoCommandPow_break(act); break; case RC_BREAK: DoCommandBreak(act); break; case RC_LOCKSCREEN: DoCommandLockscreen(act); break; case RC_WIDTH: DoCommandWidth(act); break; case RC_HEIGHT: DoCommandHeight(act); break; case RC_DEFDYNAMICTITLE: DoCommandDefdynamictitle(act); break; case RC_DYNAMICTITLE: DoCommandDynamictitle(act); break; case RC_TITLE: DoCommandTitle(act); break; case RC_COLON: DoCommandColon(act); break; case RC_LASTMSG: DoCommandLastmsg(act); break; case RC_SCREEN: DoCommandScreen(act); break; case RC_WRAP: DoCommandWrap(act); break; case RC_FLOW: DoCommandFlow(act); break; case RC_DEFWRITELOCK: DoCommandDefwritelock(act); break; case RC_WRITELOCK: DoCommandWritelock(act); break; case RC_CLEAR: DoCommandClear(act); break; case RC_RESET: DoCommandReset(act); break; case RC_MONITOR: DoCommandMonitor(act); break; case RC_DISPLAYS: DoCommandDisplays(act); break; case RC_WINDOWLIST: DoCommandWindowlist(act); break; case RC_HELP: DoCommandHelp(act); break; case RC_LICENSE: DoCommandLicense(act); break; case RC_COPY: DoCommandCopy(act); break; case RC_HISTORY: DoCommandHistory(act); break; case RC_PASTE: DoCommandPaste(act); break; case RC_WRITEBUF: DoCommandWritebuf(act); break; case RC_READBUF: DoCommandReadbuf(act); break; case RC_REMOVEBUF: DoCommandRemovebuf(act); break; case RC_IGNORECASE: DoCommandIgnorecase(act); break; case RC_ESCAPE: DoCommandEscape(act); break; case RC_DEFESCAPE: DoCommandDefescape(act); break; case RC_CHDIR: DoCommandChdir(act); break; case RC_SHELL: case RC_DEFSHELL: DoCommandShell(act); break; case RC_HARDCOPYDIR: DoCommandHardcopydir(act); break; case RC_LOGFILE: DoCommandLogfile(act); break; case RC_LOGTSTAMP: DoCommandLogtstamp(act); break; case RC_SHELLTITLE: DoCommandShelltitle(act); break; case RC_TERMCAP: case RC_TERMCAPINFO: case RC_TERMINFO: DoCommandTerminfo(act); break; case RC_SLEEP: DoCommandSleep(act); break; case RC_TERM: DoCommandTerm(act); break; case RC_ECHO: DoCommandEcho(act); break; case RC_BELL: case RC_BELL_MSG: DoCommandBell(act); break; case RC_BUFFERFILE: DoCommandBufferfile(act); break; case RC_ACTIVITY: DoCommandActivity(act); break; case RC_POW_DETACH_MSG: DoCommandPow_detach_msg(act); break; #if defined(ENABLE_UTMP) && defined(LOGOUTOK) case RC_LOGIN: DoCommandLogin(act); break; case RC_DEFLOGIN: DoCommandDeflogin(act); break; #endif case RC_DEFFLOW: DoCommandDefflow(act); break; case RC_DEFWRAP: DoCommandDefwrap(act); break; case RC_DEFC1: DoCommandDefc1(act); break; case RC_DEFBCE: DoCommandDefbce(act); break; case RC_DEFGR: DoCommandDefgr(act); break; case RC_DEFMONITOR: DoCommandDefmonitor(act); break; case RC_DEFMOUSETRACK: DoCommandDefmousetrack(act); break; case RC_MOUSETRACK: DoCommandMousetrack(act); break; case RC_DEFSILENCE: DoCommandDefsilence(act); break; case RC_VERBOSE: DoCommandVerbose(act); break; case RC_HARDSTATUS: DoCommandHardstatus(act); break; case RC_STATUS: DoCommandStatus(act); break; case RC_CAPTION: DoCommandCaption(act); break; case RC_CONSOLE: DoCommandConsole(act); break; case RC_ALLPARTIAL: DoCommandAllpartial(act); break; case RC_PARTIAL: DoCommandPartial(act); break; case RC_VBELL: DoCommandVbell(act); break; case RC_VBELLWAIT: DoCommandVbellwait(act); break; case RC_MSGWAIT: DoCommandMsgwait(act); break; case RC_MSGMINWAIT: DoCommandMsgminwait(act); break; case RC_SILENCEWAIT: DoCommandSilencewait(act); break; case RC_BUMPRIGHT: DoCommandBumpright(act); break; case RC_BUMPLEFT: DoCommandBumpleft(act); break; case RC_COLLAPSE: DoCommandCollapse(act); break; case RC_NUMBER: DoCommandNumber(act); break; case RC_ZOMBIE_TIMEOUT: DoCommandZombie_timeout(act); break; case RC_SORT: DoCommandSort(act); break; case RC_SILENCE: DoCommandSilence(act); break; case RC_DEFSCROLLBACK: DoCommandDefscrollback(act); break; case RC_SCROLLBACK: DoCommandScrollback(act); break; case RC_SESSIONNAME: DoCommandSessionname(act); break; case RC_SETENV: DoCommandSetenv(act); break; case RC_UNSETENV: DoCommandUnsetenv(act); break; case RC_DEFSLOWPASTE: DoCommandDefslowpaste(act); break; case RC_SLOWPASTE: DoCommandSlowpaste(act); break; case RC_MARKKEYS: DoCommandMarkkeys(act); break; case RC_PASTEFONT: DoCommandPastefont(act); break; case RC_CRLF: DoCommandCrlf(act); break; case RC_COMPACTHIST: DoCommandCompacthist(act); break; case RC_HARDCOPY_APPEND: DoCommandHardcopy_append(act); break; case RC_VBELL_MSG: DoCommandVbell_msg(act); break; case RC_DEFMODE: DoCommandDefmode(act); break; case RC_AUTODETACH: DoCommandAutodetach(act); break; case RC_STARTUP_MESSAGE: DoCommandStartup_message(act); break; case RC_BIND: DoCommandBind(act); break; case RC_BINDKEY: DoCommandBindkey(act); break; case RC_MAPTIMEOUT: DoCommandMaptimeout(act); break; case RC_MAPNOTNEXT: DoCommandMapnotnext(act); break; case RC_MAPDEFAULT: DoCommandMapdefault(act); break; case RC_ACLCHG: case RC_ACLADD: case RC_ADDACL: case RC_CHACL: DoCommandAclchg(act); break; case RC_ACLDEL: DoCommandAcldel(act); break; case RC_ACLGRP: DoCommandAclgrp(act); break; case RC_ACLUMASK: case RC_UMASK: DoCommandAclumask(act); break; case RC_MULTIUSER: DoCommandMultiuser(act); break; case RC_EXEC: DoCommandExec(act); break; case RC_NONBLOCK: DoCommandNonblock(act); break; case RC_DEFNONBLOCK: DoCommandDefnonblock(act); break; case RC_GR: DoCommandGr(act); break; case RC_C1: DoCommandC1(act); break; case RC_KANJI: case RC_ENCODING: DoCommandEncoding(act); break; case RC_DEFKANJI: case RC_DEFENCODING: DoCommandDefencoding(act); break; case RC_DEFUTF8: DoCommandDefutf8(act); break; case RC_UTF8: DoCommandUtf8(act); break; case RC_PRINTCMD: DoCommandPrintcmd(act); break; case RC_DIGRAPH: DoCommandDigraph(act); break; case RC_DEFHSTATUS: DoCommandDefhstatus(act); break; case RC_HSTATUS: DoCommandHstatus(act); break; case RC_DEFCHARSET: DoCommandDefcharset(act); break; case RC_CHARSET: DoCommandCharset(act); break; case RC_RENDITION: DoCommandRendition(act); break; case RC_SORENDITION: DoCommandSorendition(act); break; case RC_SOURCE: DoCommandSource(act); break; case RC_SU: DoCommandSu(act); break; case RC_SPLIT: DoCommandSplit(act); break; case RC_REMOVE: DoCommandRemove(act); break; case RC_ONLY: DoCommandOnly(act); break; case RC_FIT: DoCommandFit(act); break; case RC_FOCUS: DoCommandFocus(act); break; case RC_RESIZE: DoCommandResize(act); break; case RC_SETSID: DoCommandSetsid(act); break; case RC_EVAL: DoCommandEval(act); break; case RC_ALTSCREEN: DoCommandAltscreen(act); break; case RC_AUTH: DoCommandAuth(act); break; case RC_BACKTICK: DoCommandBacktick(act); break; case RC_BLANKER: DoCommandBlanker(act); break; case RC_BLANKERPRG: DoCommandBlankerprg(act); break; case RC_IDLE: DoCommandIdle(act); break; case RC_FOCUSMINSIZE: DoCommandFocusminsize(act); break; case RC_GROUP: DoCommandGroup(act); break; case RC_LAYOUT: DoCommandLayout(act); break; case RC_CJKWIDTH: DoCommandCjkwidth(act); break; case RC_TRUECOLOR: DoCommandTruecolor(act); break; default: break; } if (display != odisplay) { for (display = displays; display; display = display->d_next) if (display == odisplay) break; } } #undef OutputMsg void CollapseWindowlist(void) /* renumber windows from 0, leaving no gaps */ { int n = 0; for (Window *w = first_window; w; w = w->w_next) w->w_number = n++; } void DoCommand(char **argv, int *argl) { struct action act; const char *cmd = *argv; act.quiet = 0; /* For now, we actually treat both 'suppress error' and 'suppress normal message' as the * same, and ignore all messages on either flag. If we wanted to do otherwise, we would * need to change the definition of 'OutputMsg' slightly. */ if (*cmd == '@') { /* Suppress error */ act.quiet |= 0x01; cmd++; } if (*cmd == '-') { /* Suppress normal message */ act.quiet |= 0x02; cmd++; } if ((act.nr = FindCommnr(cmd)) == RC_ILLEGAL) { Msg(0, "%s: unknown command '%s'", rc_name, cmd); return; } act.args = argv + 1; act.argl = argl + 1; DoAction(&act); } static void SaveAction(struct action *act, int nr, char **args, int *argl) { int argc = 0; char **pp; int *lp; if (args) while (args[argc]) argc++; if (argc == 0) { act->nr = nr; act->args = noargs; act->argl = NULL; return; } if ((pp = malloc((unsigned)(argc + 1) * sizeof(char *))) == NULL) Panic(0, "%s", strnomem); if ((lp = malloc((unsigned)(argc) * sizeof(int))) == NULL) Panic(0, "%s", strnomem); act->nr = nr; act->args = pp; act->argl = lp; while (argc--) { *lp = argl ? *argl++ : (int)strlen(*args); *pp++ = SaveStrn(*args++, *lp++); } *pp = NULL; } static char **SaveArgs(char **args) { char **ap, **pp; int argc = 0; while (args[argc]) argc++; if ((pp = ap = malloc((unsigned)(argc + 1) * sizeof(char *))) == NULL) Panic(0, "%s", strnomem); while (argc--) *pp++ = SaveStr(*args++); *pp = NULL; return ap; } /* * buf is split into argument vector args. * leading whitespace is removed. * @!| abbreviations are expanded. * the end of buffer is recognized by '\0' or an un-escaped '#'. * " and ' are interpreted. * * argc is returned. */ int Parse(char *buf, int bufl, char **args, int *argl) { char *p = buf, **ap = args, *pp; int delim, argc; int *lp = argl; argc = 0; pp = buf; delim = 0; for (;;) { *lp = 0; while (*p && (*p == ' ' || *p == '\t')) ++p; if (argc == 0 && *p == '!') { *ap++ = "exec"; *lp++ = 4; p++; argc++; continue; } if (*p == '\0' || *p == '#' || *p == '\n') { *p = '\0'; args[argc] = NULL; return argc; } if (++argc >= MAXARGS) { Msg(0, "%s: too many tokens.", rc_name); return 0; } *ap++ = pp; while (*p) { if (*p == delim) delim = 0; else if (delim != '\'' && *p == '\\' && (p[1] == 'n' || p[1] == 'r' || p[1] == 't' || p[1] == '\'' || p[1] == '"' || p[1] == '\\' || p[1] == '$' || p[1] == '#' || p[1] == '^' || (p[1] >= '0' && p[1] <= '7'))) { p++; if (*p >= '0' && *p <= '7') { *pp = *p - '0'; if (p[1] >= '0' && p[1] <= '7') { p++; *pp = (*pp << 3) | (*p - '0'); if (p[1] >= '0' && p[1] <= '7') { p++; *pp = (*pp << 3) | (*p - '0'); } } pp++; } else { switch (*p) { case 'n': *pp = '\n'; break; case 'r': *pp = '\r'; break; case 't': *pp = '\t'; break; default: *pp = *p; break; } pp++; } } else if (delim != '\'' && *p == '$' && (p[1] == '{' || p[1] == ':' || (p[1] >= 'a' && p[1] <= 'z') || (p[1] >= 'A' && p[1] <= 'Z') || (p[1] >= '0' && p[1] <= '9') || p[1] == '_')) { char *ps, *pe, op, *v, xbuf[11], path[MAXPATHLEN]; int vl; ps = ++p; p++; while (*p) { if (*ps == '{' && *p == '}') break; if (*ps == ':' && *p == ':') break; if (*ps != '{' && *ps != ':' && (*p < 'a' || *p > 'z') && (*p < 'A' || *p > 'Z') && (*p < '0' || *p > '9') && *p != '_') break; p++; } pe = p; if (*ps == '{' || *ps == ':') { if (!*p) { Msg(0, "%s: bad variable name.", rc_name); return 0; } p++; } op = *pe; *pe = 0; if (*ps == ':') v = gettermcapstring(ps + 1); else { if (*ps == '{') ps++; v = xbuf; if (!strcmp(ps, "TERM")) v = display ? D_termname : "unknown"; else if (!strcmp(ps, "COLUMNS")) sprintf(xbuf, "%d", display ? D_width : -1); else if (!strcmp(ps, "LINES")) sprintf(xbuf, "%d", display ? D_height : -1); else if (!strcmp(ps, "PID")) sprintf(xbuf, "%d", getpid()); else if (!strcmp(ps, "PWD")) { if (getcwd(path, ARRAY_SIZE(path) - 1) == NULL) v = "?"; else v = path; } else if (!strcmp(ps, "STY")) { if ((v = strchr(SocketName, '.'))) /* Skip the PID */ v++; else v = SocketName; } else v = getenv(ps); } *pe = op; vl = v ? strlen(v) : 0; if (vl) { if (p - pp < vl) { int right = buf + bufl - (p + strlen(p) + 1); if (right > 0) { memmove(p + right, p, strlen(p) + 1); p += right; } } if (p - pp < vl) { Msg(0, "%s: no space left for variable expansion.", rc_name); return 0; } memmove(pp, v, vl); pp += vl; } continue; } else if (delim != '\'' && *p == '^' && p[1]) { p++; *pp++ = *p == '?' ? '\177' : *p & 0x1f; } else if (delim == 0 && (*p == '\'' || *p == '"')) delim = *p; else if (delim == 0 && (*p == ' ' || *p == '\t' || *p == '\n')) break; else *pp++ = *p; p++; } if (delim) { Msg(0, "%s: Missing %c quote.", rc_name, delim); return 0; } if (*p) p++; *pp = 0; *lp++ = pp - ap[-1]; pp++; } } void SetEscape(struct acluser *u, int e, int me) { if (u) { u->u_Esc = e; u->u_MetaEsc = me; } else { if (users) { if (DefaultEsc >= 0) ClearAction(&ktab[DefaultEsc]); if (DefaultMetaEsc >= 0) ClearAction(&ktab[DefaultMetaEsc]); } DefaultEsc = e; DefaultMetaEsc = me; if (users) { if (DefaultEsc >= 0) { ClearAction(&ktab[DefaultEsc]); ktab[DefaultEsc].nr = RC_OTHER; } if (DefaultMetaEsc >= 0) { ClearAction(&ktab[DefaultMetaEsc]); ktab[DefaultMetaEsc].nr = RC_META; } } } } static int ParseSwitch(struct action *act, bool *var) { if (*act->args == NULL) { *var ^= true; return 0; } return ParseOnOff(act, var); } static int ParseOnOff(struct action *act, bool *var) { int num = -1; char **args = act->args; if (*args && args[1] == NULL) { if (strcmp(args[0], "on") == 0) num = true; else if (strcmp(args[0], "off") == 0) num = false; } if (num < 0) { Msg(0, "%s: %s: invalid argument. Give 'on' or 'off'", rc_name, comms[act->nr].name); return -1; } *var = num; return 0; } static int ParseSaveStr(struct action *act, char **var) { char **args = act->args; if (*args == NULL || args[1]) { Msg(0, "%s: %s: one argument required.", rc_name, comms[act->nr].name); return -1; } if (*var) free(*var); *var = SaveStr(*args); return 0; } static int ParseNum(struct action *act, int *var) { int i; char *p, **args = act->args; p = *args; if (p == NULL || *p == 0 || args[1]) { Msg(0, "%s: %s: invalid argument. Give one argument.", rc_name, comms[act->nr].name); return -1; } i = 0; while (*p) { if (*p >= '0' && *p <= '9') i = 10 * i + (*p - '0'); else { Msg(0, "%s: %s: invalid argument. Give numeric argument.", rc_name, comms[act->nr].name); return -1; } p++; } *var = i; return 0; } static int ParseNum1000(struct action *act, int *var) { int i; char *p, **args = act->args; int dig = 0; p = *args; if (p == NULL || *p == 0 || args[1]) { Msg(0, "%s: %s: invalid argument. Give one argument.", rc_name, comms[act->nr].name); return -1; } i = 0; while (*p) { if (*p >= '0' && *p <= '9') { if (dig < 4) i = 10 * i + (*p - '0'); else if (dig == 4 && *p >= '5') i++; if (dig) dig++; } else if (*p == '.' && !dig) dig++; else { Msg(0, "%s: %s: invalid argument. Give floating point argument.", rc_name, comms[act->nr].name); return -1; } p++; } if (dig == 0) i *= 1000; else while (dig++ < 4) i *= 10; if (i < 0) i = (int)((unsigned int)~0 >> 1); *var = i; return 0; } static Window *WindowByName(char *s) { Window *window; for (window = mru_window; window; window = window->w_prev_mru) if (!strcmp(window->w_title, s)) return window; for (window = mru_window; window; window = window->w_prev_mru) if (!strncmp(window->w_title, s, strlen(s))) return window; return NULL; } static int WindowByNumber(char *string) { int i; char *s; for (i = 0, s = string; *s; s++) { if (*s < '0' || *s > '9') break; i = i * 10 + (*s - '0'); } return *s ? -1 : i; } /* * Get window number from Name or Number string. * Numbers are tried first, then names, a prefix match suffices. * Be careful when assigning numeric strings as WindowTitles. */ int WindowByNoN(char *string) { int i; Window *window; if ((i = WindowByNumber(string)) < 0 || i > last_window->w_number) { if ((window = WindowByName(string))) return window->w_number; return -1; } return i; } static int ParseWinNum(struct action *act, int *var) { char **args = act->args; int i = 0; if (*args == NULL || args[1]) { Msg(0, "%s: %s: one argument required.", rc_name, comms[act->nr].name); return -1; } i = WindowByNoN(*args); if (i < 0) { Msg(0, "%s: %s: invalid argument. Give window number or name.", rc_name, comms[act->nr].name); return -1; } *var = i; return 0; } static int ParseBase(struct action *act, char *p, int *var, int base, char *bname) { int i = 0; int c; if (!p || *p == 0) { Msg(0, "%s: %s: empty argument.", rc_name, comms[act->nr].name); return -1; } while ((c = *p++)) { if (c >= 'a' && c <= 'z') c -= 'a' - 'A'; if (c >= 'A' && c <= 'Z') c -= 'A' - ('0' + 10); c -= '0'; if (c < 0 || c >= base) { Msg(0, "%s: %s: argument is not %s.", rc_name, comms[act->nr].name, bname); return -1; } i = base * i + c; } *var = i; return 0; } static bool IsNum(char *s) { for (; *s; ++s) if (*s < '0' || *s > '9') return false; return true; } int IsNumColon(char *s, char *p, int psize) { char *q; if ((q = strrchr(s, ':')) != NULL) { strncpy(p, q + 1, psize - 1); p[psize - 1] = '\0'; *q = '\0'; } else *p = '\0'; return IsNum(s); } void SwitchWindow(Window *window) { if (window == NULL) { ShowWindows(NULL, -1); return; } if (display == NULL) { fore = window; return; } if (window == D_fore) { Msg(0, "This IS window %d (%s).", window->w_number, window->w_title); return; } if (AclCheckPermWin(D_user, ACL_READ, window)) { Msg(0, "Access to window %d denied.", window->w_number); return; } SetForeWindow(window); Activate(fore->w_norefresh); } /* * SetForeWindow changes the window in the input focus of the display. * Puts window wi in canvas display->d_forecv. */ void SetForeWindow(Window *window) { Window *oldfore; if (display == NULL) { fore = window; return; } oldfore = Layer2Window(D_forecv->c_layer); SetCanvasWindow(D_forecv, window); if (oldfore) WindowChanged(oldfore, 'u'); if (window) WindowChanged(window, 'u'); flayer = D_forecv->c_layer; /* Activate called afterwards, so no RefreshHStatus needed */ } /*****************************************************************/ /* * Activate - make fore window active * norefresh = -1 forces a refresh, disregard all_norefresh then. */ void Activate(int norefresh) { if (display == NULL) return; if (D_status) { Msg(0, "%s", ""); /* wait till mintime (keep gcc quiet) */ RemoveStatus(); } if (MayResizeLayer(D_forecv->c_layer)) ResizeLayer(D_forecv->c_layer, D_forecv->c_xe - D_forecv->c_xs + 1, D_forecv->c_ye - D_forecv->c_ys + 1, display); fore = D_fore; if (fore) { /* XXX ? */ if (fore->w_monitor != MON_OFF) fore->w_monitor = MON_ON; fore->w_bell = BELL_ON; WindowChanged(fore, WINESC_WFLAGS); } Redisplay(norefresh + all_norefresh); } static Window *NextWindow(void) { Window *w; Window *group = fore ? fore->w_group : NULL; for (w = fore ? fore->w_next : first_window; w != fore; w = w->w_next) { if (w == NULL) w = first_window; if (!fore || group == w->w_group) break; } return w; } static Window *PreviousWindow(void) { Window *w; Window *group = fore ? fore->w_group : NULL; for (w = fore ? fore->w_prev : last_window; w != fore; w = w->w_prev) { if (w == NULL) w = last_window; if (!fore || group == w->w_group) break; } return w; } static Window *ParentWindow(void) { Window *w = fore ? fore->w_group : NULL; return w; } static int MoreWindows(void) { char *m = "No other window."; if (mru_window && (fore == NULL || mru_window->w_prev_mru)) return 1; if (fore == NULL) { Msg(0, "No window available"); return 0; } Msg(0, m, fore->w_number); return 0; } void KillWindow(Window *window) { Window **pp, *p; Canvas *cv; int gotone; Layout *lay; /* * Remove window from linked list. */ for (pp = &mru_window; (p = *pp); pp = &p->w_prev_mru) if (p == window) break; *pp = p->w_prev_mru; if (first_window == last_window) { /* we remove last element, so we can do nothing here */ } else if (window == first_window) { window->w_next->w_prev = NULL; first_window = window->w_next; } else if (window == last_window) { window->w_prev->w_next = NULL; last_window = window->w_prev; } else { window->w_next->w_prev = window->w_prev; window->w_prev->w_next = window->w_next; } window->w_inlen = 0; if (mru_window == NULL) { FreeWindow(window); Finit(0); } /* * switch to different window on all canvases */ for (display = displays; display; display = display->d_next) { gotone = 0; for (cv = D_cvlist; cv; cv = cv->c_next) { if (Layer2Window(cv->c_layer) != window) continue; /* switch to other window */ SetCanvasWindow(cv, FindNiceWindow(D_other, NULL)); gotone = 1; } if (gotone) { if (window->w_zdisplay == display) { D_blocked = 0; D_readev.condpos = D_readev.condneg = NULL; } Activate(-1); } } /* do the same for the layouts */ for (lay = layouts; lay; lay = lay->lay_next) UpdateLayoutCanvas(&lay->lay_canvas, window); FreeWindow(window); WindowChanged(NULL, WINESC_WIN_NAMES); WindowChanged(NULL, WINESC_WIN_NAMES_NOCUR); WindowChanged(NULL, 0); } static void LogToggle(bool on) { char buf[1024]; if ((fore->w_log != NULL) == on) { if (display && !*rc_name) Msg(0, "You are %s logging.", on ? "already" : "not"); return; } if (fore->w_log != NULL) { Msg(0, "Logfile \"%s\" closed.", fore->w_log->name); logfclose(fore->w_log); fore->w_log = NULL; WindowChanged(fore, WINESC_WFLAGS); return; } if (DoStartLog(fore, buf, ARRAY_SIZE(buf))) { Msg(errno, "Error opening logfile \"%s\"", buf); return; } if (ftell(fore->w_log->fp) == 0) Msg(0, "Creating logfile \"%s\".", fore->w_log->name); else Msg(0, "Appending to logfile \"%s\".", fore->w_log->name); WindowChanged(fore, WINESC_WFLAGS); } /* TODO: wmb encapsulation; flags enum; update all callers */ /* also maybe give window pointer instead of number in 'where'? */ char *AddWindows(WinMsgBufContext *wmbc, int len, int flags, int where) { char *s, *ss; Window *win; char *cmd; char *buf = wmbc->p; int l; Window *cur; s = ss = buf; if (where < 0) { *s = 0; return ss; } cur = GetWindowByNumber(where); for (win = (flags & 4) ? cur->w_next : first_window; win; win = win->w_next) { uint64_t rend = 0; if (win == cur && ss == buf) ss = s; if (win == NULL) continue; if ((flags & 1) && display && win == D_fore) continue; if (display && D_fore && D_fore->w_group != win->w_group) continue; cmd = win->w_title; l = strlen(cmd); if (l > 20) l = 20; if (s - buf + l > len - 24) break; if (s > buf || (flags & 4)) { *s++ = ' '; *s++ = ' '; } if (win == cur) { ss = s; if (flags & 8) break; } if (win->w_monitor == MON_DONE && renditions[REND_MONITOR] != 0) rend = renditions[REND_MONITOR]; else if ((win->w_bell == BELL_DONE || win->w_bell == BELL_FOUND) && renditions[REND_BELL] != 0) rend = renditions[REND_BELL]; else if ((win->w_silence == SILENCE_FOUND || win->w_silence == SILENCE_DONE) && renditions[REND_SILENCE] != 0) rend = renditions[REND_SILENCE]; if (rend != 0) AddWinMsgRend(wmbc->buf, s, rend); sprintf(s, "%d", win->w_number); s += strlen(s); if (!(flags & 2)) { s = AddWindowFlags(s, len, win); } *s++ = ' '; strncpy(s, cmd, l); s += l; if (rend != 0) AddWinMsgRend(wmbc->buf, s, 0); } *s = 0; return ss; } char *AddWindowFlags(char *buf, int len, Window *p) { char *s = buf; if (p == NULL || len < 12) { *s = 0; return s; } if (display && p == D_fore) *s++ = '*'; if (display && p == D_other) *s++ = '-'; if (p->w_layer.l_cvlist && p->w_layer.l_cvlist->c_lnext) *s++ = '&'; if (display && p->w_monitor == MON_DONE && (ACLBYTE(p->w_mon_notify, D_user->u_id) & ACLBIT(D_user->u_id)) ) *s++ = '@'; if (p->w_bell == BELL_DONE) *s++ = '!'; #ifdef ENABLE_UTMP if (p->w_slot != (slot_t) 0 && p->w_slot != (slot_t) - 1) *s++ = '$'; #endif if (p->w_log != NULL) { strcpy(s, "(L)"); s += 3; } if (p->w_ptyfd < 0 && p->w_type != W_TYPE_GROUP) *s++ = 'Z'; if (p->w_miflag) *s++ = '>'; *s = 0; return s; } char *AddOtherUsers(char *buf, int len, Window *p) { Display *d, *olddisplay = display; Canvas *cv; char *s; int l; s = buf; for (display = displays; display; display = display->d_next) { if (olddisplay && D_user == olddisplay->d_user) continue; for (cv = D_cvlist; cv; cv = cv->c_next) if (Layer2Window(cv->c_layer) == p) break; if (!cv) continue; for (d = displays; d && d != display; d = d->d_next) if (D_user == d->d_user) break; if (d && d != display) continue; if (len > 1 && s != buf) { *s++ = ','; len--; } l = strlen(D_user->u_name); if (l + 1 > len) break; strcpy(s, D_user->u_name); s += l; len -= l; } *s = 0; display = olddisplay; return s; } /* Display window list as a message. WHERE denotes the active window * number; if -1, then the active window will be determined using the * current foreground window, if available. */ void ShowWindows(struct action *act, int where) { const char *buf, *s, *ss; WinMsgBuf *wmb = wmb_create(); WinMsgBufContext *wmbc = wmbc_create(wmb); size_t max = wmbc_bytesleft(wmbc); if (display && where == -1 && D_fore) where = D_fore->w_number; /* TODO: this is a confusing mix of old and new; modernize */ ss = AddWindows(wmbc, max, 0, where); wmbc_fastfw0(wmbc); buf = wmbc_finish(wmbc); s = buf + strlen(buf); if (display && ss - buf > D_width / 2) { ss -= D_width / 2; if (s - ss < D_width) { ss = s - D_width; if (ss < buf) ss = buf; } } else ss = buf; if (!act || !act->quiet) Msg(0, "%s", ss); else if (queryflag >= 0) QueryMsg(0, "%s", ss); wmbc_free(wmbc); wmb_free(wmb); } /* * String Escape based windows listing * mls: currently does a Msg() call for each(!) window, dunno why */ static void ShowWindowsX(char *str) { for (Window *w = first_window; w; w = w->w_next) Msg(0, "%s", MakeWinMsg(str, w, '%')); } static void ShowInfo(void) { char buf[512], *p; Window *wp = fore; int i; if (wp == NULL) { Msg(0, "(%d,%d)/(%d,%d) no window", D_x + 1, D_y + 1, D_width, D_height); return; } p = buf; if (buf < (p += GetAnsiStatus(wp, p))) *p++ = ' '; sprintf(p, "(%d,%d)/(%d,%d)", wp->w_x + 1, wp->w_y + 1, wp->w_width, wp->w_height); sprintf(p += strlen(p), "+%d", wp->w_histheight); sprintf(p += strlen(p), " %c%sflow", (wp->w_flow & FLOW_ON) ? '+' : '-', (wp->w_flow & FLOW_AUTOFLAG) ? "" : ((wp->w_flow & FLOW_AUTO) ? "(+)" : "(-)")); if (!wp->w_wrap) sprintf(p += strlen(p), " -wrap"); if (wp->w_insert) sprintf(p += strlen(p), " ins"); if (wp->w_origin) sprintf(p += strlen(p), " org"); if (wp->w_keypad) sprintf(p += strlen(p), " app"); if (wp->w_log) sprintf(p += strlen(p), " log"); if (wp->w_monitor != MON_OFF && (ACLBYTE(wp->w_mon_notify, D_user->u_id) & ACLBIT(D_user->u_id)) ) sprintf(p += strlen(p), " mon"); if (wp->w_mouse) sprintf(p += strlen(p), " mouse"); if (!wp->w_c1) sprintf(p += strlen(p), " -c1"); if (wp->w_norefresh) sprintf(p += strlen(p), " nored"); p += strlen(p); if (wp->w_encoding && (display == NULL || D_encoding != wp->w_encoding || EncodingDefFont(wp->w_encoding) <= 0)) { *p++ = ' '; strcpy(p, EncodingName(wp->w_encoding)); p += strlen(p); } if (wp->w_encoding != UTF8) if (display && (D_CC0 || (D_CS0 && *D_CS0))) { if (wp->w_gr == 2) { sprintf(p, " G%c", wp->w_Charset + '0'); if (wp->w_FontE >= ' ') p[3] = wp->w_FontE; else { p[3] = '^'; p[4] = wp->w_FontE ^ 0x40; p++; } p[4] = '['; p++; } else if (wp->w_gr) sprintf(p++, " G%c%c[", wp->w_Charset + '0', wp->w_CharsetR + '0'); else sprintf(p, " G%c[", wp->w_Charset + '0'); p += 4; for (i = 0; i < 4; i++) { if (wp->w_charsets[i] == ASCII) *p++ = 'B'; else if (wp->w_charsets[i] >= ' ') *p++ = wp->w_charsets[i]; else { *p++ = '^'; *p++ = wp->w_charsets[i] ^ 0x40; } } *p++ = ']'; *p = 0; } if (wp->w_type == W_TYPE_PLAIN) { /* add info about modem control lines */ *p++ = ' '; TtyGetModemStatus(wp->w_ptyfd, p); } #ifdef ENABLE_TELNET else if (wp->w_type == W_TYPE_TELNET) { *p++ = ' '; TelStatus(wp, p, ARRAY_SIZE(buf) - 1 - (p - buf)); } #endif Msg(0, "%s %d(%s)", buf, wp->w_number, wp->w_title); } static void ShowDInfo(void) { char buf[512], *p; int l, w; if (display == NULL) return; p = buf; l = 512; sprintf(p, "(%d,%d)", D_width, D_height); w = strlen(p); l -= w; p += w; if (D_encoding) { *p++ = ' '; strncpy(p, EncodingName(D_encoding), l); w = strlen(p); l -= w; p += w; } if (D_CXT) { strncpy(p, " xterm", l); w = strlen(p); l -= w; p += w; } if (D_hascolor) { strncpy(p, " color", l); w = strlen(p); l -= w; p += w; } if (D_CG0) strncpy(p, " iso2022", l); else if (D_CS0 && *D_CS0) strncpy(p, " altchar", l); Msg(0, "%s", buf); } static void AKAFin(char *buf, size_t len, void *data) { (void)data; /* unused */ if (len && fore) ChangeAKA(fore, buf, strlen(buf)); enter_window_name_mode = 0; } static void InputAKA(void) { char *s, *ss; size_t len; if (enter_window_name_mode == 1) return; enter_window_name_mode = 1; Input("Set window's title to: ", ARRAY_SIZE(fore->w_akabuf) - 1, INP_COOKED, AKAFin, NULL, 0); s = fore->w_title; if (!s) return; for (; *s; s++) { if ((*(unsigned char *)s & 0x7f) < 0x20 || *s == 0x7f) continue; ss = s; len = 1; LayProcess(&ss, &len); } } static void ColonFin(char *buf, size_t len, void *data) { char mbuf[256]; (void)data; /* unused */ RemoveStatus(); if (buf[len] == '\t') { int m, x; int l = 0, r = RC_LAST; int showmessage = 0; char *s = buf; while (*s && (uintptr_t)(s - buf) < len) if (*s++ == ' ') return; /* Showing a message when there's no hardstatus or caption cancels the input */ if (display && (captionalways || D_has_hstatus == HSTATUS_LASTLINE || (D_canvas.c_slperp && D_canvas.c_slperp->c_slnext))) showmessage = 1; while (l <= r) { m = (l + r) / 2; x = strncmp(buf, comms[m].name, len); if (x > 0) l = m + 1; else if (x < 0) r = m - 1; else { s = mbuf; for (l = m - 1; l >= 0 && strncmp(buf, comms[l].name, len) == 0; l--) ; for (m = ++l; m <= r && strncmp(buf, comms[m].name, len) == 0 && (uintptr_t)(s - mbuf) < ARRAY_SIZE(mbuf); m++) s += snprintf(s, ARRAY_SIZE(mbuf) - (s - mbuf), " %s", comms[m].name); if (l < m - 1) { if (showmessage) Msg(0, "Possible commands:%s", mbuf); } else { s = mbuf; len = snprintf(mbuf, ARRAY_SIZE(mbuf), "%s \t", comms[l].name + len); if (len > 0 && len < ARRAY_SIZE(mbuf)) LayProcess(&s, &len); } break; } } if (l > r && showmessage) Msg(0, "No commands matching '%*s'", (int)len, buf); return; } if (!len || buf[len]) return; len = strlen(buf) + 1; if (len > (int)ARRAY_SIZE(mbuf)) RcLine(buf, len); else { memmove(mbuf, buf, len); RcLine(mbuf, ARRAY_SIZE(mbuf)); } } static void SelectFin(char *buf, size_t len, void *data) { int n; (void)data; /* unused */ if (!len || !display) return; if (len == 1 && *buf == '-') { SetForeWindow(NULL); Activate(0); return; } if ((n = WindowByNoN(buf)) < 0) return; SwitchWindow(GetWindowByNumber(n)); } static void SelectLayoutFin(char *buf, size_t len, void *data) { Layout *lay; (void)data; /* unused */ if (!len || !display) return; if (len == 1 && *buf == '-') { LoadLayout(NULL); Activate(0); return; } lay = FindLayout(buf); if (!lay) Msg(0, "No such layout\n"); else if (lay == D_layout) Msg(0, "This IS layout %d (%s).\n", lay->lay_number, lay->lay_title); else { LoadLayout(lay); Activate(0); } } static void InputSelect(void) { Input("Switch to window: ", 20, INP_COOKED, SelectFin, NULL, 0); } static char setenv_var[31]; static void SetenvFin1(char *buf, size_t len, void *data) { (void)data; /* unused */ if (!len || !display) return; InputSetenv(buf); } static void SetenvFin2(char *buf, size_t len, void *data) { (void)data; /* unused */ if (!len || !display) return; setenv(setenv_var, buf, 1); MakeNewEnv(); } static void InputSetenv(char *arg) { static char setenv_buf[50 + ARRAY_SIZE(setenv_var)]; /* need to be static here, cannot be freed */ if (arg) { strncpy(setenv_var, arg, ARRAY_SIZE(setenv_var) - 1); sprintf(setenv_buf, "Enter value for %s: ", setenv_var); Input(setenv_buf, 30, INP_COOKED, SetenvFin2, NULL, 0); } else Input("Setenv: Enter variable name: ", 30, INP_COOKED, SetenvFin1, NULL, 0); } /* * the following options are understood by this parser: * -f, -f0, -f1, -fy, -fa * -t title, -T terminal-type, -h height-of-scrollback, * -ln, -l0, -ly, -l1, -l * -a, -M, -L */ void DoScreen(char *fn, char **av) { struct NewWindow nwin; int num; char buf[20]; nwin = nwin_undef; while (av && *av && av[0][0] == '-') { if (av[0][1] == '-') { av++; break; } switch (av[0][1]) { case 'f': switch (av[0][2]) { case 'n': case '0': nwin.flowflag = FLOW_OFF; break; case 'y': case '1': case '\0': nwin.flowflag = FLOW_ON; break; case 'a': nwin.flowflag = FLOW_AUTOFLAG; break; default: break; } break; case 't': /* no more -k */ if (av[0][2]) nwin.aka = &av[0][2]; else if (*++av) nwin.aka = *av; else --av; break; case 'T': if (av[0][2]) nwin.term = &av[0][2]; else if (*++av) nwin.term = *av; else --av; break; case 'h': if (av[0][2]) nwin.histheight = atoi(av[0] + 2); else if (*++av) nwin.histheight = atoi(*av); else --av; break; #if defined(ENABLE_UTMP) case 'l': switch (av[0][2]) { case 'n': case '0': nwin.lflag = 0; break; case 'y': case '1': case '\0': nwin.lflag = 1; break; case 'a': nwin.lflag = 3; break; default: break; } break; #endif case 'a': nwin.aflag = true; break; case 'M': nwin.monitor = MON_ON; break; case 'L': nwin.Lflag = true; break; default: Msg(0, "%s: screen: invalid option -%c.", fn, av[0][1]); break; } ++av; } if (av && *av && IsNumColon(*av, buf, ARRAY_SIZE(buf))) { if (*buf != '\0') nwin.aka = buf; num = atoi(*av); if (num < 0) { Msg(0, "%s: illegal screen number %d.", fn, num); num = 0; } nwin.StartAt = num; ++av; } if (av && *av) { nwin.args = av; if (!nwin.aka) nwin.aka = Filename(*av); } MakeWindow(&nwin); } /* * CompileKeys must be called before Markroutine is first used. * to initialise the keys with defaults, call CompileKeys(NULL, mark_key_tab); * * s is an ascii string in a termcap-like syntax. It looks like * "j=u:k=d:l=r:h=l: =.:" and so on... * this example rebinds the cursormovement to the keys u (up), d (down), * l (left), r (right). placing a mark will now be done with ".". */ int CompileKeys(char *s, int sl, unsigned char *array) { int i; unsigned char key, value; if (sl == 0) { for (i = 0; i < 256; i++) array[i] = i; return 0; } while (sl) { key = *(unsigned char *)s++; if (*s != '=' || sl < 3) return -1; sl--; do { s++; sl -= 2; value = *(unsigned char *)s++; array[value] = key; } while (*s == '=' && sl >= 2); if (sl == 0) break; if (*s++ != ':') return -1; sl--; } return 0; } /* * Asynchronous input functions */ static void copy_reg_fn(char *buf, size_t len, void *data) { (void)data; /* unused */ struct plop *pp = plop_tab + (int)(unsigned char)*buf; if (len) { memset(buf, 0, len); return; } if (pp->buf) free(pp->buf); pp->buf = NULL; pp->len = 0; if (D_user->u_plop.len) { if ((pp->buf = malloc(D_user->u_plop.len)) == NULL) { Msg(0, "%s", strnomem); return; } memmove(pp->buf, D_user->u_plop.buf, D_user->u_plop.len); } pp->len = D_user->u_plop.len; pp->enc = D_user->u_plop.enc; Msg(0, "Copied %zu characters into register %c", D_user->u_plop.len, *buf); } static void ins_reg_fn(char *buf, size_t len, void *data) { (void)data; /* unused */ struct plop *pp = plop_tab + (int)(unsigned char)*buf; if (len) { memset(buf, 0, len); return; } if (!fore) return; /* Input() should not call us w/o fore, but you never know... */ if (*buf == '.') Msg(0, "ins_reg_fn: Warning: pasting real register '.'!"); if (pp->buf) { MakePaster(&fore->w_paster, pp->buf, pp->len, 0); return; } Msg(0, "Empty register."); } static void process_fn(char *buf, size_t len, void *data) { struct plop *pp = plop_tab + (int)(unsigned char)*buf; (void)data; /* unused */ if (len) { memset(buf, 0, len); return; } if (pp->buf) { ProcessInput(pp->buf, pp->len); return; } Msg(0, "Empty register."); } static void confirm_fn(char *buf, size_t len, void *data) { struct action act; if (len || (*buf != 'y' && *buf != 'Y')) { memset(buf, 0, len); return; } act.nr = *(int *)data; act.args = noargs; act.argl = NULL; act.quiet = 0; DoAction(&act); } struct inputsu { struct acluser **up; char name[24]; char pw1[130]; /* FreeBSD crypts to 128 bytes */ char pw2[130]; }; static void suFin(char *buf, size_t len, void *data) { struct inputsu *i = (struct inputsu *)data; char *p; size_t l; if (!*i->name) { p = i->name; l = ARRAY_SIZE(i->name) - 1; } else if (!*i->pw1) { strcpy(p = i->pw1, "\377"); l = ARRAY_SIZE(i->pw1) - 1; } else { strcpy(p = i->pw2, "\377"); l = ARRAY_SIZE(i->pw2) - 1; } if (buf && len) strncpy(p, buf, 1 + ((l < len) ? l : len)); if (!*i->name) Input("Screen User: ", ARRAY_SIZE(i->name) - 1, INP_COOKED, suFin, (char *)i, 0); else if (!*i->pw1) Input("User's UNIX Password: ", ARRAY_SIZE(i->pw1) - 1, INP_COOKED | INP_NOECHO, suFin, (char *)i, 0); else if (!*i->pw2) Input("User's Screen Password: ", ARRAY_SIZE(i->pw2) - 1, INP_COOKED | INP_NOECHO, suFin, (char *)i, 0); else { if ((p = DoSu(i->up, i->name, i->pw2, i->pw1))) Msg(0, "%s", p); free((char *)i); } } static int InputSu(struct acluser **up, char *name) { struct inputsu *i; if (!(i = (struct inputsu *)calloc(1, sizeof(struct inputsu)))) return -1; i->up = up; if (name && *name) suFin(name, (int)strlen(name), (char *)i); /* can also initialise stuff */ else suFin(NULL, 0, (char *)i); return 0; } static int digraph_find(const char *buf) { uint32_t i; for (i = 0; i < ARRAY_SIZE(digraphs) && digraphs[i].d[0]; i++) if ((digraphs[i].d[0] == (unsigned char)buf[0] && digraphs[i].d[1] == (unsigned char)buf[1])) break; return i; } static void digraph_fn(char *buf, size_t len, void *data) { int ch, i, x; size_t l; (void)data; /* unused */ ch = buf[len]; if (ch) { buf[len + 1] = ch; /* so we can restore it later */ if (ch < ' ' || ch == '\177') return; if (len >= 1 && ((*buf == 'U' && buf[1] == '+') || (*buf == '0' && (buf[1] == 'x' || buf[1] == 'X')))) { if (len == 1) return; if ((ch < '0' || ch > '9') && (ch < 'a' || ch > 'f') && (ch < 'A' || ch > 'F')) { buf[len] = '\034'; /* ^] is ignored by Input() */ return; } if (len == (*buf == 'U' ? 5 : 3)) buf[len] = '\n'; return; } if (len && *buf == '0') { if (ch < '0' || ch > '7') { buf[len] = '\034'; /* ^] is ignored by Input() */ return; } if (len == 3) buf[len] = '\n'; return; } if (len == 1) buf[len] = '\n'; return; } if (len < 1) return; if (buf[len + 1]) { buf[len] = buf[len + 1]; /* stored above */ len++; } if (len < 2) return; if (!parse_input_int(buf, len, &x)) { i = digraph_find(buf); if ((x = digraphs[i].value) <= 0) { Msg(0, "Unknown digraph"); return; } } l = 1; *buf = x; if (flayer->l_encoding == UTF8) l = ToUtf8(buf, x); /* buf is big enough for all UTF-8 codes */ while (l) LayProcess(&buf, &l); } int StuffKey(int i) { struct action *act; int discard = 0; int keyno = i; if (i < KMAP_KEYS && D_ESCseen) { struct action *act = &D_ESCseen[i + 256]; if (act->nr != RC_ILLEGAL) { D_ESCseen = NULL; WindowChanged(fore, WINESC_ESC_SEEN); DoAction(act); return 0; } discard = 1; } if (i >= T_CURSOR - T_CAPS && i < T_KEYPAD - T_CAPS && D_cursorkeys) i += T_OCAPS - T_CURSOR; else if (i >= T_KEYPAD - T_CAPS && i < T_OCAPS - T_CAPS && D_keypad) i += T_OCAPS - T_CURSOR; flayer = D_forecv->c_layer; fore = D_fore; act = NULL; if (flayer && flayer->l_mode == 1) act = i < KMAP_KEYS + KMAP_AKEYS ? &mmtab[i] : &kmap_exts[i - (KMAP_KEYS + KMAP_AKEYS)].mm; if ((!act || act->nr == RC_ILLEGAL) && !D_mapdefault) act = i < KMAP_KEYS + KMAP_AKEYS ? &umtab[i] : &kmap_exts[i - (KMAP_KEYS + KMAP_AKEYS)].um; if (!act || act->nr == RC_ILLEGAL) act = i < KMAP_KEYS + KMAP_AKEYS ? &dmtab[i] : &kmap_exts[i - (KMAP_KEYS + KMAP_AKEYS)].dm; if (discard && (!act || act->nr != RC_COMMAND)) { /* if the input was just a single byte we let it through */ if (D_tcs[keyno + T_CAPS].str && strlen(D_tcs[keyno + T_CAPS].str) == 1) return -1; if (D_ESCseen) { D_ESCseen = NULL; WindowChanged(fore, WINESC_ESC_SEEN); } return 0; } D_mapdefault = 0; if (act == NULL || act->nr == RC_ILLEGAL) return -1; DoAction(act); return 0; } static int IsOnDisplay(Window *win) { Canvas *cv; for (cv = D_cvlist; cv; cv = cv->c_next) if (Layer2Window(cv->c_layer) == win) return 1; return 0; } Window *FindNiceWindow(Window *win, char *presel) { int i; if (presel) { i = WindowByNoN(presel); if (i >= 0) win = GetWindowByNumber(i); } if (!display) return win; if (win && AclCheckPermWin(D_user, ACL_READ, win)) win = NULL; if (!win || (IsOnDisplay(win) && !presel)) { /* try to get another window */ win = NULL; for (win = mru_window; win; win = win->w_prev_mru) if (!win->w_layer.l_cvlist && !AclCheckPermWin(D_user, ACL_WRITE, win)) break; if (!win) for (win = mru_window; win; win = win->w_prev_mru) if (win->w_layer.l_cvlist && !IsOnDisplay(win) && !AclCheckPermWin(D_user, ACL_WRITE, win)) break; if (!win) for (win = mru_window; win; win = win->w_prev_mru) if (!win->w_layer.l_cvlist && !AclCheckPermWin(D_user, ACL_READ, win)) break; if (!win) for (win = mru_window; win; win = win->w_prev_mru) if (win->w_layer.l_cvlist && !IsOnDisplay(win) && !AclCheckPermWin(D_user, ACL_READ, win)) break; if (!win) for (win = mru_window; win; win = win->w_prev_mru) if (!win->w_layer.l_cvlist) break; if (!win) for (win = mru_window; win; win = win->w_prev_mru) if (win->w_layer.l_cvlist && !IsOnDisplay(win)) break; } if (win && AclCheckPermWin(D_user, ACL_READ, win)) win = NULL; return win; } static int CalcSlicePercent(Canvas *cv, int percent) { int w, wsum, up; if (!cv || !cv->c_slback) return percent; up = CalcSlicePercent(cv->c_slback->c_slback, percent); w = cv->c_slweight; for (cv = cv->c_slback->c_slperp, wsum = 0; cv; cv = cv->c_slnext) wsum += cv->c_slweight; if (wsum == 0) return 0; return (up * w) / wsum; } static int ChangeCanvasSize(Canvas *fcv, int abs, int diff, bool gflag, int percent) /* Canvas *fcv; make this canvas bigger int abs; mode: 0:rel 1:abs 2:max int diff; change this much bool gflag; go up if neccessary int percent; */ { Canvas *cv; int done, have, m, dir; if (abs == 0 && diff == 0) return 0; if (abs == 2) { if (diff == 0) fcv->c_slweight = 0; else { for (cv = fcv->c_slback->c_slperp; cv; cv = cv->c_slnext) cv->c_slweight = 0; fcv->c_slweight = 1; cv = fcv->c_slback->c_slback; if (gflag && cv && cv->c_slback) ChangeCanvasSize(cv, abs, diff, gflag, percent); } return diff; } if (abs) { if (diff < 0) diff = 0; if (percent && diff > percent) diff = percent; } if (percent) { int wsum, up; for (cv = fcv->c_slback->c_slperp, wsum = 0; cv; cv = cv->c_slnext) wsum += cv->c_slweight; if (wsum) { up = gflag ? CalcSlicePercent(fcv->c_slback->c_slback, percent) : percent; if (wsum < 1000) { int scale = wsum < 10 ? 1000 : 100; for (cv = fcv->c_slback->c_slperp; cv; cv = cv->c_slnext) cv->c_slweight *= scale; wsum *= scale; } for (cv = fcv->c_slback->c_slperp; cv; cv = cv->c_slnext) { if (cv->c_slweight) { cv->c_slweight = (cv->c_slweight * up) / percent; if (cv->c_slweight == 0) cv->c_slweight = 1; } } diff = (diff * wsum) / percent; percent = wsum; } } else { if (abs && diff == (fcv->c_slorient == SLICE_VERT ? fcv->c_ye - fcv->c_ys + 2 : fcv->c_xe - fcv->c_xs + 2)) return 0; /* fix weights to real size (can't be helped, sorry) */ for (cv = fcv->c_slback->c_slperp; cv; cv = cv->c_slnext) { cv->c_slweight = cv->c_slorient == SLICE_VERT ? cv->c_ye - cv->c_ys + 2 : cv->c_xe - cv->c_xs + 2; } } if (abs) diff = diff - fcv->c_slweight; if (diff == 0) return 0; if (diff < 0) { cv = fcv->c_slnext ? fcv->c_slnext : fcv->c_slprev; fcv->c_slweight += diff; cv->c_slweight -= diff; return diff; } done = 0; dir = 1; for (cv = fcv->c_slnext; diff > 0; cv = dir > 0 ? cv->c_slnext : cv->c_slprev) { if (!cv) { if (dir == -1) break; dir = -1; cv = fcv; continue; } if (percent) m = 1; else m = cv->c_slperp ? CountCanvasPerp(cv) * 2 : 2; if (cv->c_slweight > m) { have = cv->c_slweight - m; if (have > diff) have = diff; cv->c_slweight -= have; done += have; diff -= have; } } if (diff && gflag) { /* need more room! */ cv = fcv->c_slback->c_slback; if (cv && cv->c_slback) done += ChangeCanvasSize(fcv->c_slback->c_slback, 0, diff, gflag, percent); } fcv->c_slweight += done; return done; } static void ResizeRegions(char *arg, int flags) { Canvas *cv; int diff, l; bool gflag = 0; int abs = 0, percent = 0; int orient = 0; if (!*arg) return; if (D_forecv->c_slorient == SLICE_UNKN) { Msg(0, "resize: need more than one region"); return; } gflag = flags & RESIZE_FLAG_L ? 0 : 1; orient |= flags & RESIZE_FLAG_H ? SLICE_HORI : 0; orient |= flags & RESIZE_FLAG_V ? SLICE_VERT : 0; if (orient == 0) orient = D_forecv->c_slorient; l = strlen(arg); if (*arg == '=') { /* make all regions the same height */ Canvas *cv = gflag ? &D_canvas : D_forecv->c_slback; if (cv->c_slperp->c_slorient & orient) EqualizeCanvas(cv->c_slperp, gflag); /* can't use cv->c_slorient directly as it can be D_canvas */ if ((cv->c_slperp->c_slorient ^ (SLICE_HORI ^ SLICE_VERT)) & orient) { if (cv->c_slback) { cv = cv->c_slback; EqualizeCanvas(cv->c_slperp, gflag); } else EqualizeCanvas(cv, gflag); } ResizeCanvas(cv); RecreateCanvasChain(); RethinkDisplayViewports(); ResizeLayersToCanvases(); return; } if (!strcmp(arg, "min") || !strcmp(arg, "0")) { abs = 2; diff = 0; } else if (!strcmp(arg, "max") || !strcmp(arg, "_")) { abs = 2; diff = 1; } else { if (l > 0 && arg[l - 1] == '%') percent = 1000; if (*arg == '+') diff = atoi(arg + 1); else if (*arg == '-') diff = -atoi(arg + 1); else { diff = atoi(arg); /* +1 because of caption line */ if (diff < 0) diff = 0; abs = diff == 0 ? 2 : 1; } } if (!abs && !diff) return; if (percent) diff = diff * percent / 100; cv = D_forecv; if (cv->c_slorient & orient) ChangeCanvasSize(cv, abs, diff, gflag, percent); if (cv->c_slback->c_slorient & orient) ChangeCanvasSize(cv->c_slback, abs, diff, gflag, percent); ResizeCanvas(&D_canvas); RecreateCanvasChain(); RethinkDisplayViewports(); ResizeLayersToCanvases(); return; } static void ResizeFin(char *buf, size_t len, void *data) { int ch; int flags = *(int *)data; ch = ((unsigned char *)buf)[len]; if (ch == 0) { ResizeRegions(buf, flags); return; } if (ch == 'h') flags ^= RESIZE_FLAG_H; else if (ch == 'v') flags ^= RESIZE_FLAG_V; else if (ch == 'b') flags |= RESIZE_FLAG_H | RESIZE_FLAG_V; else if (ch == 'p') flags ^= D_forecv->c_slorient == SLICE_VERT ? RESIZE_FLAG_H : RESIZE_FLAG_V; else if (ch == 'l') flags ^= RESIZE_FLAG_L; else return; inp_setprompt(resizeprompts[flags], NULL); *(int *)data = flags; buf[len] = '\034'; } void SetForeCanvas(Display *d, Canvas *cv) { Display *odisplay = display; if (d->d_forecv == cv) return; display = d; D_forecv = cv; if ((focusminwidth && (focusminwidth < 0 || D_forecv->c_xe - D_forecv->c_xs + 1 < focusminwidth)) || (focusminheight && (focusminheight < 0 || D_forecv->c_ye - D_forecv->c_ys + 1 < focusminheight))) { ResizeCanvas(&D_canvas); RecreateCanvasChain(); RethinkDisplayViewports(); ResizeLayersToCanvases(); /* redisplays */ } fore = D_fore = Layer2Window(D_forecv->c_layer); if (D_other == fore) D_other = NULL; flayer = D_forecv->c_layer; if (D_xtermosc[2] || D_xtermosc[3]) { Activate(-1); } else { RefreshHStatus(); RefreshXtermOSC(); flayer = D_forecv->c_layer; CV_CALL(D_forecv, LayRestore(); LaySetCursor()); WindowChanged(NULL, WINESC_FOCUS); } display = odisplay; } void RefreshXtermOSC(void) { Window *p = Layer2Window(D_forecv->c_layer); for (int i = 4; i >= 0; i--) SetXtermOSC(i, p ? p->w_xtermosc[i] : NULL, "\a"); } /* * ParseAttrColor - parses attributes and color * str - string containing attributes and/or colors * d - dim * u - underscore * b - bold * r - reverse * s - standout * l - blinking * 0-255;0-255 - foreground;background * xABCDEF;xABCDEF - truecolor foreground;background * #ABCDEF;#ABCDEF - truecolor foreground;background * xABC;xABC - truecolor foreground;background * #ABC;#ABC - truecolor foreground;background * msgok - can we be verbose if something is wrong * * returns value representing encoded value */ uint64_t ParseAttrColor(char *str, int msgok) { uint64_t r; uint32_t attr = 0; uint32_t bg = 0, fg = 0; uint8_t bm = 0, fm = 0; uint32_t *cl; uint8_t *cm; cl = &fg; cm = &fm; while (*str) { if (*cm < 4) { switch (*str) { case 'd': attr |= A_DI; break; case 'u': attr |= A_US; break; case 'b': attr |= A_BD; break; case 'r': attr |= A_RV; break; case 'i': attr |= A_IT; break; case 'l': attr |= A_BL; break; case '-': *cm = 0; break; case 'x': case '#': *cm = 4; str++; continue; case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': if (!*cm) *cm = 1; *cl = *cl * 10 + (*str - '0'); break; case ';': cl = &bg; cm = &bm; break; case ' ': break; default: if (msgok) Msg(0, "junk after description: '%c'\n", *str); break; } } if (*cm == 4) { switch (*str) { case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': *cl = ((*cl & 0x0F000000)+0x01000000) + ((*cl << 4) | (*str - '0')); break; case 'a': case 'b': case 'c': case 'd': case 'e': case 'f': *cl = ((*cl & 0x0F000000)+0x01000000) + ((*cl << 4) | (*str - ('a' - 10))); break; case 'A': case 'B': case 'C': case 'D': case 'E': case 'F': *cl = ((*cl & 0x0F000000)+0x01000000) + ((*cl << 4) | (*str - ('A' - 10))); break; case ';': cl = &bg; cm = &bm; break; default: if (msgok) Msg(0, "junk after description: '%c'\n", *str); break; } } str++; } /* fm/bm auto switches from 1 to 2 when color >= 16 * fm/bm mode 4 uses 4th byte as a digit counter. If it's 3 * digits, translate 0x00000ABC to 0x00AABBCC * fm/bm mode 4 gets & 0x0FFFFFF at the end, so we don't care * about upper boundaries. */ if (fm == 4) { if (fg <= 0x03000000) { fg &= 0x0FFF; fg = ((fg & 0x0F00) << 8) | ((fg & 0x0F0) << 4) | (fg & 0x0F); fg = fg | (fg << 4); } } else { if (fg > 7) { fm = 2; } if (fg > 255) { fg = fm = 0; } } if (bm == 4) { if (bg <= 0x03000000) { bg &= 0x0FFF; bg = ((bg & 0x0F00) << 8) | ((bg & 0x0F0) << 4) | (bg & 0x0F); bg = bg | (bg << 4); } } else { if (bg > 7) { bm = 2; } if (bg > 255) { bg = bm = 0; } } r = (((uint64_t)attr & 0x0FF) << 56); r |= (((uint64_t)bg & 0x0FFFFFF) << 24); r |= ((uint64_t)fg & 0x0FFFFFF); r |= ((uint64_t)fm << 48); r |= ((uint64_t)bm << 52); return r; } /* * ApplyAttrColor - decodes color attributes and sets them in structure * i - encoded attributes and color * 00 00 00 00 00 00 00 00 * xx 00 00 00 00 00 00 00 - attr * 00 x0 00 00 00 00 00 00 - what kind of background * 00 0x 00 00 00 00 00 00 - what kind of foreground * 0 - default, 1 - base 16; 2 - 256, 4 - truecolor * 00 00 xx xx xx 00 00 00 - background * 00 00 00 00 00 xx xx xx - foreground * mc -structure to modify */ void ApplyAttrColor(uint64_t i, struct mchar *mc) { uint32_t a, b, f; unsigned char h; a = (0xFF00000000000000 & i) >> 56; b = (0x0000FFFFFF000000 & i) >> 24; f = (0x0000000000FFFFFF & i); h = (0x00FF000000000000 & i) >> 48; if (h & 0x40) b |= 0x04000000; if (h & 0x20) b |= 0x02000000; if (h & 0x10) b |= 0x01000000; if (h & 0x04) f |= 0x04000000; if (h & 0x02) f |= 0x02000000; if (h & 0x01) f |= 0x01000000; mc->attr = a; mc->colorbg = b; mc->colorfg = f; } screen-5.0.2/os.h0000664000175000017500000001044515224432722012244 0ustar alexalex/* Copyright (c) 2008, 2009 * Juergen Weigert (jnweiger@immd4.informatik.uni-erlangen.de) * Michael Schroeder (mlschroe@immd4.informatik.uni-erlangen.de) * Micah Cowan (micah@cowan.name) * Sadrul Habib Chowdhury (sadrul@users.sourceforge.net) * Copyright (c) 1993-2002, 2003, 2005, 2006, 2007 * Juergen Weigert (jnweiger@immd4.informatik.uni-erlangen.de) * Michael Schroeder (mlschroe@immd4.informatik.uni-erlangen.de) * Copyright (c) 1987 Oliver Laumann * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3, or (at your option) * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program (see the file COPYING); if not, see * https://www.gnu.org/licenses/, or contact Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02111-1301 USA * **************************************************************** * $Id$ GNU */ #include "config.h" #include #include #include #include #include #include #include #include #include #include #include #if defined(HAVE_SETRESUID) && !defined(HAVE_SETREUID) # define setreuid(ruid, euid) setresuid(ruid, euid, -1) # define setregid(rgid, egid) setresgid(rgid, egid, -1) #endif #ifndef HAVE_UTIMES # define utimes utime #endif #ifdef ENABLE_TELNET # include # include #endif /***************************************************************** * terminal handling */ #include #ifdef NCCS # define MAXCC NCCS #else # define MAXCC 256 #endif #ifndef VDISABLE # ifdef _POSIX_VDISABLE # define VDISABLE _POSIX_VDISABLE # else # define VDISABLE 0377 # endif /* _POSIX_VDISABLE */ #endif /* !VDISABLE */ /***************************************************************** * utmp handling */ #if defined(ENABLE_UTMP) # include typedef char* slot_t; /* used internally in utmp.c */ # ifndef UTMPFILE # ifdef UTMPX_FILE # define UTMPXFILE UTMPX_FILE # else # ifdef _PATH_UTMPX # define UTMPXFILE _PATH_UTMPX # else # define UTMPXFILE "/etc/utmpx" # endif /* _PATH_UTMPX */ # endif # endif #endif /* ENABLE_UTMP */ /***************************************************************** * signal stuff */ /* apparently NSIG is not part of standard, but it's present some form in most * libc headers, if not define sane default */ #if !defined(NSIG) # if defined(_NSIG) # define NSIG _NSIG # else # define NSIG 32 # endif #endif /***************************************************************** * file stuff */ /* * SunOS 4.1.3: `man 2V open' has only one line that mentions O_NOBLOCK: * * O_NONBLOCK Same as O_NDELAY above. * * on the very same SunOS 4.1.3, I traced the open system call and found * that an open("/dev/ttyy08", O_RDWR|O_NONBLOCK|O_NOCTTY) was blocked, * whereas open("/dev/ttyy08", O_RDWR|O_NDELAY |O_NOCTTY) went through. * * For this simple reason I now favour O_NDELAY. jw. 4.5.95 */ #if !defined(O_NONBLOCK) && defined(O_NDELAY) # define O_NONBLOCK O_NDELAY #endif #if !defined(FNBLOCK) && defined(FNONBLOCK) # define FNBLOCK FNONBLOCK #endif #if !defined(FNBLOCK) && defined(FNDELAY) # define FNBLOCK FNDELAY #endif #if !defined(FNBLOCK) && defined(O_NONBLOCK) # define FNBLOCK O_NONBLOCK #endif /***************************************************************** * user defineable stuff */ #ifndef TERMCAP_BUFSIZE # define TERMCAP_BUFSIZE 1023 #endif /* * you may try to vary this value. Use low values if your (VMS) system * tends to choke when pasting. Use high values if you want to test * how many characters your pty's can buffer. */ #define IOSIZE 4096 /* Changing those you won't be able to attach to your old sessions * when changing those values in official tree don't forget to bump * MSG_VERSION */ #define MAXTERMLEN 32 #define MAXLOGINLEN 256 screen-5.0.2/misc.h0000664000175000017500000000136615224432722012560 0ustar alexalex#ifndef SCREEN_MISC_H #define SCREEN_MISC_H #include "config.h" #include #include "image.h" char *SaveStr (const char *); char *SaveStrn (const char *, size_t); #ifndef HAVE_STRERROR char *strerror (int); #endif void centerline (char *, int); void leftline (char *, int, struct mchar *); char *Filename (char *); char *stripdev (char *); void closeallfiles (int); int UserContext (void); void UserReturn (int); int UserStatus (void); void (*xsignal (int, void (*)(int))) (int); #if defined(HAVE_SETEUID) || defined(HAVE_SETREUID) void xseteuid (int); void xsetegid (int); #endif int AddXChar (char *, int); int AddXChars (char *, int, char *); #define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0])) #endif /* SCREEN_MISC_H */ screen-5.0.2/misc.c0000664000175000017500000001106215224432722012545 0ustar alexalex/* Copyright (c) 2008, 2009 * Juergen Weigert (jnweiger@immd4.informatik.uni-erlangen.de) * Michael Schroeder (mlschroe@immd4.informatik.uni-erlangen.de) * Micah Cowan (micah@cowan.name) * Sadrul Habib Chowdhury (sadrul@users.sourceforge.net) * Copyright (c) 1993-2002, 2003, 2005, 2006, 2007 * Juergen Weigert (jnweiger@immd4.informatik.uni-erlangen.de) * Michael Schroeder (mlschroe@immd4.informatik.uni-erlangen.de) * Copyright (c) 1987 Oliver Laumann * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3, or (at your option) * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program (see the file COPYING); if not, see * https://www.gnu.org/licenses/, or contact Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02111-1301 USA * **************************************************************** */ #include "config.h" #include "misc.h" #include #include #include /* mkdir() declaration */ #include #include #include #include #include "screen.h" char *SaveStr(const char *str) { char *cp = strdup(str); if (cp == NULL) Panic(0, "%s", strnomem); return cp; } char *SaveStrn(const char *str, size_t n) { char *cp = strndup(str, n + 1); if (cp == NULL) Panic(0, "%s", strnomem); return cp; } void centerline(char *str, int y) { int l, n; n = strlen(str); if (n > flayer->l_width - 1) n = flayer->l_width - 1; l = (flayer->l_width - 1 - n) / 2; LPutStr(flayer, str, n, &mchar_blank, l, y); } void leftline(char *str, int y, struct mchar *rend) { int l, n; struct mchar mchar_dol; mchar_dol = mchar_blank; mchar_dol.image = '$'; l = n = strlen(str); if (n > flayer->l_width - 1) n = flayer->l_width - 1; LPutStr(flayer, str, n, rend ? rend : &mchar_blank, 0, y); if (n != l) LPutChar(flayer, &mchar_dol, n, y); } char *Filename(char *s) { char *p = s; if (p) while (*p) if (*p++ == '/') s = p; return s; } char *stripdev(char *name) { if (name == NULL) return NULL; if (strncmp(name, "/dev/", 5) == 0) return name + 5; return name; } /* * Signal handling */ void (*xsignal(int sig, void (*func) (int))) (int) { struct sigaction osa, sa; sa.sa_handler = func; (void)sigemptyset(&sa.sa_mask); #ifdef SA_RESTART sa.sa_flags = (sig == SIGCHLD ? SA_RESTART : 0); #else sa.sa_flags = 0; #endif if (sigaction(sig, &sa, &osa)) return (void (*)(int))-1; return osa.sa_handler; } /* * uid/gid handling */ void xseteuid(int euid) { if (seteuid(euid) == 0) return; if (seteuid(0) || seteuid(euid)) Panic(errno, "seteuid"); } void xsetegid(int egid) { if (setegid(egid)) Panic(errno, "setegid"); } void Kill(pid_t pid, int sig) { if (pid < 2) return; (void)kill(pid, sig); } void closeallfiles(int except) { struct pollfd pfd[1024]; int maxfd, i, fd, ret, z; i = 3; /* skip stdin, stdout and stderr */ maxfd = getdtablesize(); while (i < maxfd) { memset(pfd, 0, sizeof(pfd)); z = 0; for (fd = i; fd < maxfd && fd < i + 1024; fd++) pfd[z++].fd = fd; ret = poll(pfd, fd - i, 0); if (ret < 0) Panic(errno, "poll"); z = 0; for (fd = i; fd < maxfd && fd < i + 1024; fd++) if (!(pfd[z++].revents & POLLNVAL) && fd != except) close(fd); i = fd; } } /* * Security - switch to real uid */ static int UserSTAT; int UserContext(void) { xseteuid(real_uid); xsetegid(real_gid); return 1; } void UserReturn(int val) { xseteuid(eff_uid); xsetegid(eff_gid); UserSTAT = val; } int UserStatus(void) { return UserSTAT; } int AddXChar(char *buf, int ch) { char *p = buf; if (ch < ' ' || ch == 0x7f) { *p++ = '^'; *p++ = ch ^ 0x40; } else if (ch >= 0x80) { *p++ = '\\'; *p++ = (ch >> 6 & 7) + '0'; *p++ = (ch >> 3 & 7) + '0'; *p++ = (ch >> 0 & 7) + '0'; } else *p++ = ch; return p - buf; } int AddXChars(char *buf, int len, char *str) { char *p; if (str == NULL) { *buf = 0; return 0; } len -= 4; /* longest sequence produced by AddXChar() */ for (p = buf; p < buf + len && *str; str++) { if (*str == ' ') *p++ = *str; else p += AddXChar(p, *str); } *p = 0; return p - buf; } screen-5.0.2/mark.h0000664000175000017500000000547415224432722012563 0ustar alexalex/* Copyright (c) 2008, 2009 * Juergen Weigert (jnweiger@immd4.informatik.uni-erlangen.de) * Michael Schroeder (mlschroe@immd4.informatik.uni-erlangen.de) * Micah Cowan (micah@cowan.name) * Sadrul Habib Chowdhury (sadrul@users.sourceforge.net) * Copyright (c) 1993-2002, 2003, 2005, 2006, 2007 * Juergen Weigert (jnweiger@immd4.informatik.uni-erlangen.de) * Michael Schroeder (mlschroe@immd4.informatik.uni-erlangen.de) * Copyright (c) 1987 Oliver Laumann * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3, or (at your option) * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program (see the file COPYING); if not, see * https://www.gnu.org/licenses/, or contact Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02111-1301 USA * **************************************************************** * $Id$ GNU */ #ifndef SCREEN_MARK_H #define SCREEN_MARK_H #include "window.h" struct markdata { Window *md_window;/* pointer to window we are working on */ struct acluser *md_user; /* The user who brought us up */ int cx, cy; /* cursor Position in WIN coords*/ int x1, y1; /* first mark in WIN coords */ int second; /* first mark dropped flag */ int left_mar, right_mar, nonl; int rep_cnt; /* number of repeats */ int append_mode; /* shall we overwrite or append to copybuffer */ int write_buffer; /* shall we do a KEY_WRITE_EXCHANGE right away? */ int hist_offset; /* how many lines are on top of the screen */ char isstr[100]; /* string we are searching for */ int isstrl; char isistr[200]; /* string of chars user has typed */ int isistrl; int isdir; /* current search direction */ int isstartpos; /* position where isearch was started */ int isstartdir; /* direction when isearch was started */ struct { /* bookkeeping for fFtT;, commands */ int flag, target, direction; } f_cmd; }; #define W2D(y) ((y) - markdata->hist_offset) #define D2W(y) ((y) + markdata->hist_offset) int GetHistory (void); void MarkRoutine (void); void revto_line (int, int, int); void revto (int, int); int InMark (void); void MakePaster (struct paster *, char *, size_t, int); void FreePaster (struct paster *); /* global variables */ extern bool compacthist; extern bool join_with_cr; extern bool pastefont; extern unsigned char mark_key_tab[]; extern const struct LayFuncs MarkLf; #endif /* SCREEN_MARK_H */ screen-5.0.2/mark.c0000664000175000017500000007362015224432722012554 0ustar alexalex/* Copyright (c) 2008, 2009 * Juergen Weigert (jnweiger@immd4.informatik.uni-erlangen.de) * Michael Schroeder (mlschroe@immd4.informatik.uni-erlangen.de) * Micah Cowan (micah@cowan.name) * Sadrul Habib Chowdhury (sadrul@users.sourceforge.net) * Copyright (c) 1993-2002, 2003, 2005, 2006, 2007 * Juergen Weigert (jnweiger@immd4.informatik.uni-erlangen.de) * Michael Schroeder (mlschroe@immd4.informatik.uni-erlangen.de) * Copyright (c) 1987 Oliver Laumann * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3, or (at your option) * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program (see the file COPYING); if not, see * https://www.gnu.org/licenses/, or contact Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02111-1301 USA * **************************************************************** */ #include "config.h" #include "mark.h" #include #include #include #include #include #include "screen.h" #include "encoding.h" #include "fileio.h" #include "process.h" #include "search.h" #include "winmsg.h" /* * !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! * * WARNING: these routines use the global variables "fore" and * "flayer" to make things easier. * * !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! */ static int is_letter(int); static void nextword(int *, int *, int, int); static int linestart(int); static int lineend(int); static int rem(int, int, int, int, int, char *, int); static bool eq(int, int); static int MarkScrollDownDisplay(int); static int MarkScrollUpDisplay(int); static void MarkProcess(char **, size_t *); static void MarkAbort(void); static void MarkRedisplayLine(int, int, int, int); bool compacthist = false; bool join_with_cr = false; bool pastefont = true; const struct LayFuncs MarkLf = { MarkProcess, MarkAbort, MarkRedisplayLine, DefClearLine, DefResize, DefRestore, NULL }; unsigned char mark_key_tab[256]; /* this array must be initialised first! */ static struct markdata *markdata; /* * VI like is_letter: 0 - whitespace * 1 - letter * 2 - other */ static int is_letter(int c) { if (isalnum(c) || c == '_' || c == '.' || c == '@' || c == ':' || c == '%' || c == '!' || c == '-' || c == '+') /* thus we can catch email-addresses as a word :-) */ return 1; else if (c != ' ') return 2; return 0; } static int linestart(int y) { int x; uint32_t *i; for (x = markdata->left_mar, i = WIN(y)->image + x; x < fore->w_width - 1; x++) if (*i++ != ' ') break; if (x == fore->w_width - 1) x = markdata->left_mar; return x; } static int lineend(int y) { int x; uint32_t *i; for (x = markdata->right_mar, i = WIN(y)->image + x; x >= 0; x--) if (*i-- != ' ') break; if (x < 0) x = markdata->left_mar; return x; } /* * nextchar sets *xp to the num-th occurrence of the target in the line. * * Returns -1 if the target doesn't appear num times, 0 otherwise. */ static int nextchar(int *xp, int *yp, int direction, char target, int num) { int width; /* width of the current window. */ int x; /* x coordinate of the current cursor position. */ int step; /* amount to increment x (+1 or -1) */ int adjust; /* Final adjustment of cursor position. */ char *displayed_line; /* Line in which search takes place. */ x = *xp; step = 1; adjust = 0; width = fore->w_width; displayed_line = (char *)WIN(*yp)->image; switch (direction) { case 't': adjust = -1; /* fall through */ case 'f': step = 1; break; case 'T': adjust = 1; /* fall through */ case 'F': step = -1; break; } x += step; for (; x >= 0 && x <= width; x += step) { if (displayed_line[x] == target) { if (--num == 0) { *xp = x + adjust; return 0; } } } return -1; } /* * nextword calculates the cursor position of the num'th word. * If the cursor is on a word, it counts as the first. * NW_BACK: search backward * NW_ENDOFWORD: find the end of the word * NW_MUSTMOVE: move at least one char * NW_BIG: match WORDs not words */ #define NW_BACK (1<<0) #define NW_ENDOFWORD (1<<1) #define NW_MUSTMOVE (1<<2) #define NW_BIG (1<<3) static void nextword(int *xp, int *yp, int flags, int num) { int xx = fore->w_width, yy = fore->w_histheight + fore->w_height; int sx, oq, q, x, y; struct mline *ml; x = *xp; y = *yp; sx = (flags & NW_BACK) ? -1 : 1; if ((flags & NW_ENDOFWORD) && (flags & NW_MUSTMOVE)) x += sx; ml = WIN(y); for (oq = -1;; x += sx, oq = q) { if (x >= xx || x < 0) q = 0; else if (flags & NW_BIG) q = ml->image[x] == ' '; else q = is_letter(ml->image[x]); if (oq >= 0 && oq != q) { if (oq == 0 || !(flags & NW_ENDOFWORD)) *xp = x; else *xp = x - sx; *yp = y; if ((!(flags & NW_ENDOFWORD) && q) || ((flags & NW_ENDOFWORD) && oq)) { if (--num <= 0) return; } } if (x == xx) { x = -1; if (++y >= yy) return; ml = WIN(y); } else if (x < 0) { x = xx; if (--y < 0) return; ml = WIN(y); } } } /* * y1, y2 are WIN coordinates * * redisplay: 0 - just copy * 1 - redisplay + copy * 2 - count + copy, don't redisplay */ static int rem(int x1, int y1, int x2, int y2, int redisplay, char *pt, int yend) { int i, j, from, to, ry; int l = 0; uint32_t *im; struct mline *ml; int font; uint32_t *fo; markdata->second = 0; if (y2 < y1 || ((y2 == y1) && (x2 < x1))) { i = y2; y2 = y1; y1 = i; i = x2; x2 = x1; x1 = i; } ry = y1 - markdata->hist_offset; i = y1; if (redisplay != 2 && pt == NULL && ry < 0) { i -= ry; ry = 0; } for (; i <= y2; i++, ry++) { if (redisplay != 2 && pt == NULL && ry > yend) break; ml = WIN(i); from = (i == y1) ? x1 : 0; if (from < markdata->left_mar) from = markdata->left_mar; for (to = fore->w_width, im = ml->image + to; to >= 0; to--) if (*im-- != ' ') break; if (i == y2 && x2 < to) to = x2; if (to > markdata->right_mar) to = markdata->right_mar; if (redisplay == 1 && from <= to && ry >= 0 && ry <= yend) MarkRedisplayLine(ry, from, to, 0); if (redisplay != 2 && pt == NULL) /* don't count/copy */ continue; j = from; if (dw_right(ml, j, fore->w_encoding)) j--; im = ml->image + j; fo = ml->font + j; font = ASCII; for (; j <= to; j++) { uint32_t c = *im++; uint32_t cf = *fo++; if (fore->w_encoding == UTF8) { c |= cf << 8; if (c == UCS_HIDDEN) continue; c = ToUtf8_comb(pt, c); l += c; if (pt) pt += c; continue; } if (is_dw_font(cf)) { c = c << 8 | *im++; fo++; j++; } if (pastefont) { c = EncodeChar(pt, c | cf << 16, fore->w_encoding, &font); l += c; if (pt) pt += c; continue; } if (pt) *pt++ = c; l++; } if (pastefont && font != ASCII) { if (pt) { strncpy(pt, "\033(B", 4); pt += 3; } l += 3; } if (i != y2 && (to != fore->w_width - 1 || ml->image[to + 1] == ' ')) { /* * this code defines, what glues lines together */ switch (markdata->nonl) { case 0: /* lines separated by newlines */ if (pt) *pt++ = '\r'; l++; if (join_with_cr) { if (pt) *pt++ = '\n'; l++; } break; case 1: /* nothing to separate lines */ break; case 2: /* lines separated by blanks */ if (pt) *pt++ = ' '; l++; break; case 3: /* separate by comma, for csh junkies */ if (pt) *pt++ = ','; l++; break; } } } return l; } /* Check if two chars are identical. All digits are treated * as same. Used for GetHistory() */ static bool eq(int a, int b) { if (a == b) return true; if (a == 0 || b == 0) return true; if (isdigit(a) && isdigit(b)) return true; return false; } /**********************************************************************/ int GetHistory(void) { /* return value 1 if copybuffer changed */ int i = 0, q = 0, xx, yy, x, y; uint32_t *linep; struct mline *ml; x = fore->w_x; if (x >= fore->w_width) x = fore->w_width - 1; y = fore->w_y + fore->w_histheight; ml = WIN(y); for (xx = x - 1, linep = ml->image + xx; xx >= 0; xx--) if ((q = *linep--) != ' ') break; for (yy = y - 1; yy >= 0; yy--) { ml = WIN(yy); linep = ml->image; if (xx < 0 || eq(linep[xx], q)) { /* line is matching... */ for (i = fore->w_width - 1, linep += i; i >= x; i--) if (*linep-- != ' ') break; if (i >= x) break; } } if (yy < 0) return 0; if (D_user->u_plop.buf) UserFreeCopyBuffer(D_user); if ((D_user->u_plop.buf = malloc((unsigned)(i - x + 2))) == NULL) { LMsg(0, "Not enough memory... Sorry."); return 0; } memmove(D_user->u_plop.buf, (char *)linep - i + x + 1, i - x + 1); D_user->u_plop.len = i - x + 1; D_user->u_plop.enc = fore->w_encoding; return 1; } /**********************************************************************/ void MarkRoutine(void) { int x, y; if (InitOverlayPage(sizeof(struct markdata), &MarkLf, 1)) return; flayer->l_encoding = fore->w_encoding; flayer->l_mode = 1; markdata = (struct markdata *)flayer->l_data; markdata->md_user = D_user; /* XXX: Correct? */ markdata->md_window = fore; markdata->second = 0; markdata->rep_cnt = 0; markdata->append_mode = 0; markdata->write_buffer = 0; markdata->nonl = 0; markdata->left_mar = 0; markdata->right_mar = fore->w_width - 1; markdata->hist_offset = fore->w_histheight; x = fore->w_x; y = D2W(fore->w_y); if (x >= fore->w_width) x = fore->w_width - 1; LGotoPos(flayer, x, W2D(y)); LMsg(0, "Copy mode - Column %d Line %d(+%d) (%d,%d)", x + 1, W2D(y + 1), fore->w_histheight, fore->w_width, fore->w_height); markdata->cx = markdata->x1 = x; markdata->cy = markdata->y1 = y; flayer->l_x = x; flayer->l_y = W2D(y); } static void MarkProcess(char **inbufp, size_t *inlenp) { char *inbuf, *pt; int inlen; int cx, cy, x2, y2, j, yend; int newcopylen = 0, od; int in_mark; int rep_cnt; struct acluser *md_user; /* char *extrap = 0, extrabuf[100]; */ markdata = (struct markdata *)flayer->l_data; fore = markdata->md_window; md_user = markdata->md_user; if (inbufp == NULL) { MarkAbort(); return; } LGotoPos(flayer, markdata->cx, W2D(markdata->cy)); inbuf = *inbufp; inlen = *inlenp; pt = inbuf; in_mark = 1; while (in_mark && (inlen /* || extrap */ )) { unsigned char ch = (unsigned char)*pt++; inlen--; if (flayer->l_mouseevent.start) { int r = LayProcessMouse(flayer, ch); if (r == -1) LayProcessMouseSwitch(flayer, 0); else { if (r) ch = 0222; else continue; } } od = mark_key_tab[(int)ch]; rep_cnt = markdata->rep_cnt; if (isdigit(od) && !markdata->f_cmd.flag) { if (rep_cnt < 1001 && (od != '0' || rep_cnt != 0)) { markdata->rep_cnt = 10 * rep_cnt + od - '0'; continue; /* * Now what is that 1001 here? Well, we have a screen with * 25 * 80 = 2000 characters. Movement is at most across the full * screen. This we do with word by word movement, as character by * character movement never steps over line boundaries. The most words * we can place on the screen are 1000 single letter words. Thus 1001 * is sufficient. Users with bigger screens never write in single letter * words, as they should be more advanced. jw. * Oh, wrong. We still give even the experienced user a factor of ten. */ } } cx = markdata->cx; cy = markdata->cy; if (markdata->f_cmd.flag) { markdata->f_cmd.flag = 0; markdata->rep_cnt = 0; if (isgraph(od)) { markdata->f_cmd.target = od; rep_cnt = (rep_cnt) ? rep_cnt : 1; nextchar(&cx, &cy, markdata->f_cmd.direction, od, rep_cnt); revto(cx, cy); continue; } } processchar: switch (od) { case 'f': /* fall through */ case 'F': /* fall through */ case 't': /* fall through */ case 'T': /* fall through */ /* * Set f_cmd to do a search on the next key stroke. * If we break, rep_cnt will be reset, so we * continue instead. It might be cleaner to * store the rep_count in f_cmd and * break here so later followon code will be * hit. */ markdata->f_cmd.flag = 1; markdata->f_cmd.direction = od; continue; case ';': case ',': if (!markdata->f_cmd.target) break; if (!rep_cnt) rep_cnt = 1; nextchar(&cx, &cy, od == ';' ? markdata->f_cmd.direction : (markdata->f_cmd.direction ^ 0x20), markdata->f_cmd.target, rep_cnt); revto(cx, cy); break; case 'o': case 'x': if (!markdata->second) break; markdata->cx = markdata->x1; markdata->cy = markdata->y1; markdata->x1 = cx; markdata->y1 = cy; revto(markdata->cx, markdata->cy); break; case '\014': /* CTRL-L Redisplay */ Redisplay(0); LGotoPos(flayer, cx, W2D(cy)); break; case 0202: /* M-C-b */ case '\010': /* CTRL-H Backspace */ case 'h': if (rep_cnt == 0) rep_cnt = 1; revto(cx - rep_cnt, cy); break; case 0216: /* M-C-p */ case '\016': /* CTRL-N */ case 'j': if (rep_cnt == 0) rep_cnt = 1; revto(cx, cy + rep_cnt); break; case '+': if (rep_cnt == 0) rep_cnt = 1; j = cy + rep_cnt; if (j > fore->w_histheight + fore->w_height - 1) j = fore->w_histheight + fore->w_height - 1; revto(linestart(j), j); break; case '-': if (rep_cnt == 0) rep_cnt = 1; cy -= rep_cnt; if (cy < 0) cy = 0; revto(linestart(cy), cy); break; case '^': revto(linestart(cy), cy); break; case '\n': revto(markdata->left_mar, cy + 1); break; case 0220: /* M-C-p */ case '\020': /* CTRL-P */ case 'k': if (rep_cnt == 0) rep_cnt = 1; revto(cx, cy - rep_cnt); break; case 0206: /* M-C-f */ case 'l': if (rep_cnt == 0) rep_cnt = 1; revto(cx + rep_cnt, cy); break; case '\001': /* CTRL-A from tcsh/emacs */ case '0': revto(markdata->left_mar, cy); break; case '\004': /* CTRL-D down half screen */ if (rep_cnt == 0) rep_cnt = (fore->w_height + 1) >> 1; revto_line(cx, cy + rep_cnt, W2D(cy)); break; case '$': revto(lineend(cy), cy); break; case '\022': /* CTRL-R emacs style backwards search */ ISearch(-1); in_mark = 0; break; case '\023': /* CTRL-S emacs style search */ ISearch(1); in_mark = 0; break; case '\025': /* CTRL-U up half screen */ if (rep_cnt == 0) rep_cnt = (fore->w_height + 1) >> 1; revto_line(cx, cy - rep_cnt, W2D(cy)); break; case '\007': /* CTRL-G show cursorpos */ if (markdata->left_mar == 0 && markdata->right_mar == fore->w_width - 1) LMsg(0, "Column %d Line %d(+%d)", cx + 1, W2D(cy) + 1, markdata->hist_offset); else LMsg(0, "Column %d(%d..%d) Line %d(+%d)", cx + 1, markdata->left_mar + 1, markdata->right_mar + 1, W2D(cy) + 1, markdata->hist_offset); break; case '\002': /* CTRL-B back one page */ if (rep_cnt == 0) rep_cnt = 1; rep_cnt *= fore->w_height; revto(cx, cy - rep_cnt); break; case '\006': /* CTRL-F forward one page */ if (rep_cnt == 0) rep_cnt = 1; rep_cnt *= fore->w_height; revto(cx, cy + rep_cnt); break; case '\005': /* CTRL-E scroll up */ if (rep_cnt == 0) rep_cnt = 1; MarkScrollUpDisplay(rep_cnt); if (cy < D2W(0)) revto(cx, D2W(0)); else LGotoPos(flayer, cx, W2D(cy)); break; case '\031': /* CTRL-Y scroll down */ if (rep_cnt == 0) rep_cnt = 1; MarkScrollDownDisplay(rep_cnt); if (cy > D2W(fore->w_height - 1)) revto(cx, D2W(fore->w_height - 1)); else LGotoPos(flayer, cx, W2D(cy)); break; case '@': /* it may be useful to have a key that does nothing */ break; case '%': /* rep_cnt is a percentage for the history buffer */ if (rep_cnt < 0) rep_cnt = 0; if (rep_cnt > 100) rep_cnt = 100; revto_line(markdata->left_mar, fore->w_histheight - fore->w_scrollback_height + (int)(rep_cnt * (fore->w_scrollback_height + fore->w_height) / 100.0), (fore->w_height - 1) / 2); break; case 0201: case 'g': rep_cnt = 1; /* FALLTHROUGH */ case 0205: case 'G': /* rep_cnt is here the WIN line number */ if (rep_cnt == 0) rep_cnt = fore->w_histheight + fore->w_height; revto_line(markdata->left_mar, --rep_cnt, (fore->w_height - 1) / 2); break; case 'H': revto(markdata->left_mar, D2W(0)); break; case 'M': revto(markdata->left_mar, D2W((fore->w_height - 1) / 2)); break; case 'L': revto(markdata->left_mar, D2W(fore->w_height - 1)); break; case '|': revto(--rep_cnt, cy); break; case 'w': if (rep_cnt == 0) rep_cnt = 1; nextword(&cx, &cy, NW_MUSTMOVE, rep_cnt); revto(cx, cy); break; case 'e': case 'E': if (rep_cnt == 0) rep_cnt = 1; nextword(&cx, &cy, NW_ENDOFWORD | NW_MUSTMOVE | (od == 'E' ? NW_BIG : 0), rep_cnt); revto(cx, cy); break; case 'b': case 'B': if (rep_cnt == 0) rep_cnt = 1; nextword(&cx, &cy, NW_BACK | NW_ENDOFWORD | NW_MUSTMOVE | (od == 'B' ? NW_BIG : 0), rep_cnt); revto(cx, cy); break; case 'a': markdata->append_mode = 1 - markdata->append_mode; LMsg(0, (markdata->append_mode) ? ":set append" : ":set noappend"); break; case 'v': case 'V': /* this sets start column to column 9 for VI :set nu users */ if (markdata->left_mar == 8) rep_cnt = 1; else rep_cnt = 9; /* FALLTHROUGH */ case 'c': case 'C': /* set start column (c) and end column (C) */ if (markdata->second) { rem(markdata->x1, markdata->y1, cx, cy, 1, NULL, fore->w_height - 1); /* Hack */ markdata->second = 1; /* rem turns off second */ } rep_cnt--; if (rep_cnt < 0) rep_cnt = cx; if (od != 'C') { markdata->left_mar = rep_cnt; if (markdata->left_mar > markdata->right_mar) markdata->left_mar = markdata->right_mar; } else { markdata->right_mar = rep_cnt; if (markdata->left_mar > markdata->right_mar) markdata->right_mar = markdata->left_mar; } if (markdata->second) { markdata->cx = markdata->x1; markdata->cy = markdata->y1; revto(cx, cy); } if (od == 'v' || od == 'V') LMsg(0, (markdata->left_mar != 8) ? ":set nonu" : ":set nu"); break; case 'J': /* how do you join lines in VI ? */ markdata->nonl = (markdata->nonl + 1) % 4; switch (markdata->nonl) { case 0: if (join_with_cr) LMsg(0, "Multiple lines (CR/LF)"); else LMsg(0, "Multiple lines (LF)"); break; case 1: LMsg(0, "Lines joined"); break; case 2: LMsg(0, "Lines joined with blanks"); break; case 3: LMsg(0, "Lines joined with comma"); break; } break; case '/': Search(1); in_mark = 0; break; case '?': Search(-1); in_mark = 0; break; case 'n': Search(0); break; case 'N': markdata->isdir = -markdata->isdir; Search(0); markdata->isdir = -markdata->isdir; break; case 'y': case 'Y': if (markdata->second == 0) { revto(linestart(cy), cy); markdata->second++; cx = markdata->x1 = markdata->cx; cy = markdata->y1 = markdata->cy; } if (--rep_cnt > 0) revto(cx, cy + rep_cnt); revto(lineend(markdata->cy), markdata->cy); if (od == 'y') break; /* FALLTHROUGH */ case 'W': if (od == 'W') { if (rep_cnt == 0) rep_cnt = 1; if (!markdata->second) { nextword(&cx, &cy, NW_BACK | NW_ENDOFWORD, 1); revto(cx, cy); markdata->second++; cx = markdata->x1 = markdata->cx; cy = markdata->y1 = markdata->cy; } nextword(&cx, &cy, NW_ENDOFWORD, rep_cnt); revto(cx, cy); } cx = markdata->cx; cy = markdata->cy; /* FALLTHROUGH */ case 'A': if (od == 'A') markdata->append_mode = 1; /* FALLTHROUGH */ case '>': if (od == '>') markdata->write_buffer = 1; /* FALLTHROUGH */ case ' ': case '\r': if (!markdata->second) { markdata->second++; markdata->x1 = cx; markdata->y1 = cy; revto(cx, cy); LMsg(0, "First mark set - Column %d Line %d", cx + 1, W2D(cy) + 1); break; } else { int append_mode = markdata->append_mode; int write_buffer = markdata->write_buffer; x2 = cx; y2 = cy; newcopylen = rem(markdata->x1, markdata->y1, x2, y2, 2, NULL, 0); /* count */ if (md_user->u_plop.buf && !append_mode) UserFreeCopyBuffer(md_user); yend = fore->w_height - 1; if (fore->w_histheight - markdata->hist_offset < fore->w_height) { markdata->second = 0; yend -= MarkScrollUpDisplay(fore->w_histheight - markdata->hist_offset); } if (newcopylen > 0) { /* the +3 below is for : cr + lf + \0 */ if (md_user->u_plop.buf) md_user->u_plop.buf = realloc(md_user->u_plop.buf, (unsigned)(md_user->u_plop.len + newcopylen + 3)); else { md_user->u_plop.len = 0; md_user->u_plop.buf = malloc((unsigned)(newcopylen + 3)); } if (!md_user->u_plop.buf) { MarkAbort(); in_mark = 0; LMsg(0, "Not enough memory... Sorry."); md_user->u_plop.len = 0; md_user->u_plop.buf = NULL; break; } if (append_mode) { switch (markdata->nonl) { /* * this code defines, what glues lines together */ case 0: if (join_with_cr) { md_user->u_plop.buf[md_user->u_plop.len] = '\r'; md_user->u_plop.len++; } md_user->u_plop.buf[md_user->u_plop.len] = '\n'; md_user->u_plop.len++; break; case 1: break; case 2: md_user->u_plop.buf[md_user->u_plop.len] = ' '; md_user->u_plop.len++; break; case 3: md_user->u_plop.buf[md_user->u_plop.len] = ','; md_user->u_plop.len++; break; } } md_user->u_plop.len += rem(markdata->x1, markdata->y1, x2, y2, markdata->hist_offset == fore->w_histheight, md_user->u_plop.buf + md_user->u_plop.len, yend); md_user->u_plop.enc = fore->w_encoding; } if (markdata->hist_offset != fore->w_histheight) { LAY_CALL_UP(LRefreshAll(flayer, 0)); } ExitOverlayPage(); WindowChanged(fore, WINESC_COPY_MODE); if (append_mode) LMsg(0, "Appended %d characters to buffer", newcopylen); else LMsg(0, "Copied %zu characters into buffer", md_user->u_plop.len); if (write_buffer) WriteFile(md_user, NULL, DUMP_EXCHANGE); in_mark = 0; break; } case 0222: if (flayer->l_mouseevent.start) { int button = flayer->l_mouseevent.buffer[0]; if (button == 'a') { /* Scroll down */ od = 'j'; } else if (button == '`') { /* Scroll up */ od = 'k'; } else if (button == ' ') { /* Left click */ cx = flayer->l_mouseevent.buffer[1]; cy = D2W(flayer->l_mouseevent.buffer[2]); revto(cx, cy); od = ' '; } else od = 0; LayProcessMouseSwitch(flayer, 0); if (od) goto processchar; } else LayProcessMouseSwitch(flayer, 1); break; default: MarkAbort(); LMsg(0, "Copy mode aborted"); in_mark = 0; break; } if (in_mark) /* markdata may be freed */ markdata->rep_cnt = 0; } if (in_mark) { flayer->l_x = markdata->cx; flayer->l_y = W2D(markdata->cy); } *inbufp = pt; *inlenp = inlen; } void revto(int tx, int ty) { revto_line(tx, ty, -1); } /* tx, ty: WINDOW, line: DISPLAY */ void revto_line(int tx, int ty, int line) { int fx, fy; int x, y, t, revst, reven, qq, ff, tt, st, en, ce = 0; int ystart = 0, yend = fore->w_height - 1; int i, ry; uint32_t *wi; struct mline *ml; struct mchar mc; if (tx < 0) tx = 0; else if (tx > fore->w_width - 1) tx = fore->w_width - 1; if (ty < fore->w_histheight - fore->w_scrollback_height) ty = fore->w_histheight - fore->w_scrollback_height; else if (ty > fore->w_histheight + fore->w_height - 1) ty = fore->w_histheight + fore->w_height - 1; fx = markdata->cx; fy = markdata->cy; /* don't just move inside of a kanji, the user wants to see something */ ml = WIN(ty); if (ty == fy && fx + 1 == tx && dw_right(ml, tx, fore->w_encoding) && tx < D_width - 1) tx++; if (ty == fy && fx - 1 == tx && dw_right(ml, fx, fore->w_encoding) && tx) tx--; markdata->cx = tx; markdata->cy = ty; /* * if we go to a position that is currently offscreen * then scroll the screen */ i = 0; if (line >= 0 && line < fore->w_height) i = W2D(ty) - line; else if (ty < markdata->hist_offset) i = ty - markdata->hist_offset; else if (ty > markdata->hist_offset + (fore->w_height - 1)) i = ty - markdata->hist_offset - (fore->w_height - 1); if (i > 0) yend -= MarkScrollUpDisplay(i); else if (i < 0) ystart += MarkScrollDownDisplay(-i); if (markdata->second == 0) { flayer->l_x = tx; flayer->l_y = W2D(ty); LGotoPos(flayer, tx, W2D(ty)); return; } qq = markdata->x1 + markdata->y1 * fore->w_width; ff = fx + fy * fore->w_width; /* "from" offset in WIN coords */ tt = tx + ty * fore->w_width; /* "to" offset in WIN coords */ if (ff > tt) { st = tt; en = ff; x = tx; y = ty; } else { st = ff; en = tt; x = fx; y = fy; } if (st > qq) { st++; x++; } if (en < qq) en--; if (tt > qq) { revst = qq; reven = tt; } else { revst = tt; reven = qq; } ry = y - markdata->hist_offset; if (ry < ystart) { y += (ystart - ry); x = 0; st = y * fore->w_width; ry = ystart; } ml = WIN(y); for (t = st; t <= en; t++, x++) { if (x >= fore->w_width) { x = 0; y++, ry++; ml = WIN(y); } if (ry > yend) break; if (t == st || x == 0) { wi = ml->image + fore->w_width; for (ce = fore->w_width; ce >= 0; ce--, wi--) if (*wi != ' ') break; } if (x <= ce && x >= markdata->left_mar && x <= markdata->right_mar) { if (dw_right(ml, x, fore->w_encoding)) { if (t == revst) revst--; t--; x--; } if (t >= revst && t <= reven) { mc = mchar_so; if (pastefont) { mc.font = ml->font[x]; } mc.image = ml->image[x]; } else copy_mline2mchar(&mc, ml, x); if (dw_left(ml, x, fore->w_encoding)) { mc.mbcs = ml->image[x + 1]; LPutChar(flayer, &mc, x, W2D(y)); t++; } LPutChar(flayer, &mc, x, W2D(y)); if (dw_left(ml, x, fore->w_encoding)) x++; } } flayer->l_x = tx; flayer->l_y = W2D(ty); LGotoPos(flayer, tx, W2D(ty)); } static void MarkAbort(void) { int yend, redisp; markdata = (struct markdata *)flayer->l_data; fore = markdata->md_window; yend = fore->w_height - 1; redisp = markdata->second; if (fore->w_histheight - markdata->hist_offset < fore->w_height) { markdata->second = 0; yend -= MarkScrollUpDisplay(fore->w_histheight - markdata->hist_offset); } if (markdata->hist_offset != fore->w_histheight) { LAY_CALL_UP(LRefreshAll(flayer, 0)); } else { rem(markdata->x1, markdata->y1, markdata->cx, markdata->cy, redisp, NULL, yend); } ExitOverlayPage(); WindowChanged(fore, WINESC_COPY_MODE); } static void MarkRedisplayLine(int y, int xs, int xe, int isblank) /* NOTE: y is in DISPLAY coords system! */ { int wy, x, i, rm; int sta, sto, cp; /* NOTE: these 3 are in WINDOW coords system */ uint32_t *wi; struct mline *ml; struct mchar mchar_marked; if (y < 0) /* No special full page handling */ return; markdata = (struct markdata *)flayer->l_data; fore = markdata->md_window; mchar_marked = mchar_so; wy = D2W(y); ml = WIN(wy); if (markdata->second == 0) { if (dw_right(ml, xs, fore->w_encoding) && xs > 0) xs--; if (dw_left(ml, xe, fore->w_encoding) && xe < fore->w_width - 1) xe++; if (xs == 0 && y > 0 && wy > 0 && WIN(wy - 1)->image[flayer->l_width] == 0) LCDisplayLineWrap(flayer, ml, y, xs, xe, isblank); else LCDisplayLine(flayer, ml, y, xs, xe, isblank); return; } sta = markdata->y1 * fore->w_width + markdata->x1; sto = markdata->cy * fore->w_width + markdata->cx; if (sta > sto) { i = sta; sta = sto; sto = i; } cp = wy * fore->w_width + xs; rm = markdata->right_mar; for (x = fore->w_width, wi = ml->image + fore->w_width; x >= 0; x--, wi--) if (*wi != ' ') break; if (x < rm) rm = x; for (x = xs; x <= xe; x++, cp++) if (cp >= sta && x >= markdata->left_mar) break; if (dw_right(ml, x, fore->w_encoding)) x--; if (x > xs) LCDisplayLine(flayer, ml, y, xs, x - 1, isblank); for (; x <= xe; x++, cp++) { if (cp > sto || x > rm) break; if (pastefont) { mchar_marked.font = ml->font[x]; } mchar_marked.image = ml->image[x]; mchar_marked.mbcs = 0; if (dw_left(ml, x, fore->w_encoding)) { mchar_marked.mbcs = ml->image[x + 1]; cp++; } LPutChar(flayer, &mchar_marked, x, y); if (dw_left(ml, x, fore->w_encoding)) x++; } if (x <= xe) LCDisplayLine(flayer, ml, y, x, xe, isblank); } /* * scroll the screen contents up/down. */ static int MarkScrollUpDisplay(int n) { int i; if (n <= 0) return 0; if (n > fore->w_histheight - markdata->hist_offset) n = fore->w_histheight - markdata->hist_offset; markdata->hist_offset += n; i = (n < flayer->l_height) ? n : (flayer->l_height); LScrollV(flayer, i, 0, flayer->l_height - 1, 0); while (i-- > 0) MarkRedisplayLine(flayer->l_height - i - 1, 0, flayer->l_width - 1, 1); return n; } static int MarkScrollDownDisplay(int n) { int i; if (n <= 0) return 0; if (n > markdata->hist_offset) n = markdata->hist_offset; markdata->hist_offset -= n; i = (n < flayer->l_height) ? n : (flayer->l_height); LScrollV(flayer, -i, 0, fore->w_height - 1, 0); while (i-- > 0) MarkRedisplayLine(i, 0, flayer->l_width - 1, 1); return n; } void MakePaster(struct paster *pa, char *buf, size_t len, int bufiscopy) { FreePaster(pa); pa->pa_pasteptr = buf; pa->pa_pastelen = len; if (bufiscopy) pa->pa_pastebuf = buf; pa->pa_pastelayer = flayer; DoProcess(Layer2Window(flayer), &pa->pa_pasteptr, &pa->pa_pastelen, pa); } void FreePaster(struct paster *pa) { if (pa->pa_pastebuf) free(pa->pa_pastebuf); pa->pa_pastebuf = NULL; pa->pa_pasteptr = NULL; pa->pa_pastelen = 0; pa->pa_pastelayer = NULL; evdeq(&pa->pa_slowev); } screen-5.0.2/logfile.h0000664000175000017500000000664015224432722013246 0ustar alexalex/* Copyright (c) 2008, 2009 * Juergen Weigert (jnweiger@immd4.informatik.uni-erlangen.de) * Michael Schroeder (mlschroe@immd4.informatik.uni-erlangen.de) * Micah Cowan (micah@cowan.name) * Sadrul Habib Chowdhury (sadrul@users.sourceforge.net) * Copyright (c) 1993-2002, 2003, 2005, 2006, 2007 * Juergen Weigert (jnweiger@immd4.informatik.uni-erlangen.de) * Michael Schroeder (mlschroe@immd4.informatik.uni-erlangen.de) * Copyright (c) 1987 Oliver Laumann * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3, or (at your option) * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program (see the file COPYING); if not, see * https://www.gnu.org/licenses/, or contact Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02111-1301 USA * **************************************************************** * $Id$ GNU */ #ifndef SCREEN_LOGFILE_H #define SCREEN_LOGFILE_H #include typedef struct Log Log; struct Log { Log *next; FILE *fp; /* a hopefully uniq filepointer to the log file */ char *name; /* the name. used to reopen, when stat fails. */ int opencount; /* synchronize logfopen() and logfclose() */ int writecount; /* increments at logfwrite(), counts write() and fflush() */ int flushcount; /* increments at logfflush(), zeroed at logfwrite() */ struct stat *st;/* how the file looks like */ }; /* * open a logfile, The second argument must be NULL, when the named file * is already a logfile or must be a appropriately opened file pointer * otherwise. * example: l = logfopen(name, islogfile(name) : NULL ? fopen(name, "a")); */ Log *logfopen (char *name, FILE *fp); /* * lookup a logfile by name. This is useful, so that we can provide * logfopen with a nonzero second argument, exactly when needed. * islogfile(NULL); returns nonzero if there are any open logfiles at all. */ int islogfile (char *name); /* * logfclose does free() */ int logfclose (Log *); int logfwrite (Log *, char *, size_t); /* * logfflush should be called periodically. If no argument is passed, * all logfiles are flushed, else the specified file * the number of flushed filepointers is returned */ int logfflush (Log *ifany); /* * a reopen function may be registered here, in case you want to bring your * own (more secure open), it may come along with a private data pointer. * this function is called, whenever logfwrite/logfflush detect that the * file has been (re)moved, truncated or changed by someone else. * if you provide NULL as parameter to logreopen_register, the builtin * reopen function will be reactivated. */ void logreopen_register (int (*fn) (char *, int, struct Log *) ); /* * Your custom reopen function is required to reuse the exact * filedescriptor. * See logfile.c for further specs and an example. * * lf_move_fd may help you here, if you do not have dup2(2). * It closes fd and opens wantfd to access whatever fd accessed. */ int lf_move_fd (int fd, int wantfd); #endif /* SCREEN_LOGFILE_H */ screen-5.0.2/logfile.c0000664000175000017500000001421615224432722013237 0ustar alexalex/* Copyright (c) 2008, 2009 * Juergen Weigert (jnweiger@immd4.informatik.uni-erlangen.de) * Michael Schroeder (mlschroe@immd4.informatik.uni-erlangen.de) * Micah Cowan (micah@cowan.name) * Sadrul Habib Chowdhury (sadrul@users.sourceforge.net) * Copyright (c) 1993-2002, 2003, 2005, 2006, 2007 * Juergen Weigert (jnweiger@immd4.informatik.uni-erlangen.de) * Michael Schroeder (mlschroe@immd4.informatik.uni-erlangen.de) * Copyright (c) 1987 Oliver Laumann * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3, or (at your option) * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program (see the file COPYING); if not, see * https://www.gnu.org/licenses/, or contact Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02111-1301 USA * **************************************************************** */ #include "config.h" #include "logfile.h" #include /* dev_t, ino_t, off_t, ... */ #include /* struct stat */ #include /* O_WRONLY for logfile_reopen */ #include #include #include "screen.h" #include "misc.h" static void changed_logfile(Log *); static Log *lookup_logfile(char *); static int stolen_logfile(Log *); static Log *logroot = NULL; static void changed_logfile(Log *l) { struct stat o, *s = l->st; if (fstat(fileno(l->fp), &o) < 0) /* get trouble later */ return; if (o.st_size > s->st_size) { /* aha, appended text */ s->st_size = o.st_size; /* this should have changed */ s->st_mtime = o.st_mtime; /* only size and mtime */ } } /* * Requires fd to be open and need_fd to be closed. * If possible, need_fd will be open afterwards and refer to * the object originally referred by fd. fd will be closed then. * Works just like ``fcntl(fd, DUPFD, need_fd); close(fd);'' * * need_fd is returned on success, else -1 is returned. */ int lf_move_fd(int fd, int need_fd) { int r = -1; if (fd == need_fd) return fd; if (fd >= 0 && fd < need_fd) r = lf_move_fd(dup(fd), need_fd); close(fd); return r; } static int logfile_reopen(char *name, int wantfd, Log *l) { int got_fd; close(wantfd); if (((got_fd = open(name, O_WRONLY | O_CREAT | O_APPEND, 0666)) < 0) || lf_move_fd(got_fd, wantfd) < 0) { logfclose(l); return -1; } changed_logfile(l); return 0; } static int (*lf_reopen_fn) (char *, int, struct Log *) = logfile_reopen; /* * Whenever logfwrite discoveres that it is required to close and * reopen the logfile, the function registered here is called. * If you do not register anything here, the above logfile_reopen() * will be used instead. * Your function should perform the same steps as logfile_reopen(): * a) close the original filedescriptor without flushing any output * b) open a new logfile for future output on the same filedescriptor number. * c) zero out st_dev, st_ino to tell the stolen_logfile() indcator to * reinitialise itself. * d) return 0 on success. */ void logreopen_register(int (*fn) (char *, int, struct Log *)) { lf_reopen_fn = fn ? fn : logfile_reopen; } /* * If the logfile has been removed, truncated, unlinked or the like, * return nonzero. * The l->st structure initialised by logfopen is updated * on every call. */ static int stolen_logfile(Log *l) { struct stat o, *s = l->st; o = *s; if (fstat(fileno(l->fp), s) < 0) /* remember that stat failed */ s->st_ino = s->st_dev = 0; if (!o.st_dev && !o.st_ino) /* nothing to compare with */ return 0; if ((!s->st_dev && !s->st_ino) || /* stat failed, that's new! */ !s->st_nlink || /* red alert: file unlinked */ (s->st_size < o.st_size) || /* file truncated */ (s->st_mtime != o.st_mtime) || /* file modified */ ((s->st_ctime != o.st_ctime) && /* file changed (moved) */ !(s->st_mtime == s->st_ctime && /* and it was not a change */ o.st_ctime < s->st_ctime))) { /* due to delayed nfs write */ return -1; } return 0; } static Log *lookup_logfile(char *name) { Log *l; for (l = logroot; l; l = l->next) if (!strcmp(name, l->name)) return l; return NULL; } Log *logfopen(char *name, FILE * fp) { Log *l; if (!fp) { if (!(l = lookup_logfile(name))) return NULL; l->opencount++; return l; } if (!(l = calloc(1, sizeof(Log)))) return NULL; if (!(l->st = calloc(1, sizeof(struct stat)))) { free((char *)l); return NULL; } if (!(l->name = SaveStr(name))) { free((char *)l->st); free((char *)l); return NULL; } l->fp = fp; l->opencount = 1; l->writecount = 0; l->flushcount = 0; changed_logfile(l); l->next = logroot; logroot = l; return l; } int islogfile(char *name) { if (!name) return logroot ? 1 : 0; return lookup_logfile(name) ? 1 : 0; } int logfclose(Log *l) { Log **lp; for (lp = &logroot; *lp; lp = &(*lp)->next) if (*lp == l) break; if (!*lp) return -1; if ((--l->opencount) > 0) return 0; if (l->opencount < 0) abort(); *lp = l->next; fclose(l->fp); free(l->name); free((char *)l); return 0; } /* * XXX * write and flush both *should* check the file's stat, if it disappeared * or changed, re-open it. */ int logfwrite(Log *l, char *buf, size_t n) { int r; if (stolen_logfile(l) && lf_reopen_fn(l->name, fileno(l->fp), l)) return -1; r = fwrite(buf, n, 1, l->fp); l->writecount += l->flushcount + 1; l->flushcount = 0; changed_logfile(l); return r; } int logfflush(Log *l) { int r = 0; if (!l) for (l = logroot; l; l = l->next) { if (stolen_logfile(l) && lf_reopen_fn(l->name, fileno(l->fp), l)) return -1; r |= fflush(l->fp); l->flushcount++; changed_logfile(l); } else { if (stolen_logfile(l) && lf_reopen_fn(l->name, fileno(l->fp), l)) return -1; r = fflush(l->fp); l->flushcount++; changed_logfile(l); } return r; } screen-5.0.2/list_window.c0000664000175000017500000003677215224432722014173 0ustar alexalex/* Copyright (c) 2010 * Juergen Weigert (jnweiger@immd4.informatik.uni-erlangen.de) * Sadrul Habib Chowdhury (sadrul@users.sourceforge.net) * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3, or (at your option) * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program (see the file COPYING); if not, see * https://www.gnu.org/licenses/, or contact Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02111-1301 USA * **************************************************************** */ /* Deals with the list of windows */ #include "config.h" #include "list_generic.h" #include #include #include "screen.h" #include "input.h" #include "layer.h" #include "misc.h" #include "process.h" #include "winmsg.h" static char ListID[] = "window"; struct gl_Window_Data { Window *group; /* Set only for a W_TYPE_GROUP window */ int order; /* MRU? NUM? */ int onblank; int nested; Window *fore; /* The foreground window we had. */ }; /* Is this wdata for a group window? */ #define WLIST_FOR_GROUP(wdate) ((wdata)->group && !(wdata)->onblank && Layer2Window(flayer) && Layer2Window(flayer)->w_type == W_TYPE_GROUP) /* This macro should not be used if 'fn' is expected to update the window list */ #define FOR_EACH_WINDOW(_wdata, _w, fn) do { \ if ((_wdata)->order == WLIST_MRU) { \ Window *_ww; \ for (_ww = mru_window; _ww; _ww = _ww->w_prev_mru) { \ _w = _ww; \ fn \ } \ } else { \ Window *_ww; \ for (_ww = first_window; _ww; _ww = _ww->w_next) { \ _w = _ww; \ fn \ } \ } \ } while (0) /* Is 'a' an ancestor of 'd'? */ static int window_ancestor(Window *a, Window *d) { if (!a) return 1; /* Every window is a descendant of the 'null' group */ for (; d; d = d->w_group) if (d->w_group == a) return 1; return 0; } static void window_kill_confirm(char *buf, size_t len, void *data) { Window *w = mru_window; struct action act; if (len || (*buf != 'y' && *buf != 'Y')) { memset(buf, 0, len); return; } /* Loop over the windows to make sure that the window actually still exists. */ for (; w; w = w->w_prev_mru) if (w == (Window *)data) break; if (!w) return; /* Pretend the selected window is the foreground window. Then trigger a non-interactive 'kill' */ fore = w; act.nr = RC_KILL; act.args = noargs; act.argl = NULL; act.quiet = 0; DoAction(&act); } static ListRow *gl_Window_add_group(ListData *ldata, ListRow *row) { /* Right now, 'row' doesn't have any child. */ struct gl_Window_Data *wdata = ldata->data; Window *group = row->data, *w; ListRow *cur = row; FOR_EACH_WINDOW(wdata, w, if (w->w_group != group) continue; cur = glist_add_row(ldata, w, cur); if (w == wdata->fore) ldata->selected = cur; if (w->w_type == W_TYPE_GROUP) cur = gl_Window_add_group(ldata, cur);) ; return cur; } static int gl_Window_rebuild(ListData *ldata) { ListRow *row = NULL; struct gl_Window_Data *wdata = ldata->data; Window *w; if (flayer->l_width < 10 || flayer->l_height < 6) return -1; FOR_EACH_WINDOW(wdata, w, if (w->w_group != wdata->group) continue; row = glist_add_row(ldata, w, row); if (w == wdata->fore) ldata->selected = row; if (w->w_type == W_TYPE_GROUP && wdata->nested) row = gl_Window_add_group(ldata, row);) ; glist_display_all(ldata); return 0; } static ListRow *gl_Window_findrow(ListData *ldata, Window *p) { ListRow *row = ldata->root; for (; row; row = row->next) { if (row->data == p) break; } return row; } static int gl_Window_remove(ListData *ldata, Window *p) { ListRow *row = gl_Window_findrow(ldata, p); if (!row) return 0; /* Remove 'row'. Update 'selected', 'top', 'root' if necessary. */ if (row->next) row->next->prev = row->prev; if (row->prev) row->prev->next = row->next; if (ldata->selected == row) ldata->selected = row->prev ? row->prev : row->next; if (ldata->top == row) ldata->top = row->prev ? row->prev : row->next; if (ldata->root == row) ldata->root = row->next; ldata->list_fn->gl_freerow(ldata, row); free(row); return 1; } static int gl_Window_header(ListData *ldata) { char *str; struct gl_Window_Data *wdata = ldata->data; int g; if ((g = (wdata->group != NULL))) { LPutWinMsg(flayer, "Group: ", 7, &mchar_blank, 0, 0); LPutWinMsg(flayer, wdata->group->w_title, strlen(wdata->group->w_title), &mchar_blank, 7, 0); } str = MakeWinMsgEv(NULL, wlisttit, NULL, '%', flayer->l_width, NULL, 0); LPutWinMsg(flayer, str, strlen(str), &mchar_blank, 0, g); return 2 + g; } static int gl_Window_footer(ListData *ldata) { (void)ldata; /* unused */ centerline("[Press ctrl-l to refresh; Return to end.]", flayer->l_height - 1); return 1; } static int gl_Window_row(ListData *ldata, ListRow *lrow) { char *str; Window *w, *g; int xoff; struct mchar *mchar; struct mchar mchar_rend = mchar_blank; struct gl_Window_Data *wdata = ldata->data; w = lrow->data; /* First, make sure we want to display this window in the list. * If we are showing a list for a group, and not on blank, then we must * only show the windows directly belonging to that group. * Otherwise, do some more checks. */ for (xoff = 0, g = w->w_group; g != wdata->group; g = g->w_group) xoff += 2; str = MakeWinMsgEv(NULL, wliststr, w, '%', flayer->l_width - xoff, NULL, 0); if (ldata->selected == lrow) mchar = &mchar_so; else if (w->w_monitor == MON_DONE && renditions[REND_MONITOR] != 0) { mchar = &mchar_rend; ApplyAttrColor(renditions[REND_MONITOR], mchar); } else if ((w->w_bell == BELL_DONE || w->w_bell == BELL_FOUND) && renditions[REND_BELL] != 0) { mchar = &mchar_rend; ApplyAttrColor(renditions[REND_BELL], mchar); } else if ((w->w_silence == SILENCE_FOUND || w->w_silence == SILENCE_DONE) && renditions[REND_SILENCE] != 0) { mchar = &mchar_rend; ApplyAttrColor(renditions[REND_SILENCE], mchar); } else mchar = &mchar_blank; LPutWinMsg(flayer, str, flayer->l_width, mchar, xoff, lrow->y); if (xoff) LPutWinMsg(flayer, "", xoff, mchar, 0, lrow->y); return 1; } static int gl_Window_input(ListData *ldata, char **inp, size_t *len) { Window *win; unsigned char ch; Display *cd = display; struct gl_Window_Data *wdata = ldata->data; if (!ldata->selected) return 0; ch = (unsigned char)**inp; ++*inp; --*len; win = ldata->selected->data; switch (ch) { case '\f': /* ^L to refresh */ glist_remove_rows(ldata); gl_Window_rebuild(ldata); break; case ' ': case '\n': case '\r': if (!win) break; if (display && AclCheckPermWin(D_user, ACL_READ, win)) return 0; /* Not allowed to switch to this window. */ if (WLIST_FOR_GROUP(wdata)) SwitchWindow(win); else { /* Abort list only when not in a group window. */ glist_abort(); display = cd; if (D_fore != win) SwitchWindow(win); } *len = 0; break; case 'm': /* Toggle MRU-ness */ wdata->order = wdata->order == WLIST_MRU ? WLIST_NUM : WLIST_MRU; if (wdata->group) wdata->group->w_list_order = wdata->order; glist_remove_rows(ldata); gl_Window_rebuild(ldata); break; case 'g': /* Toggle nestedness */ wdata->nested = !wdata->nested; if (wdata->group) wdata->group->w_list_nested = wdata->nested ? true : false; glist_remove_rows(ldata); gl_Window_rebuild(ldata); break; case '>': win->w_miflag = win->w_miflag ? 0 : 1; SwapWindows(win->w_number, win->w_number); break; case 'a': /* All-window view */ if (wdata->group) { int order = wdata->order | (wdata->nested ? WLIST_NESTED : 0); glist_abort(); display = cd; display_windows(1, order, NULL); *len = 0; } else if (!wdata->nested) { wdata->nested = 1; glist_remove_rows(ldata); gl_Window_rebuild(ldata); } break; case 010: /* ^H */ case 0177: /* Backspace */ if (!wdata->group) break; if (wdata->group->w_group) { /* The parent is another group window. So switch to that window. */ Window *g = wdata->group->w_group; glist_abort(); display = cd; SetForeWindow(g); *len = 0; } else { /* We were in a group view. Now we are moving to an all-window view. * So treat it as 'windowlist on blank'. */ int order = wdata->order | (wdata->nested ? WLIST_NESTED : 0); glist_abort(); display = cd; display_windows(1, order, NULL); *len = 0; } break; case ',': /* Switch numbers with the previous window. */ if (wdata->order == WLIST_NUM && ldata->selected->prev) { Window *pw = ldata->selected->prev->data; if (win->w_group != pw->w_group) break; /* Do not allow switching with the parent group */ /* When a windows's number is successfully changed, it triggers a WListUpdatecv * with NULL window. So that causes a redraw of the entire list. So reset the * 'selected' after that. */ wdata->fore = win; SwapWindows(win->w_number, pw->w_number); } break; case '.': /* Switch numbers with the next window. */ if (wdata->order == WLIST_NUM && ldata->selected->next) { Window *nw = ldata->selected->next->data; if (win->w_group != nw->w_group) break; /* Do not allow switching with the parent group */ wdata->fore = win; SwapWindows(win->w_number, nw->w_number); } break; case 'K': /* Kill a window */ { char str[MAXSTR]; snprintf(str, ARRAY_SIZE(str) - 1, "Really kill window %d (%s) [y/n]", win->w_number, win->w_title); Input(str, 1, INP_RAW, window_kill_confirm, (char *)win, 0); } break; case 033: /* escape */ case 007: /* ^G */ if (!WLIST_FOR_GROUP(wdata)) { Window * w = wdata->onblank ? wdata->fore : NULL; glist_abort(); display = cd; if (w) SwitchWindow(w); *len = 0; } break; default: if (ch >= '0' && ch <= '9') { ListRow *row = ldata->root; for (; row; row = row->next) { Window *w = row->data; if (w->w_number == ch - '0') { ListRow *old = ldata->selected; if (old == row) break; ldata->selected = row; if (ldata->selected->y == -1) { /* We need to list all the rows, since we are scrolling down. But first, * find the top of the visible list. */ ldata->top = row; glist_display_all(ldata); } else { /* just redisplay the two lines. */ ldata->list_fn->gl_printrow(ldata, old); ldata->list_fn->gl_printrow(ldata, ldata->selected); flayer->l_y = ldata->selected->y; LaySetCursor(); } break; } } break; } --*inp; ++*len; return 0; } return 1; } static int gl_Window_freerow(ListData *ldata, ListRow *row) { (void)ldata; /* unused */ (void)row; /* unused */ return 0; } static int gl_Window_free(ListData *ldata) { Free(ldata->data); return 0; } static int gl_Window_match(ListData *ldata, ListRow *row, const char *needle) { Window *w = row->data; (void)ldata; /* unused */ if (strstr(w->w_title, needle)) return 1; return 0; } static const GenericList gl_Window = { gl_Window_header, gl_Window_footer, gl_Window_row, gl_Window_input, gl_Window_freerow, gl_Window_free, gl_Window_rebuild, gl_Window_match }; void display_windows(int onblank, int order, Window *group) { Window *p; ListData *ldata; struct gl_Window_Data *wdata; if (flayer->l_width < 10 || flayer->l_height < 6) { LMsg(0, "Window size too small for window list page"); return; } if (group) { onblank = 0; /* When drawing a group window, ignore 'onblank' */ order = (group->w_list_nested ? WLIST_NESTED : 0) + (group->w_list_order ? WLIST_MRU : WLIST_NUM); /* restore windowlist order flags */ } if (onblank) { if (!display) { LMsg(0, "windowlist -b: display required"); return; } p = D_fore; if (p) { SetForeWindow(NULL); if (p->w_group) { D_fore = p->w_group; flayer->l_data = (char *)p->w_group; } Activate(0); } if (flayer->l_width < 10 || flayer->l_height < 6) { LMsg(0, "Window size too small for window list page"); return; } } else p = Layer2Window(flayer); if (!group && p) group = p->w_group; ldata = glist_display(&gl_Window, ListID); if (!ldata) { if (onblank && p) { /* Could not display the list. So restore the window. */ SetForeWindow(p); Activate(1); } return; } wdata = calloc(1, sizeof(struct gl_Window_Data)); wdata->group = group; wdata->order = (order & ~WLIST_NESTED); wdata->nested = ! !(order & WLIST_NESTED); wdata->onblank = onblank; /* Set the most recent window as selected. */ wdata->fore = mru_window; while (wdata->fore && wdata->fore->w_group != group) wdata->fore = wdata->fore->w_prev_mru; ldata->data = wdata; gl_Window_rebuild(ldata); } static void WListUpdate(Window *p, ListData *ldata) { struct gl_Window_Data *wdata = ldata->data; ListRow *row, *rbefore; Window *before; int d = 0, sel = 0; if (!p) { if (ldata->selected) wdata->fore = ldata->selected->data; /* Try to retain the current selection */ glist_remove_rows(ldata); gl_Window_rebuild(ldata); return; } /* First decide if this window should be displayed at all. */ d = 1; if (wdata->order == WLIST_NUM || wdata->order == WLIST_MRU) { if (p->w_group != wdata->group) { if (!wdata->nested) d = 0; else d = window_ancestor(wdata->group, p); } } if (!d) { if (gl_Window_remove(ldata, p)) glist_display_all(ldata); return; } /* OK, so we keep the window in the list. Update the ordering. * First, find the row where this window should go to. Then, either create * a new row for that window, or move the existing row for the window to the * correct place. */ before = NULL; if (wdata->order == WLIST_MRU) { if (mru_window != p) for (before = mru_window; before; before = before->w_prev_mru) if (before->w_prev_mru == p) break; } else if (wdata->order == WLIST_NUM) { if (first_window != p) for (before = first_window; before; before = before->w_next) if (before->w_next== p) break; } /* Now, find the row belonging to 'before' */ if (before) rbefore = gl_Window_findrow(ldata, before); else if (wdata->nested && p->w_group) /* There's no 'before'. So find the group window */ rbefore = gl_Window_findrow(ldata, p->w_group); else rbefore = NULL; /* For now, just remove the row containing 'p' if it is not already in the right place . */ row = gl_Window_findrow(ldata, p); if (row) { if (row->prev != rbefore) { sel = ldata->selected->data == p; gl_Window_remove(ldata, p); } else p = NULL; /* the window is in the correct place */ } if (p) { row = glist_add_row(ldata, p, rbefore); if (sel) ldata->selected = row; } glist_display_all(ldata); } void WListUpdatecv(Canvas *cv, Window *p) { ListData *ldata; if (cv->c_layer->l_layfn != &ListLf) return; ldata = cv->c_layer->l_data; if (ldata->name != ListID) return; CV_CALL(cv, WListUpdate(p, ldata)); } void WListLinkChanged(void) { Display *olddisplay = display; Canvas *cv; ListData *ldata; struct gl_Window_Data *wdata; for (display = displays; display; display = display->d_next) for (cv = D_cvlist; cv; cv = cv->c_next) { if (!cv->c_layer || cv->c_layer->l_layfn != &ListLf) continue; ldata = cv->c_layer->l_data; if (ldata->name != ListID) continue; wdata = ldata->data; if (!(wdata->order & WLIST_MRU)) continue; CV_CALL(cv, WListUpdate(NULL, ldata)); } display = olddisplay; } screen-5.0.2/list_license.c0000664000175000017500000001352515224432722014275 0ustar alexalex/* Copyright (c) 2010 * Juergen Weigert (jnweiger@immd4.informatik.uni-erlangen.de) * Sadrul Habib Chowdhury (sadrul@users.sourceforge.net) * Copyright (c) 2008, 2009 * Juergen Weigert (jnweiger@immd4.informatik.uni-erlangen.de) * Michael Schroeder (mlschroe@immd4.informatik.uni-erlangen.de) * Micah Cowan (micah@cowan.name) * Sadrul Habib Chowdhury (sadrul@users.sourceforge.net) * Copyright (c) 1993-2002, 2003, 2005, 2006, 2007 * Juergen Weigert (jnweiger@immd4.informatik.uni-erlangen.de) * Michael Schroeder (mlschroe@immd4.informatik.uni-erlangen.de) * Copyright (c) 1987 Oliver Laumann * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3, or (at your option) * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program (see the file COPYING); if not, see * https://www.gnu.org/licenses/, or contact Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02111-1301 USA * **************************************************************** */ /* Deals with showing license */ #include "config.h" #include "list_generic.h" #include #include #include "screen.h" #include "help.h" #include "misc.h" static char ListID[] = "license"; static char license[] = { "Copyright (c) 2025-2026 Alexander Naumov\n" "Copyright (c) 2018-2024 Alexander Naumov, Amadeusz Slawinski\n" "Copyright (c) 2015-2017 Juergen Weigert, Alexander Naumov, Amadeusz Slawinski\n" "Copyright (c) 2010-2014 Juergen Weigert, Sadrul Habib Chowdhury\n" "Copyright (c) 2008-2009 Juergen Weigert, Michael Schroeder, Micah Cowan, Sadrul Habib Chowdhury\n" "Copyright (c) 1993-2007 Juergen Weigert, Michael Schroeder\n" "Copyright (c) 1987 Oliver Laumann\n" "\n" "This program is free software; you can redistribute it and/or modify it under \ the terms of the GNU General Public License as published by the Free \ Software Foundation; either version 3, or (at your option) any later \ version.\n" "\n" "This program is distributed in the hope that it will be useful, but WITHOUT \ ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or \ FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for \ more details.\n" "\n" "You should have received a copy of the GNU General Public License along with \ this program (see the file COPYING); if not, see \ https://www.gnu.org/licenses/, or contact Free Software Foundation, Inc., 51 \ Franklin Street, Fifth Floor, Boston, MA 02111-1301 USA.\n" "\n" "Send bugreports, fixes, enhancements, t-shirts, money, beer & pizza to" " screen-devel@gnu.org\n" }; static int gl_License_header(ListData *ldata) { (void)ldata; /* unused */ char str_version[75]; /* 75 is strlen("Screen version ") + sizeof(version[60]); */ snprintf(str_version, 75, "Screen version %s", version); centerline(str_version, 0); return 1; } static int gl_License_footer(ListData *ldata) { (void)ldata; /* unused */ centerline("[Press Space for next page or Return to end.]", flayer->l_height - 1); return 1; } static int gl_License_row(ListData *ldata, ListRow *lrow) { (void)ldata; /* unused */ char *line = calloc(flayer->l_width + 1, sizeof(char)); char *start = (char *)lrow->data; char *lastspace = start; size_t linelen = 0; for (char *c = start; (*c != 0) && (*c != '\n'); c++) { linelen++; if (*c == ' ') lastspace = c; if (linelen >= (size_t)flayer->l_width) { linelen = lastspace - start; break; } } strncpy(line, start, linelen); leftline(line, lrow->y, NULL); free(line); return 1; } static int gl_License_rebuild(ListData *ldata) { /* recreate the rows */ ListRow *row = NULL; size_t linelen = 0; char *lastspace = NULL; if (flayer->l_width < 40 || flayer->l_height < 5) return -1; for (char *c = license; *c != 0; c++) { if (linelen == 0) row = glist_add_row(ldata, c, row); if (*c == '\n') { linelen = 0; lastspace = NULL; continue; } if (*c == ' ') { lastspace = c; } linelen++; if (linelen >= (size_t)flayer->l_width) { if (lastspace) { c = lastspace; lastspace = NULL; linelen = 0; } } } glist_display_all(ldata); return 0; } static int gl_License_input(ListData *ldata, char **inp, size_t *len) { unsigned char ch; if (!ldata->selected) return 0; ch = (unsigned char)**inp; ++*inp; --*len; switch (ch) { case '\f': /* ^L to refresh */ glist_remove_rows(ldata); gl_License_rebuild(ldata); break; case '\r': case '\n': glist_abort(); *len = 0; break; default: /* We didn't actually process the input. */ --*inp; ++*len; return 0; } return 1; } static int gl_License_freerow(ListData *ldata, ListRow *row) { (void)ldata; /* unused */ (void)row; /* unused */ /* There was no allocation when row->data was set. So nothing to do here. */ return 0; } static int gl_License_free(ListData *ldata) { (void)ldata; /* unused */ /* There was no allocation in ldata->data. So nothing to do here. */ return 0; } static const GenericList gl_License = { gl_License_header, gl_License_footer, gl_License_row, gl_License_input, gl_License_freerow, gl_License_free, gl_License_rebuild, NULL /* We do not allow searching in the license page, at the moment */ }; void display_license(void) { ListData *ldata; if (flayer->l_width < 40 || flayer->l_height < 5) { LMsg(0, "Window size too small for license page"); return; } ldata = glist_display(&gl_License, ListID); if (!ldata) return; gl_License_rebuild(ldata); } screen-5.0.2/list_generic.h0000664000175000017500000000531015224432722014265 0ustar alexalex/* Copyright (c) 2010 * Juergen Weigert (jnweiger@immd4.informatik.uni-erlangen.de) * Sadrul Habib Chowdhury (sadrul@users.sourceforge.net) * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3, or (at your option) * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program (see the file COPYING); if not, see * https://www.gnu.org/licenses/, or contact Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02111-1301 USA * **************************************************************** */ #ifndef SCREEN_LIST_GENERIC_H #define SCREEN_LIST_GENERIC_H #include #include "window.h" typedef struct ListData ListData; typedef struct ListRow ListRow; typedef struct GenericList GenericList; struct ListRow { void *data; /* Some data relevant to this row */ ListRow *next, *prev; /* doubly linked list */ int y; /* -1 if not on display */ }; struct GenericList { int (*gl_printheader) (ListData *); /* Print the header */ int (*gl_printfooter) (ListData *); /* Print the footer */ int (*gl_printrow) (ListData *, ListRow *); /* Print one row */ int (*gl_pinput) (ListData *, char **inp, size_t *len); /* Process input */ int (*gl_freerow) (ListData *, ListRow *); /* Free data for a row */ int (*gl_free) (ListData *); /* Free data for the list */ int (*gl_rebuild) (ListData *); /* Rebuild display */ int (*gl_matchrow) (ListData *, ListRow *, const char *); }; struct ListData { const char *name; /* An identifier for the list */ ListRow *root; /* The first item in the list */ ListRow *selected; /* The selected row */ ListRow *top; /* The topmost visible row */ const GenericList *list_fn; /* The functions that deal with the list */ char *search; /* The search term, if any */ void *data; /* List specific data */ }; ListRow * glist_add_row (ListData *ldata, void *data, ListRow *after); void glist_remove_rows (ListData *ldata); void glist_display_all (ListData *list); ListData * glist_display (const GenericList *list, const char *name); void glist_abort (void); void display_displays (void); void display_license (void); void display_windows (int onblank, int order, Window *group); /* global variables */ extern const struct LayFuncs ListLf; #endif /* SCREEN_LIST_GENERIC_H */ screen-5.0.2/list_generic.c0000664000175000017500000002322015224432722014260 0ustar alexalex/* Copyright (c) 2010 * Juergen Weigert (jnweiger@immd4.informatik.uni-erlangen.de) * Sadrul Habib Chowdhury (sadrul@users.sourceforge.net) * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3, or (at your option) * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program (see the file COPYING); if not, see * https://www.gnu.org/licenses/, or contact Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02111-1301 USA * **************************************************************** */ #include "config.h" #include "list_generic.h" #include #include #include "misc.h" #include "input.h" /* Deals with a generic list display */ static void ListProcess(char **, size_t *); static void ListAbort(void); static void ListRedisplayLine(int, int, int, int); static void ListClearLine(int, int, int, int); static int ListResize(int, int); static void ListRestore(void); static void ListFree(void *); const struct LayFuncs ListLf = { ListProcess, ListAbort, ListRedisplayLine, ListClearLine, ListResize, ListRestore, ListFree }; /** Returns non-zero on success. */ ListData *glist_display(const GenericList *list, const char *name) { ListData *ldata; if (InitOverlayPage(sizeof(ListData), &ListLf, 0)) return NULL; ldata = flayer->l_data; ldata->name = name; /* We do not SaveStr, since the strings should be all static literals */ ldata->list_fn = list; flayer->l_mode = 1; flayer->l_x = 0; flayer->l_y = flayer->l_height - 1; return ldata; } static void glist_decide_top(ListData *ldata) { int count = flayer->l_height - 5; /* 2 for header, 1 for footer */ ListRow *top = ldata->selected; for (; count && top != ldata->root; top = top->prev, count--) ; ldata->top = top; } static ListRow *glist_search_dir(ListData *ldata, ListRow *start, int dir) { ListRow *row = (dir == 1) ? start->next : start->prev; for (; row; row = (dir == 1) ? row->next : row->prev) if (ldata->list_fn->gl_matchrow(ldata, row, ldata->search)) return row; if (dir == 1) row = ldata->root; else { /* First, go to the end */ if (!start->next) row = start; else for (row = start->next; row->next; row = row->next) ; } for (; row != start; row = (dir == 1) ? row->next : row->prev) if (ldata->list_fn->gl_matchrow(ldata, row, ldata->search)) break; return row; } static void glist_search(char *buf, size_t len, void *data) { ListData *ldata = (ListData *)data; ListRow *row; if (ldata->search) Free(ldata->search); if (len > 0) ldata->search = SaveStr(buf); else return; for (row = ldata->selected; row; row = row->next) if (ldata->list_fn->gl_matchrow(ldata, row, ldata->search)) break; if (!row) for (row = ldata->root; row != ldata->selected; row = row->next) if (ldata->list_fn->gl_matchrow(ldata, row, ldata->search)) break; if (row == ldata->selected) return; ldata->selected = row; if (ldata->selected->y == -1) glist_decide_top(ldata); glist_display_all(ldata); } static void ListProcess(char **ppbuf, size_t *plen) { ListData *ldata = flayer->l_data; int count = 0; while (*plen > 0) { ListRow *old; unsigned char ch; if (!flayer->l_mouseevent.start && ldata->list_fn->gl_pinput && ldata->list_fn->gl_pinput(ldata, ppbuf, plen)) continue; ch = **ppbuf; ++*ppbuf; --*plen; if (flayer->l_mouseevent.start) { int r = LayProcessMouse(flayer, ch); if (r == -1) { LayProcessMouseSwitch(flayer, 0); continue; } else { if (r) ch = 0222; else continue; } } if (!ldata->selected) { *plen = 0; break; } old = ldata->selected; processchar: switch (ch) { case ' ': break; case '\r': case '\n': break; case 0220: /* up */ case 16: /* ^P */ case 'k': if (!ldata->selected->prev) /* There's no where to go */ break; ldata->selected = old->prev; break; case 0216: /* down */ case 14: /* ^N like emacs */ case 'j': if (!ldata->selected->next) /* Nothing to do */ break; ldata->selected = old->next; break; case 033: /* escape */ case 007: /* ^G */ ListAbort(); *plen = 0; return; case 0201: /* home */ case 0001: /* ^A */ ldata->selected = ldata->root; break; case 0205: /* end */ case 0005: /* ^E */ while (ldata->selected->next) ldata->selected = ldata->selected->next; if (ldata->selected->y != -1) { /* Both old and current selections are on the screen. So we can just * redraw these two affected rows. */ } break; case 0004: /* ^D (half-page down) */ case 0006: /* page-down, ^F */ count = (flayer->l_height - 4) >> (ch == 0004); for (; ldata->selected->next && --count; ldata->selected = ldata->selected->next) ; break; case 0025: /* ^U (half-page up) */ case 0002: /* page-up, ^B */ count = (flayer->l_height - 4) >> (ch == 0025); for (; ldata->selected->prev && --count; ldata->selected = ldata->selected->prev) ; break; case '/': /* start searching */ if (ldata->list_fn->gl_matchrow) { char *s; Input("Search: ", 80, INP_COOKED, glist_search, (char *)ldata, 0); if ((s = ldata->search)) { for (; *s; s++) { char *ss = s; size_t n = 1; LayProcess(&ss, &n); } } } break; /* The following deal with searching. */ case 'n': /* search next */ if (ldata->list_fn->gl_matchrow && ldata->search) ldata->selected = glist_search_dir(ldata, ldata->selected, 1); break; case 'N': /* search prev */ if (ldata->list_fn->gl_matchrow && ldata->search) ldata->selected = glist_search_dir(ldata, ldata->selected, -1); break; /* Now, mouse events. */ case 0222: if (flayer->l_mouseevent.start) { int button = flayer->l_mouseevent.buffer[0]; if (button == 'a') /* Scroll down */ ch = 'j'; else if (button == '`') /* Scroll up */ ch = 'k'; else if (button == ' ') { /* Left click */ int y = flayer->l_mouseevent.buffer[2]; ListRow *r; for (r = ldata->top; r && r->y != -1 && r->y != y; r = r->next) ; if (r && r->y == y) ldata->selected = r; ch = 0; } else ch = 0; LayProcessMouseSwitch(flayer, 0); if (ch) goto processchar; } else LayProcessMouseSwitch(flayer, 1); break; } if (old == ldata->selected) /* The selection didn't change */ continue; if (ldata->selected->y == -1) { /* We need to list all the rows, since we are scrolling down. But first, * find the top of the visible list. */ glist_decide_top(ldata); glist_display_all(ldata); } else { /* just redisplay the two lines. */ ldata->list_fn->gl_printrow(ldata, old); ldata->list_fn->gl_printrow(ldata, ldata->selected); flayer->l_y = ldata->selected->y; LaySetCursor(); } } } static void ListAbort(void) { LAY_CALL_UP(LRefreshAll(flayer, 0)); ExitOverlayPage(); } static void ListFree(void *d) { ListData *ldata = d; glist_remove_rows(ldata); if (ldata->list_fn->gl_free) ldata->list_fn->gl_free(ldata); if (ldata->search) Free(ldata->search); } static void ListRedisplayLine(int y, int xs, int xe, int isblank) { ListData *ldata; ldata = flayer->l_data; if (y < 0) { glist_display_all(ldata); return; } if (!isblank) LClearArea(flayer, xs, y, xe, y, 0, 0); if (ldata->top && y < ldata->top->y) ldata->list_fn->gl_printheader(ldata); else if (y + 1 == flayer->l_height) ldata->list_fn->gl_printfooter(ldata); else { ListRow *row; for (row = ldata->top; row && row->y != -1; row = row->next) if (row->y == y) { ldata->list_fn->gl_printrow(ldata, row); break; } } } static void ListClearLine(int y, int xs, int xe, int bce) { DefClearLine(y, xs, xe, bce); } static int ListResize(int wi, int he) { ListData *ldata; ldata = flayer->l_data; flayer->l_width = wi; flayer->l_height = he; flayer->l_y = he - 1; glist_remove_rows(ldata); if (ldata->list_fn->gl_rebuild(ldata) < 0) { return -1; } return 0; } static void ListRestore(void) { DefRestore(); } ListRow *glist_add_row(ListData *ldata, void *data, ListRow *after) { ListRow *r = calloc(1, sizeof(ListRow)); r->data = data; if (after) { r->next = after->next; r->prev = after; after->next = r; if (r->next) r->next->prev = r; } else { r->next = ldata->root; if (ldata->root) ldata->root->prev = r; ldata->root = r; } return r; } void glist_remove_rows(ListData *ldata) { for (ListRow *row = ldata->root; row;) { ListRow *r = row; row = row->next; ldata->list_fn->gl_freerow(ldata, r); free(r); } ldata->root = ldata->selected = ldata->top = NULL; } void glist_display_all(ListData *list) { int y; ListRow *row; LClearAll(flayer, 0); y = list->list_fn->gl_printheader(list); if (!list->top) list->top = list->root; if (!list->selected) list->selected = list->root; for (row = list->root; row != list->top; row = row->next) row->y = -1; for (row = list->top; row; row = row->next) { row->y = y++; if (!list->list_fn->gl_printrow(list, row)) { row->y = -1; y--; } if (y + 1 == flayer->l_height) break; } for (; row; row = row->next) row->y = -1; list->list_fn->gl_printfooter(list); if (list->selected && list->selected->y != -1) flayer->l_y = list->selected->y; else flayer->l_y = flayer->l_height - 1; LaySetCursor(); } void glist_abort(void) { ListAbort(); } screen-5.0.2/list_display.c0000664000175000017500000001455115224432722014320 0ustar alexalex/* Copyright (c) 2010 * Juergen Weigert (jnweiger@immd4.informatik.uni-erlangen.de) * Sadrul Habib Chowdhury (sadrul@users.sourceforge.net) * Copyright (c) 2008, 2009 * Juergen Weigert (jnweiger@immd4.informatik.uni-erlangen.de) * Michael Schroeder (mlschroe@immd4.informatik.uni-erlangen.de) * Micah Cowan (micah@cowan.name) * Sadrul Habib Chowdhury (sadrul@users.sourceforge.net) * Copyright (c) 1993-2002, 2003, 2005, 2006, 2007 * Juergen Weigert (jnweiger@immd4.informatik.uni-erlangen.de) * Michael Schroeder (mlschroe@immd4.informatik.uni-erlangen.de) * Copyright (c) 1987 Oliver Laumann * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3, or (at your option) * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program (see the file COPYING); if not, see * https://www.gnu.org/licenses/, or contact Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02111-1301 USA * **************************************************************** */ /* Deals with the list of displays */ #include "config.h" #include "list_generic.h" #include #include #include "screen.h" #include "misc.h" static char ListID[] = "display"; /* * layout of the displays page is as follows: xterm 80x42 jnweiger@/dev/ttyp4 0(m11) &rWx facit 80x24 nb mlschroe@/dev/ttyhf 11(tcsh) rwx xterm 80x42 jnhollma@/dev/ttyp5 0(m11) &R.x | | | | | | | | ¦___ window permissions | | | | | | | | (R. is locked r-only, | | | | | | | | W has wlock) | | | | | | | |___ Window is shared | | | | | | |___ Name/Title of window | | | | | |___ Number of window | | | | |___ Name of the display (the attached device) | | | |___ Username who is logged in at the display | | |___ Display is in nonblocking mode. Shows 'NB' if obuf is full. | |___ Displays geometry as width x height. |___ the terminal type known by screen for this display. */ static int gl_Display_header(ListData *ldata) { (void)ldata; /* unused */ leftline("term-type size user interface window Perms", 0, NULL); leftline("---------- ------- ---------- ----------------- ---------- -----", 1, NULL); return 2; } static int gl_Display_footer(ListData *ldata) { (void)ldata; /* unused */ centerline("[Press ctrl-l to refresh; Return to end.]", flayer->l_height - 1); return 1; } static int gl_Display_row(ListData *ldata, ListRow *lrow) { Display *d = lrow->data; char tbuf[80]; static char *blockstates[5] = { "nb", "NB", "Z<", "Z>", "BL" }; Window *w = d->d_fore; struct mchar m_current = mchar_blank; m_current.attr = A_BD; sprintf(tbuf, " %-10.10s%4dx%-4d%10.10s@%-16.16s%s", d->d_termname, d->d_width, d->d_height, d->d_user->u_name, d->d_usertty, (d->d_blocked || d->d_nonblock >= 0) && d->d_blocked <= 4 ? blockstates[d->d_blocked] : " "); if (w) { int l = 10 - strlen(w->w_title); if (l < 0) l = 0; sprintf(tbuf + strlen(tbuf), "%3d(%.10s)%*s%c%c%c%c", w->w_number, w->w_title, l, "", /* w->w_dlist->next */ 0 ? '&' : ' ', /* * The rwx triple: * -,r,R no read, read, read only due to foreign wlock * -,.,w,W no write, write suppressed by foreign wlock, * write, own wlock * -,x no execute, execute */ (AclCheckPermWin(d->d_user, ACL_READ, w) ? '-' : ((w->w_wlock == WLOCK_OFF || d->d_user == w->w_wlockuser) ? 'r' : 'R')), (AclCheckPermWin(d->d_user, ACL_READ, w) ? '-' : ((w->w_wlock == WLOCK_OFF) ? 'w' : ((d->d_user == w->w_wlockuser) ? 'W' : 'v'))), (AclCheckPermWin(d->d_user, ACL_READ, w) ? '-' : 'x') ); } leftline(tbuf, lrow->y, lrow == ldata->selected ? &mchar_so : d == display ? &m_current : NULL); return 1; } static int gl_Display_rebuild(ListData *ldata) { /* recreate the rows */ Display *d; ListRow *row = NULL; if (flayer->l_width < 10 || flayer->l_height < 5) return -1; for (d = displays; d; d = d->d_next) { row = glist_add_row(ldata, d, row); if (d == display) ldata->selected = row; } glist_display_all(ldata); return 0; } static int gl_Display_input(ListData *ldata, char **inp, size_t *len) { Display *cd = display; unsigned char ch; if (!ldata->selected) return 0; ch = (unsigned char)**inp; ++*inp; --*len; switch (ch) { case '\f': /* ^L to refresh */ glist_remove_rows(ldata); gl_Display_rebuild(ldata); break; case '\r': case '\n': glist_abort(); *len = 0; break; case 'd': /* Detach */ case 'D': /* Power detach */ display = ldata->selected->data; if (display == cd) /* We do not allow detaching the current display */ break; Detach(ch == 'D' ? D_REMOTE_POWER : D_REMOTE); display = cd; glist_remove_rows(ldata); gl_Display_rebuild(ldata); break; default: /* We didn't actually process the input. */ --*inp; ++*len; return 0; } return 1; } static int gl_Display_freerow(ListData *ldata, ListRow *row) { (void)ldata; /* unused */ (void)row; /* unused */ /* There was no allocation when row->data was set. So nothing to do here. */ return 0; } static int gl_Display_free(ListData *ldata) { (void)ldata; /* unused */ /* There was no allocation in ldata->data. So nothing to do here. */ return 0; } static const GenericList gl_Display = { gl_Display_header, gl_Display_footer, gl_Display_row, gl_Display_input, gl_Display_freerow, gl_Display_free, gl_Display_rebuild, NULL /* We do not allow searching in the display list, at the moment */ }; void display_displays(void) { ListData *ldata; if (flayer->l_width < 10 || flayer->l_height < 5) { LMsg(0, "Window size too small for displays page"); return; } ldata = glist_display(&gl_Display, ListID); if (!ldata) return; gl_Display_rebuild(ldata); } screen-5.0.2/layout.h0000664000175000017500000000441415224432722013137 0ustar alexalex/* Copyright (c) 2008, 2009 * Juergen Weigert (jnweiger@immd4.informatik.uni-erlangen.de) * Michael Schroeder (mlschroe@immd4.informatik.uni-erlangen.de) * Micah Cowan (micah@cowan.name) * Sadrul Habib Chowdhury (sadrul@users.sourceforge.net) * Copyright (c) 1993-2002, 2003, 2005, 2006, 2007 * Juergen Weigert (jnweiger@immd4.informatik.uni-erlangen.de) * Michael Schroeder (mlschroe@immd4.informatik.uni-erlangen.de) * Copyright (c) 1987 Oliver Laumann * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3, or (at your option) * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program (see the file COPYING); if not, see * https://www.gnu.org/licenses/, or contact Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02111-1301 USA * **************************************************************** * $Id$ GNU */ #ifndef SCREEN_LAYOUT_H #define SCREEN_LAYOUT_H #include "canvas.h" #define MAXLAY 10 typedef struct Layout Layout; struct Layout { Layout *lay_next; char *lay_title; int lay_number; Canvas lay_canvas; Canvas *lay_forecv; Canvas *lay_cvlist; int lay_autosave; }; void FreeLayoutCv(Canvas *c); Layout *CreateLayout(char *, int); void AutosaveLayout (Layout *); void LoadLayout (Layout *); void NewLayout (char *, int); void SaveLayout (char *, Canvas *); void ShowLayouts (int); Layout *FindLayout (char *); void UpdateLayoutCanvas (Canvas *, Window *); Layout *CreateLayout (char *, int); void RemoveLayout (Layout *); int LayoutDumpCanvas (Canvas *, char *); void RenameLayout (Layout *, const char *); int RenumberLayout (Layout *, int); /* global variables */ extern Layout *layout_attach, *layout_last, layout_last_marker; extern Layout *layouts; #endif /* SCREEN_LAYOUT_H */ screen-5.0.2/layout.c0000664000175000017500000001672615224432722013143 0ustar alexalex/* Copyright (c) 2008, 2009 * Juergen Weigert (jnweiger@immd4.informatik.uni-erlangen.de) * Michael Schroeder (mlschroe@immd4.informatik.uni-erlangen.de) * Micah Cowan (micah@cowan.name) * Sadrul Habib Chowdhury (sadrul@users.sourceforge.net) * Copyright (c) 1993-2002, 2003, 2005, 2006, 2007 * Juergen Weigert (jnweiger@immd4.informatik.uni-erlangen.de) * Michael Schroeder (mlschroe@immd4.informatik.uni-erlangen.de) * Copyright (c) 1987 Oliver Laumann * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3, or (at your option) * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program (see the file COPYING); if not, see * https://www.gnu.org/licenses/, or contact Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02111-1301 USA * **************************************************************** */ #include "config.h" #include "layout.h" #include #include #include "screen.h" #include "fileio.h" #include "misc.h" #include "process.h" #include "resize.h" Layout *layouts; Layout *laytab[MAXLAY]; Layout *layout_last, layout_last_marker; Layout *layout_attach = &layout_last_marker; void FreeLayoutCv(Canvas *cv) { Canvas *cnext, *c = cv; for (; cv; cv = cnext) { if (cv->c_slperp) { FreeLayoutCv(cv->c_slperp); free(cv->c_slperp); cv->c_slperp = NULL; } cnext = cv->c_slnext; cv->c_slnext = NULL; if (cv != c) free(cv); } } Layout *CreateLayout(char *title, int startat) { Layout *lay, **pl; int i; if (startat >= MAXLAY || startat < 0) startat = 0; for (i = startat;;) { if (!laytab[i]) break; if (++i == MAXLAY) i = 0; if (i == startat) { Msg(0, "No more layouts\n"); return NULL; } } lay = calloc(1, sizeof(Layout)); lay->lay_title = SaveStr(title); lay->lay_autosave = 1; lay->lay_number = i; laytab[i] = lay; lay->lay_next = NULL; pl = &layouts; while (*pl) pl = &(*pl)->lay_next; *pl = lay; return lay; } void SaveLayout(char *name, Canvas *cv) { Layout *lay; Canvas *fcv; for (lay = layouts; lay; lay = lay->lay_next) if (!strcmp(lay->lay_title, name)) break; if (lay) FreeLayoutCv(&lay->lay_canvas); else lay = CreateLayout(name, 0); if (!lay) return; fcv = D_forecv; DupLayoutCv(cv, &lay->lay_canvas, true); lay->lay_forecv = D_forecv; D_forecv = fcv; D_layout = lay; } void AutosaveLayout(Layout *lay) { Canvas *fcv; if (!lay || !lay->lay_autosave) return; FreeLayoutCv(&lay->lay_canvas); fcv = D_forecv; DupLayoutCv(&D_canvas, &lay->lay_canvas, true); lay->lay_forecv = D_forecv; D_forecv = fcv; } Layout *FindLayout(char *name) { Layout *lay; char *s; int i; for (i = 0, s = name; *s >= '0' && *s <= '9'; s++) i = i * 10 + (*s - '0'); if (!*s && s != name && i >= 0 && i < MAXLAY) return laytab[i]; for (lay = layouts; lay; lay = lay->lay_next) if (!strcmp(lay->lay_title, name)) break; return lay; } void LoadLayout(Layout *lay) { if (!display) return; AutosaveLayout(D_layout); if (!lay) { while (D_canvas.c_slperp) FreeCanvas(D_canvas.c_slperp); MakeDefaultCanvas(); SetCanvasWindow(D_forecv, NULL); D_layout = NULL; return; } while (D_canvas.c_slperp) FreeCanvas(D_canvas.c_slperp); D_cvlist = NULL; D_forecv = lay->lay_forecv; if (!D_forecv) MakeDefaultCanvas(); DupLayoutCv(&lay->lay_canvas, &D_canvas, false); D_canvas.c_ys = (D_has_hstatus == HSTATUS_FIRSTLINE); D_canvas.c_ye = D_height - 1 - ((D_canvas.c_slperp && D_canvas.c_slperp->c_slnext) || captionalways) - (D_has_hstatus == HSTATUS_LASTLINE); ResizeCanvas(&D_canvas); RecreateCanvasChain(); RethinkDisplayViewports(); PutWindowCv(&D_canvas); ResizeLayersToCanvases(); D_layout = lay; } void NewLayout(char *title, int startat) { Layout *lay; Canvas *fcv; lay = CreateLayout(title, startat); if (!lay) return; if (display) { LoadLayout(NULL); fcv = D_forecv; DupLayoutCv(&D_canvas, &lay->lay_canvas, true); lay->lay_forecv = D_forecv; D_forecv = fcv; D_layout = lay; } else { layout_attach = lay; } lay->lay_autosave = 1; } static char *AddLayoutsInfo(char *buf, int len, int where) { char *s, *ss, *t; Layout *p, **pp; int l; s = ss = buf; for (pp = laytab; pp < laytab + MAXLAY; pp++) { if (pp - laytab == where && ss == buf) ss = s; if ((p = *pp) == NULL) continue; t = p->lay_title; l = strlen(t); if (l > 20) l = 20; if (s - buf + l > len - 24) break; if (s > buf) { *s++ = ' '; *s++ = ' '; } sprintf(s, "%d", p->lay_number); if (p->lay_number == where) ss = s; s += strlen(s); if (display && p == D_layout) *s++ = '*'; *s++ = ' '; strncpy(s, t, l); s += l; } *s = 0; return ss; } void ShowLayouts(int where) { char buf[1024]; char *s, *ss; if (!display) return; if (!layouts) { Msg(0, "No layouts defined\n"); return; } if (where == -1 && D_layout) where = D_layout->lay_number; ss = AddLayoutsInfo(buf, ARRAY_SIZE(buf), where); s = buf + strlen(buf); if (ss - buf > D_width / 2) { ss -= D_width / 2; if (s - ss < D_width) { ss = s - D_width; if (ss < buf) ss = buf; } } else ss = buf; Msg(0, "%s", ss); } void RemoveLayout(Layout *lay) { Layout **layp = &layouts; for (; *layp; layp = &(*layp)->lay_next) { if (*layp == lay) { *layp = lay->lay_next; break; } } laytab[lay->lay_number] = NULL; if (display && D_layout == lay) D_layout = NULL; FreeLayoutCv(&lay->lay_canvas); if (lay->lay_title) free(lay->lay_title); free(lay); if (layouts) LoadLayout((display && D_layout) ? D_layout : *layp ? *layp : layouts); Activate(0); } void UpdateLayoutCanvas(Canvas *cv, Window *wi) { for (; cv; cv = cv->c_slnext) { if (cv->c_layer && Layer2Window(cv->c_layer) == wi) { /* A simplistic version of SetCanvasWindow(cv, 0) */ Layer *l = cv->c_layer; cv->c_layer = NULL; if (l->l_cvlist == NULL && (wi == NULL || l != wi->w_savelayer)) KillLayerChain(l); l = &cv->c_blank; l->l_data = NULL; if (l->l_cvlist != cv) { cv->c_lnext = l->l_cvlist; l->l_cvlist = cv; } cv->c_layer = l; /* Do not end here. Multiple canvases can have the same window */ } if (cv->c_slperp) UpdateLayoutCanvas(cv->c_slperp, wi); } } static void dump_canvas(Canvas *cv, FILE * file) { Canvas *c; for (c = cv->c_slperp; c && c->c_slnext; c = c->c_slnext) { fprintf(file, "split%s\n", c->c_slorient == SLICE_HORI ? " -v" : ""); } for (c = cv->c_slperp; c; c = c->c_slnext) { if (c->c_slperp) dump_canvas(c, file); else fprintf(file, "focus\n"); } } int LayoutDumpCanvas(Canvas *cv, char *filename) { FILE *file = secfopen(filename, "a"); if (!file) return 0; dump_canvas(cv, file); fclose(file); return 1; } void RenameLayout(Layout *layout, const char *name) { free(layout->lay_title); layout->lay_title = SaveStr(name); } int RenumberLayout(Layout *layout, int number) { int old; Layout *lay; old = layout->lay_number; if (number < 0 || number >= MAXLAY) return 0; lay = laytab[number]; laytab[number] = layout; layout->lay_number = number; laytab[old] = lay; if (lay) lay->lay_number = old; return 1; } screen-5.0.2/layer.h0000664000175000017500000001415515224432722012741 0ustar alexalex/* Copyright (c) 2008, 2009 * Juergen Weigert (jnweiger@immd4.informatik.uni-erlangen.de) * Michael Schroeder (mlschroe@immd4.informatik.uni-erlangen.de) * Micah Cowan (micah@cowan.name) * Sadrul Habib Chowdhury (sadrul@users.sourceforge.net) * Copyright (c) 1993-2002, 2003, 2005, 2006, 2007 * Juergen Weigert (jnweiger@immd4.informatik.uni-erlangen.de) * Michael Schroeder (mlschroe@immd4.informatik.uni-erlangen.de) * Copyright (c) 1987 Oliver Laumann * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3, or (at your option) * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program (see the file COPYING); if not, see * https://www.gnu.org/licenses/, or contact Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02111-1301 USA * **************************************************************** * $Id$ GNU */ #ifndef SCREEN_LAYER_H #define SCREEN_LAYER_H #include #include /* * This is the overlay structure. It is used to create a separate * layer over the current windows. */ /* forward declarations */ struct mchar; struct mline; typedef struct Canvas Canvas; struct LayFuncs { void (*lf_LayProcess) (char **, size_t *); void (*lf_LayAbort) (void); void (*lf_LayRedisplayLine) (int, int, int, int); void (*lf_LayClearLine) (int, int, int, int); int (*lf_LayResize) (int, int); void (*lf_LayRestore) (void); void (*lf_LayFree) (void *); /* Should only free any data kept in flayer->l_data (but not flayer->l_data itself). */ }; typedef struct Layer Layer; struct Layer { Canvas *l_cvlist; /* list of canvases displaying layer */ int l_width; int l_height; int l_x; /* cursor position */ int l_y; int l_encoding; const struct LayFuncs *l_layfn; void *l_data; Layer *l_next; /* layer stack, should be in data? */ Layer *l_bottom; /* bottom element of layer stack */ int l_blocking; int l_mode; /* non-zero == edit mode */ struct { unsigned char buffer[3]; /* [0]: the button [1]: x [2]: y */ size_t len; bool start; } l_mouseevent; struct { bool d; /* Is the output for the layer blocked? */ /* After unpausing, what region should we refresh? */ int *left, *right; int top, bottom; int lines; } l_pause; }; #define LayProcess (*flayer->l_layfn->lf_LayProcess) #define LayAbort (*flayer->l_layfn->lf_LayAbort) #define LayRedisplayLine (*flayer->l_layfn->lf_LayRedisplayLine) #define LayClearLine (*flayer->l_layfn->lf_LayClearLine) #define LayResize (*flayer->l_layfn->lf_LayResize) #define LayRestore (*flayer->l_layfn->lf_LayRestore) #define LayFree (*flayer->l_layfn->lf_LayFree) #define LaySetCursor() LGotoPos(flayer, flayer->l_x, flayer->l_y) #define LayCanResize(l) (l->l_layfn->LayResize != DefResize) /* XXX: AArgh! think again! */ #define LAY_CALL_UP(fn) do \ { \ Layer *oldlay = flayer; \ Canvas *oldcvlist, *cv; \ flayer = flayer->l_next; \ oldcvlist = flayer->l_cvlist; \ flayer->l_cvlist = oldlay->l_cvlist; \ for (cv = flayer->l_cvlist; cv; cv = cv->c_lnext) \ cv->c_layer = flayer; \ fn; \ flayer = oldlay; \ for (cv = flayer->l_cvlist; cv; cv = cv->c_lnext) \ cv->c_layer = flayer; \ flayer->l_next->l_cvlist = oldcvlist; \ } while(0) #define LAY_DISPLAYS(l, fn) do \ { \ Display *olddisplay = display; \ Canvas *cv; \ for (display = displays; display; display = display->d_next) \ { \ for (cv = D_cvlist; cv; cv = cv->c_next) \ if (cv->c_layer == l) \ break; \ if (cv == NULL) \ continue; \ fn; \ } \ display = olddisplay; \ } while(0) /** * (Un)Pauses a layer. * * @param layer The layer that should be (un)paused. * @param pause Should we pause the layer? */ void LayPause (Layer *layer, bool pause); /** * Update the region to refresh after a layer is unpaused. * * @param layer The layer. * @param xs The left-end of the region. * @param xe The right-end of the region. * @param ys The top-end of the region. * @param ye The bottom-end of the region. */ void LayPauseUpdateRegion (Layer *layer, int xs, int xe, int ys, int ye); /** * Free any internal memory for the layer. * * @param layer The layer. */ void LayerCleanupMemory (Layer *layer); void LGotoPos (Layer *, int, int); void LPutChar (Layer *, struct mchar *, int, int); void LInsChar (Layer *, struct mchar *, int, int, struct mline *); void LPutStr (Layer *, char *, int, struct mchar *, int, int); void LPutWinMsg (Layer *, char *, int, struct mchar *, int, int); void LScrollH (Layer *, int, int, int, int, int, struct mline *); void LScrollV (Layer *, int, int, int, int); void LClearAll (Layer *, int); void LClearArea (Layer *, int, int, int, int, int, int); void LClearLine (Layer *, int, int, int, int, struct mline *); void LRefreshAll (Layer *, int); void LCDisplayLine (Layer *, struct mline *, int, int, int, int); void LCDisplayLineWrap (Layer *, struct mline *, int, int, int, int); void LSetRendition (Layer *, struct mchar *); void LWrapChar (Layer *, struct mchar *, int, int, int, bool); void LCursorVisibility (Layer *, int); void LSetFlow (Layer *, bool); void LKeypadMode (Layer *, int); void LCursorkeysMode (Layer *, int); void LMouseMode (Layer *, int); void LExtMouseMode (Layer *, int); void LBracketedPasteMode (Layer *, bool); void LCursorStyle (Layer *, int); void LMsg (int, const char *, ...) __attribute__((format(printf, 2, 3))); void KillLayerChain (Layer *); int InitOverlayPage (int, const struct LayFuncs *, int); void ExitOverlayPage (void); int LayProcessMouse (Layer *, unsigned char); void LayProcessMouseSwitch (Layer *, bool); #endif /* SCREEN_LAYER_H */ screen-5.0.2/layer.c0000664000175000017500000006147415224432722012742 0ustar alexalex/* Copyright (c) 2008, 2009 * Juergen Weigert (jnweiger@immd4.informatik.uni-erlangen.de) * Michael Schroeder (mlschroe@immd4.informatik.uni-erlangen.de) * Micah Cowan (micah@cowan.name) * Sadrul Habib Chowdhury (sadrul@users.sourceforge.net) * Copyright (c) 1993-2002, 2003, 2005, 2006, 2007 * Juergen Weigert (jnweiger@immd4.informatik.uni-erlangen.de) * Michael Schroeder (mlschroe@immd4.informatik.uni-erlangen.de) * Copyright (c) 1987 Oliver Laumann * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3, or (at your option) * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program (see the file COPYING); if not, see * https://www.gnu.org/licenses/, or contact Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02111-1301 USA * **************************************************************** */ #include "config.h" #include "layer.h" #include "screen.h" #include "encoding.h" #include "mark.h" #include "misc.h" #include "tty.h" /* * Layer subsystem. * * ...here is all the clipping code... beware! * * XXX: add some speedup code! * */ static struct mline *mlineoffset(const struct mline *ml, const int offset) { static struct mline mml; if (ml == NULL) return NULL; mml.image = ml->image + offset; mml.attr = ml->attr + offset; mml.font = ml->font + offset; mml.colorbg = ml->colorbg + offset; mml.colorfg = ml->colorfg + offset; return &mml; } #define RECODE_MCHAR(mc) ((l->l_encoding == UTF8) != (D_encoding == UTF8) ? recode_mchar(mc, l->l_encoding, D_encoding) : (mc)) #define RECODE_MLINE(ml) ((l->l_encoding == UTF8) != (D_encoding == UTF8) ? recode_mline(ml, l->l_width, l->l_encoding, D_encoding) : (ml)) void LGotoPos(Layer *l, int x, int y) { int x2, y2; if (l->l_pause.d) LayPauseUpdateRegion(l, x, x, y, y); for (Canvas *cv = l->l_cvlist; cv; cv = cv->c_lnext) { if (l->l_pause.d && cv->c_slorient) continue; display = cv->c_display; if (D_blocked) continue; if (cv != D_forecv) continue; x2 = x + cv->c_xoff; y2 = y + cv->c_yoff; if (x2 < cv->c_xs) x2 = cv->c_xs; if (y2 < cv->c_ys) y2 = cv->c_ys; if (x2 > cv->c_xe) x2 = cv->c_xe; if (y2 > cv->c_ye) y2 = cv->c_ye; for (Viewport *vp = cv->c_vplist; vp; vp = vp->v_next) { if (x2 < vp->v_xs || x2 > vp->v_xe) continue; if (y2 < vp->v_ys || y2 > vp->v_ye) continue; GotoPos(x2, y2); break; } } } void LScrollH(Layer *l, int n, int y, int xs, int xe, int bce, struct mline *ol) { int y2, xs2, xe2; if (n == 0) return; if (l->l_pause.d) LayPauseUpdateRegion(l, xs, xe, y, y); for (Canvas *cv = l->l_cvlist; cv; cv = cv->c_lnext) { if (l->l_pause.d && cv->c_slorient) continue; for (Viewport *vp = cv->c_vplist; vp; vp = vp->v_next) { y2 = y + vp->v_yoff; if (y2 < vp->v_ys || y2 > vp->v_ye) continue; xs2 = xs + vp->v_xoff; xe2 = xe + vp->v_xoff; if (xs2 < vp->v_xs) xs2 = vp->v_xs; if (xe2 > vp->v_xe) xe2 = vp->v_xe; if (xs2 > xe2) continue; display = cv->c_display; if (D_blocked) continue; ScrollH(y2, xs2, xe2, n, bce, ol ? mlineoffset(ol, -vp->v_xoff) : NULL); if (xe2 - xs2 == xe - xs) continue; if (n > 0) { xs2 = xe2 + 1 - n; xe2 = xe + vp->v_xoff - n; } else { xe2 = xs2 - 1 - n; xs2 = xs + vp->v_xoff - n; } if (xs2 < vp->v_xs) xs2 = vp->v_xs; if (xe2 > vp->v_xe) xe2 = vp->v_xe; if (xs2 <= xe2) RefreshArea(xs2, y2, xe2, y2, 1); } } } void LScrollV(Layer *l, int n, int ys, int ye, int bce) { int ys2, ye2, xs2, xe2; if (n == 0) return; if (l->l_pause.d) LayPauseUpdateRegion(l, 0, l->l_width - 1, ys, ye); for (Canvas *cv = l->l_cvlist; cv; cv = cv->c_lnext) { if (l->l_pause.d && cv->c_slorient) continue; for (Viewport *vp = cv->c_vplist; vp; vp = vp->v_next) { xs2 = vp->v_xoff; xe2 = l->l_width - 1 + vp->v_xoff; ys2 = ys + vp->v_yoff; ye2 = ye + vp->v_yoff; if (xs2 < vp->v_xs) xs2 = vp->v_xs; if (xe2 > vp->v_xe) xe2 = vp->v_xe; if (ys2 < vp->v_ys) ys2 = vp->v_ys; if (ye2 > vp->v_ye) ye2 = vp->v_ye; if (ys2 > ye2 || xs2 > xe2) continue; display = cv->c_display; if (D_blocked) continue; ScrollV(vp->v_xs, ys2, vp->v_xe, ye2, n, bce); if (ye2 - ys2 == ye - ys) continue; if (n > 0) { ys2 = ye2 + 1 - n; ye2 = ye + vp->v_yoff - n; } else { ye2 = ys2 - 1 - n; ys2 = ys + vp->v_yoff - n; } if (ys2 < vp->v_ys) ys2 = vp->v_ys; if (ye2 > vp->v_ye) ye2 = vp->v_ye; if (ys2 <= ye2) RefreshArea(xs2, ys2, xe2, ye2, 1); } } } void LInsChar(Layer *l, struct mchar *c, int x, int y, struct mline *ol) { int xs2, xe2, y2, f; struct mchar *c2, cc; struct mline *rol; if (l->l_pause.d) LayPauseUpdateRegion(l, x, l->l_width - 1, y, y); for (Canvas *cv = l->l_cvlist; cv; cv = cv->c_lnext) { if (l->l_pause.d && cv->c_slorient) continue; for (Viewport *vp = cv->c_vplist; vp; vp = vp->v_next) { y2 = y + vp->v_yoff; if (y2 < vp->v_ys || y2 > vp->v_ye) continue; xs2 = x + vp->v_xoff; xe2 = l->l_width - 1 + vp->v_xoff; c2 = c; f = 0; if (xs2 < vp->v_xs) { xs2 = vp->v_xs; c2 = &mchar_blank; if (ol) { int i; i = xs2 - vp->v_xoff - 1; if (i >= 0 && i < l->l_width) { copy_mline2mchar(&cc, ol, i); c2 = &cc; } } else f = 1; } if (xe2 > vp->v_xe) xe2 = vp->v_xe; if (xs2 > xe2) continue; display = cv->c_display; if (D_blocked) continue; rol = RECODE_MLINE(ol); InsChar(RECODE_MCHAR(c2), xs2, xe2, y2, mlineoffset(rol, -vp->v_xoff)); if (f) RefreshArea(xs2, y2, xs2, y2, 1); } } } void LPutChar(Layer *l, struct mchar *c, int x, int y) { int x2, y2; if (l->l_pause.d) LayPauseUpdateRegion(l, x, x + (c->mbcs ? 1 : 0) , y, y); for (Canvas *cv = l->l_cvlist; cv; cv = cv->c_lnext) { if (l->l_pause.d && cv->c_slorient) continue; display = cv->c_display; if (D_blocked) continue; for (Viewport *vp = cv->c_vplist; vp; vp = vp->v_next) { y2 = y + vp->v_yoff; if (y2 < vp->v_ys || y2 > vp->v_ye) continue; x2 = x + vp->v_xoff; if (x2 < vp->v_xs || x2 > vp->v_xe) continue; PutChar(RECODE_MCHAR(c), x2, y2); break; } } } void LPutStr(Layer *l, char *s, int n, struct mchar *r, int x, int y) { char *s2; int xs2, xe2, y2; if (x + n > l->l_width) n = l->l_width - x; if (l->l_pause.d) LayPauseUpdateRegion(l, x, x + n - 1, y, y); for (Canvas *cv = l->l_cvlist; cv; cv = cv->c_lnext) { if (l->l_pause.d && cv->c_slorient) continue; for (Viewport *vp = cv->c_vplist; vp; vp = vp->v_next) { y2 = y + vp->v_yoff; if (y2 < vp->v_ys || y2 > vp->v_ye) continue; xs2 = x + vp->v_xoff; xe2 = xs2 + n - 1; if (xs2 < vp->v_xs) xs2 = vp->v_xs; if (xe2 > vp->v_xe) xe2 = vp->v_xe; if (xs2 > xe2) continue; display = cv->c_display; if (D_blocked) continue; GotoPos(xs2, y2); SetRendition(r); s2 = s + xs2 - x - vp->v_xoff; if (D_encoding == UTF8 && l->l_encoding != UTF8 && (r->font || l->l_encoding)) { struct mchar mc; mc = *r; while (xs2 <= xe2) { mc.image = *s2++; PutChar(RECODE_MCHAR(&mc), xs2++, y2); } continue; } while (xs2++ <= xe2) PUTCHARLP(*s2++); } } } void LPutWinMsg(Layer *l, char *s, int n, struct mchar *r, int x, int y) { int xs2, xe2, y2, len, len2; struct mchar or; if (x + n > l->l_width) n = l->l_width - x; if (l->l_pause.d) LayPauseUpdateRegion(l, x, x + n - 1, y, y); len = strlen(s); if (len > n) len = n; for (Canvas *cv = l->l_cvlist; cv; cv = cv->c_lnext) { if (l->l_pause.d && cv->c_slorient) continue; for (Viewport *vp = cv->c_vplist; vp; vp = vp->v_next) { y2 = y + vp->v_yoff; if (y2 < vp->v_ys || y2 > vp->v_ye) continue; xs2 = x + vp->v_xoff; xe2 = xs2 + n - 1; if (xs2 < vp->v_xs) xs2 = vp->v_xs; if (xe2 > vp->v_xe) xe2 = vp->v_xe; if (xs2 > xe2) continue; display = cv->c_display; if (D_blocked) continue; GotoPos(xs2, y2); SetRendition(r); len2 = xe2 - (x + vp->v_xoff) + 1; if (len2 > len) len2 = len; PutWinMsg(s, xs2 - x - vp->v_xoff, len2); xs2 = x + vp->v_xoff + len2; if (xs2 < vp->v_xs) xs2 = vp->v_xs; or = D_rend; GotoPos(xs2, y2); SetRendition(&or); while (xs2++ <= xe2) PUTCHARLP(' '); } } } void LClearLine(Layer *l, int y, int xs, int xe, int bce, struct mline *ol) { int y2, xs2, xe2; /* check for magic margin condition */ if (xs >= l->l_width) xs = l->l_width - 1; if (xe >= l->l_width) xe = l->l_width - 1; if (l->l_pause.d) LayPauseUpdateRegion(l, xs, xe, y, y); for (Canvas *cv = l->l_cvlist; cv; cv = cv->c_lnext) { if (l->l_pause.d && cv->c_slorient) continue; for (Viewport *vp = cv->c_vplist; vp; vp = vp->v_next) { xs2 = xs + vp->v_xoff; xe2 = xe + vp->v_xoff; y2 = y + vp->v_yoff; if (y2 < vp->v_ys || y2 > vp->v_ye) continue; if (xs2 < vp->v_xs) xs2 = vp->v_xs; if (xe2 > vp->v_xe) xe2 = vp->v_xe; if (xs2 > xe2) continue; display = cv->c_display; if (D_blocked) continue; ClearLine(ol ? mlineoffset(RECODE_MLINE(ol), -vp->v_xoff) : NULL, y2, xs2, xe2, bce); } } } void LClearArea(Layer *l, int xs, int ys, int xe, int ye, int bce, int uself) { int xs2, ys2, xe2, ye2; /* Check for zero-height window */ if (ys < 0 || ye < ys) return; /* check for magic margin condition */ if (xs >= l->l_width) xs = l->l_width - 1; if (xe >= l->l_width) xe = l->l_width - 1; if (l->l_pause.d) LayPauseUpdateRegion(l, xs, xe, ys, ye); for (Canvas *cv = l->l_cvlist; cv; cv = cv->c_lnext) { if (l->l_pause.d && cv->c_slorient) continue; display = cv->c_display; if (D_blocked) continue; for (Viewport *vp = cv->c_vplist; vp; vp = vp->v_next) { xs2 = xs + vp->v_xoff; xe2 = xe + vp->v_xoff; ys2 = ys + vp->v_yoff; ye2 = ye + vp->v_yoff; if (xs2 < vp->v_xs) xs2 = vp->v_xs; if (xe2 > vp->v_xe) xe2 = vp->v_xe; if (xs2 > vp->v_xe) ys2++; if (xe2 < vp->v_xs) ye2--; if (ys2 < vp->v_ys) ys2 = vp->v_ys; if (ye2 > vp->v_ye) ye2 = vp->v_ye; if (ys2 > ye2) continue; if (xs == 0 || ys2 != ys + vp->v_yoff) xs2 = vp->v_xs; if (xe == l->l_width - 1 || ye2 != ye + vp->v_yoff) xe2 = vp->v_xe; display = cv->c_display; ClearArea(xs2, ys2, vp->v_xs, vp->v_xe, xe2, ye2, bce, uself); if (xe == l->l_width - 1 && xe2 > vp->v_xoff + xe) { SetRendition(&mchar_blank); for (int y = ys2; y <= ye2; y++) { GotoPos(xe + vp->v_xoff + 1, y); PUTCHARLP('|'); } } } } } void LCDisplayLine(Layer *l, struct mline *ml, int y, int xs, int xe, int isblank) { int xs2, xe2, y2; if (l->l_pause.d) LayPauseUpdateRegion(l, xs, xe, y, y); for (Canvas *cv = l->l_cvlist; cv; cv = cv->c_lnext) { if (l->l_pause.d && cv->c_slorient) continue; display = cv->c_display; if (D_blocked) continue; for (Viewport *vp = cv->c_vplist; vp; vp = vp->v_next) { xs2 = xs + vp->v_xoff; xe2 = xe + vp->v_xoff; y2 = y + vp->v_yoff; if (y2 < vp->v_ys || y2 > vp->v_ye) continue; if (xs2 < vp->v_xs) xs2 = vp->v_xs; if (xe2 > vp->v_xe) xe2 = vp->v_xe; if (xs2 > xe2) continue; display = cv->c_display; DisplayLine(isblank ? &mline_blank : &mline_null, mlineoffset(RECODE_MLINE(ml), -vp->v_xoff), y2, xs2, xe2); } } } void LCDisplayLineWrap(Layer *l, struct mline *ml, int y, int from, int to, int isblank) { struct mchar nc; copy_mline2mchar(&nc, ml, 0); if (dw_left(ml, 0, l->l_encoding)) { nc.mbcs = ml->image[1]; from++; } LWrapChar(l, &nc, y - 1, -1, -1, false); from++; if (from <= to) LCDisplayLine(l, ml, y, from, to, isblank); } void LSetRendition(Layer *l, struct mchar *r) { for (Canvas *cv = l->l_cvlist; cv; cv = cv->c_lnext) { display = cv->c_display; if (D_blocked) continue; SetRendition(r); } } void LWrapChar(Layer *l, struct mchar *c, int y, int top, int bot, bool ins) { Canvas *cvlist, *cvlnext; Viewport *vp, *evp, **vpp; int yy, y2, yy2, top2, bot2; int bce; if (l->l_pause.d) /* XXX: 'y'? */ LayPauseUpdateRegion(l, 0, l->l_width - 1, top, bot); bce = c->colorbg; if (y != bot) { /* simple case: no scrolling */ /* cursor after wrapping */ yy = y == l->l_height - 1 ? y : y + 1; for (Canvas *cv = l->l_cvlist; cv; cv = cv->c_lnext) { if (l->l_pause.d && cv->c_slorient) continue; y2 = 0; /* gcc -Wall */ display = cv->c_display; if (D_blocked) continue; /* find the viewport of the wrapped character */ for (vp = cv->c_vplist; vp; vp = vp->v_next) { y2 = y + vp->v_yoff; yy2 = yy + vp->v_yoff; if (yy2 >= vp->v_ys && yy2 <= vp->v_ye && vp->v_xoff >= vp->v_xs && vp->v_xoff <= vp->v_xe) break; } if (vp == NULL) continue; /* nothing to do, character not visible */ /* find the viewport of the character at the end of the line */ for (evp = cv->c_vplist; evp; evp = evp->v_next) if (y2 >= evp->v_ys && y2 <= evp->v_ye && evp->v_xoff + l->l_width - 1 >= evp->v_xs && evp->v_xoff + l->l_width - 1 <= evp->v_xe) break; /* gotcha! */ if (evp == NULL || (ins && vp->v_xoff + l->l_width - 1 > vp->v_ye)) { /* no wrapping possible */ cvlist = l->l_cvlist; cvlnext = cv->c_lnext; l->l_cvlist = cv; cv->c_lnext = NULL; if (ins) LInsChar(l, c, 0, yy, NULL); else LPutChar(l, c, 0, yy); l->l_cvlist = cvlist; cv->c_lnext = cvlnext; } else { WrapChar(RECODE_MCHAR(c), vp->v_xoff + l->l_width, y2, vp->v_xoff, -1, vp->v_xoff + l->l_width - 1, -1, ins); } } } else { /* hard case: scroll up */ for (Canvas *cv = l->l_cvlist; cv; cv = cv->c_lnext) { if (l->l_pause.d && cv->c_slorient) continue; display = cv->c_display; if (D_blocked) continue; /* search for wrap viewport */ for (vpp = &cv->c_vplist; (vp = *vpp); vpp = &vp->v_next) { yy2 = bot + vp->v_yoff; if (yy2 >= vp->v_ys && yy2 <= vp->v_ye && vp->v_xoff >= vp->v_xs && vp->v_xoff + l->l_width - 1 <= vp->v_xe) break; } if (vp) { /* great, can use Wrap on the vp */ /* temporarily remove vp from cvlist */ *vpp = vp->v_next; } if (cv->c_vplist) { /* scroll all viewports != vp */ cvlist = l->l_cvlist; cvlnext = cv->c_lnext; l->l_cvlist = cv; cv->c_lnext = NULL; LScrollV(l, 1, top, bot, bce); if (!vp) { if (ins) LInsChar(l, c, 0, bot, NULL); else LPutChar(l, c, 0, bot); } l->l_cvlist = cvlist; cv->c_lnext = cvlnext; } if (vp) { /* add vp back to cvlist */ *vpp = vp; top2 = top + vp->v_yoff; bot2 = bot + vp->v_yoff; if (top2 < vp->v_ys) top2 = vp->v_ys; WrapChar(RECODE_MCHAR(c), vp->v_xoff + l->l_width, bot2, vp->v_xoff, top2, vp->v_xoff + l->l_width - 1, bot2, ins); } } } } void LCursorVisibility(Layer *l, int vis) { for (Canvas *cv = l->l_cvlist; cv; cv = cv->c_lnext) { display = cv->c_display; if (D_blocked) continue; if (cv != D_forecv) continue; CursorVisibility(vis); } } void LSetFlow(Layer *l, bool flow) { for (Canvas *cv = l->l_cvlist; cv; cv = cv->c_lnext) { display = cv->c_display; if (cv != D_forecv) continue; SetFlow(flow); } } void LKeypadMode(Layer *l, int on) { for (Canvas *cv = l->l_cvlist; cv; cv = cv->c_lnext) { display = cv->c_display; if (D_blocked) continue; if (cv != D_forecv) continue; KeypadMode(on); } } void LCursorkeysMode(Layer *l, int on) { for (Canvas *cv = l->l_cvlist; cv; cv = cv->c_lnext) { display = cv->c_display; if (D_blocked) continue; if (cv != D_forecv) continue; CursorkeysMode(on); } } void LMouseMode(Layer *l, int on) { for (Canvas *cv = l->l_cvlist; cv; cv = cv->c_lnext) { display = cv->c_display; if (D_blocked) continue; if (cv != D_forecv) continue; MouseMode(on); } } void LExtMouseMode(Layer *l, int on) { for (Canvas *cv = l->l_cvlist; cv; cv = cv->c_lnext) { display = cv->c_display; if (D_blocked) continue; if (cv != D_forecv) continue; ExtMouseMode(on); } } void LBracketedPasteMode(Layer *l, bool on) { for (Canvas *cv = l->l_cvlist; cv; cv = cv->c_lnext) { display = cv->c_display; if (D_blocked) continue; if (cv != D_forecv) continue; BracketedPasteMode(on); } } void LCursorStyle(Layer *l, int style) { for (Canvas *cv = l->l_cvlist; cv; cv = cv->c_lnext) { display = cv->c_display; if (D_blocked) continue; if (cv != D_forecv) continue; CursorStyle(style); } } void LClearAll(Layer *l, int uself) { LClearArea(l, 0, 0, l->l_width - 1, l->l_height - 1, 0, uself); } void LRefreshAll(Layer *l, int isblank) { Layer *oldflayer; oldflayer = flayer; flayer = l; if (!isblank) LClearArea(l, 0, 0, l->l_width - 1, l->l_height - 1, 0, 0); /* signal full refresh */ LayRedisplayLine(-1, -1, -1, 1); for (int y = 0; y < l->l_height; y++) LayRedisplayLine(y, 0, l->l_width - 1, 1); flayer = oldflayer; } void LMsg(int err, const char *fmt, ...) { va_list ap; char buf[MAXPATHLEN * 2]; char *p = buf; Canvas *cv; va_start(ap, fmt); (void)vsnprintf(p, ARRAY_SIZE(buf) - 100, fmt, ap); va_end(ap); if (err) { p += strlen(p); *p++ = ':'; *p++ = ' '; strncpy(p, strerror(err), buf + ARRAY_SIZE(buf) - p - 1); buf[ARRAY_SIZE(buf) - 1] = 0; } for (display = displays; display; display = display->d_next) { for (cv = D_cvlist; cv; cv = cv->c_next) if (cv->c_layer == flayer) break; if (cv == NULL) continue; MakeStatus(buf); } } /*******************************************************************/ /*******************************************************************/ /* * Layer creation / removal */ void KillLayerChain(Layer *lay) { Canvas *cv, *ncv; Layer *l, *oldflayer; oldflayer = flayer; for (l = lay; l; l = l->l_next) { if (l->l_layfn == &WinLf || l->l_layfn == &BlankLf) break; if (oldflayer == l) oldflayer = NULL; for (cv = l->l_cvlist; cv; cv = ncv) { ncv = cv->c_lnext; cv->c_layer = NULL; cv->c_lnext = NULL; } } flayer = lay; while (flayer != l) ExitOverlayPage(); flayer = oldflayer; } int InitOverlayPage(int datasize, const struct LayFuncs *lf, int block) { char *data; Layer *newlay; Canvas *cv, *cvp, **cvpp; Window *win; cv = NULL; if (display && D_forecv->c_layer == flayer) cv = D_forecv; /* work only on this cv! */ if ((newlay = calloc(1, sizeof(Layer))) == NULL) { Msg(0, "No memory for layer struct"); return -1; } data = NULL; if (datasize) { if ((data = calloc(1, datasize)) == NULL) { free((char *)newlay); Msg(0, "No memory for layer data"); return -1; } } win = Layer2Window(flayer); if (win && (win->w_savelayer == flayer || (block && flayer->l_next == NULL))) { if (win->w_savelayer && win->w_savelayer != flayer && win->w_savelayer->l_cvlist == NULL) KillLayerChain(win->w_savelayer); win->w_savelayer = newlay; } if (cv && flayer->l_next == NULL && !block) { Display *olddisplay = display; display = cv->c_display; RemoveStatus(); display = olddisplay; /* new branch -> just get canvas vps */ for (cvpp = &flayer->l_cvlist; (cvp = *cvpp); cvpp = &cvp->c_lnext) if (cvp == cv) break; *cvpp = cv->c_lnext; newlay->l_cvlist = cv; cv->c_lnext = NULL; cv->c_layer = newlay; } else { LAY_DISPLAYS(flayer, RemoveStatus()); if (block && flayer->l_layfn == &WinLf) { if (win) win->w_blocked++; newlay->l_blocking = 1; } /* change all canvases */ newlay->l_cvlist = flayer->l_cvlist; for (cvp = newlay->l_cvlist; cvp; cvp = cvp->c_lnext) cvp->c_layer = newlay; flayer->l_cvlist = NULL; } newlay->l_width = flayer->l_width; newlay->l_height = flayer->l_height; newlay->l_encoding = 0; newlay->l_layfn = lf; newlay->l_data = data; newlay->l_next = flayer; newlay->l_bottom = flayer->l_bottom; flayer = newlay; LayRestore(); return 0; } void ExitOverlayPage(void) { Layer *oldlay; Window *p; int doredisplay = 0; Canvas *cv, *ocv; Layout *lay; oldlay = flayer; if (oldlay->l_data) { if (oldlay->l_layfn->lf_LayFree) LayFree(oldlay->l_data); free(oldlay->l_data); } p = Layer2Window(flayer); flayer = oldlay->l_next; if (flayer->l_layfn == &WinLf) { if (oldlay->l_blocking) { p->w_blocked--; } /* don't warp dead layers: check cvlist */ if (p->w_blocked && p->w_savelayer && p->w_savelayer != flayer && oldlay->l_cvlist) { /* warp ourself into savelayer */ flayer = p->w_savelayer; doredisplay = 1; } } if (p && p->w_savelayer == oldlay) p->w_savelayer = flayer; if (p && oldlay == p->w_paster.pa_pastelayer) p->w_paster.pa_pastelayer = NULL; for (lay = layouts; lay; lay = lay->lay_next) for (cv = lay->lay_cvlist; cv; cv = cv->c_next) if (cv->c_layer == oldlay) cv->c_layer = flayer; /* add all canvases back into next layer's canvas list */ for (ocv = NULL, cv = oldlay->l_cvlist; cv; cv = cv->c_lnext) { cv->c_layer = flayer; ocv = cv; } if (ocv) { cv = flayer->l_cvlist; ocv->c_lnext = NULL; flayer->l_cvlist = oldlay->l_cvlist; /* redisplay only the warped cvs */ if (doredisplay) LRefreshAll(flayer, 0); ocv->c_lnext = cv; } oldlay->l_cvlist = NULL; LayerCleanupMemory(oldlay); free((char *)oldlay); LayRestore(); LaySetCursor(); } int LayProcessMouse(Layer *l, unsigned char ch) { /* XXX: Make sure the layer accepts mouse events */ size_t len; if (l->l_mouseevent.len >= ARRAY_SIZE(l->l_mouseevent.buffer)) return -1; len = l->l_mouseevent.len++; l->l_mouseevent.buffer[len] = (len > 0 ? ch - 33 : ch); return (l->l_mouseevent.len == ARRAY_SIZE(l->l_mouseevent.buffer)); } void LayProcessMouseSwitch(Layer *l, bool start) { if ((l->l_mouseevent.start = start)) { l->l_mouseevent.len = 0; } } void LayPause(Layer *layer, bool pause) { Window *win; if (layer->l_pause.d == pause) return; if ((layer->l_pause.d = pause)) { /* Start pausing */ layer->l_pause.top = layer->l_pause.bottom = -1; return; } /* Unpause. So refresh the regions in the displays! */ if (layer->l_pause.top == -1 && layer->l_pause.bottom == -1) return; if (layer->l_layfn == &WinLf) /* Currently, this will always be the case! */ win = layer->l_data; else win = NULL; for (Canvas *cv = layer->l_cvlist; cv; cv = cv->c_lnext) { if (!cv->c_slorient) continue; /* Wasn't split, so already updated. */ display = cv->c_display; for (Viewport *vp = cv->c_vplist; vp; vp = vp->v_next) { for (int line = layer->l_pause.top; line <= layer->l_pause.bottom; line++) { int xs, xe; if (line + vp->v_yoff >= vp->v_ys && line + vp->v_yoff <= vp->v_ye && ((xs = layer->l_pause.left[line]) >= 0) && ((xe = layer->l_pause.right[line]) >= 0)) { xs += vp->v_xoff; xe += vp->v_xoff; if (xs < vp->v_xs) xs = vp->v_xs; if (xe > vp->v_xe) xe = vp->v_xe; if (layer->l_encoding == UTF8 && xe < vp->v_xe && win) { struct mline *ml = win->w_mlines + line; if (dw_left(ml, xe, UTF8)) xe++; } if (xs <= xe) RefreshLine(line + vp->v_yoff, xs, xe, 0); } } } if (cv == D_forecv) { int cx = layer->l_x + cv->c_xoff; int cy = layer->l_y + cv->c_yoff; if (cx < cv->c_xs) cx = cv->c_xs; if (cy < cv->c_ys) cy = cv->c_ys; if (cx > cv->c_xe) cx = cv->c_xe; if (cy > cv->c_ye) cy = cv->c_ye; GotoPos(cx, cy); } } for (int line = layer->l_pause.top; line <= layer->l_pause.bottom; line++) layer->l_pause.left[line] = layer->l_pause.right[line] = -1; } void LayPauseUpdateRegion(Layer *layer, int xs, int xe, int ys, int ye) { if (!layer->l_pause.d) return; if (ys < 0) ys = 0; if (ye >= layer->l_height) ye = layer->l_height - 1; if (xe >= layer->l_width) xe = layer->l_width - 1; if (layer->l_pause.top == -1 || layer->l_pause.top > ys) layer->l_pause.top = ys; if (layer->l_pause.bottom < ye) { layer->l_pause.bottom = ye; if (layer->l_pause.lines <= ye) { int o = layer->l_pause.lines; layer->l_pause.lines = ye + 32; layer->l_pause.left = realloc(layer->l_pause.left, sizeof(int) * layer->l_pause.lines); layer->l_pause.right = realloc(layer->l_pause.right, sizeof(int) * layer->l_pause.lines); while (o < layer->l_pause.lines) { layer->l_pause.left[o] = layer->l_pause.right[o] = -1; o++; } } } while (ys <= ye) { if (layer->l_pause.left[ys] == -1 || layer->l_pause.left[ys] > xs) layer->l_pause.left[ys] = xs; if (layer->l_pause.right[ys] < xe) layer->l_pause.right[ys] = xe; ys++; } } void LayerCleanupMemory(Layer *layer) { if (layer->l_pause.left) free(layer->l_pause.left); if (layer->l_pause.right) free(layer->l_pause.right); } screen-5.0.2/kmapdef.h0000664000175000017500000000026415224432722013230 0ustar alexalex#ifndef SCREEN_KMAPDEF_H #define SCREEN_KMAPDEF_H /* global variables */ extern char *kmapadef[]; extern char *kmapdef[]; extern char *kmapmdef[]; #endif /* SCREEN_KMAPDEF_H */ screen-5.0.2/install.sh0000775000175000017500000000421315224432722013453 0ustar alexalex#! /bin/sh # # install - install a program, script, or datafile # This comes from X11R5; it is not part of GNU. # # $XConsortium: install.sh,v 1.2 89/12/18 14:47:22 jim Exp $ # # This script is compatible with the BSD install script, but was written # from scratch. # # set DOITPROG to echo to test this script # Don't use :- since 4.3BSD and earlier shells don't like it. doit="${DOITPROG-}" # put in absolute paths if you don't have them in your path; or use env. vars. mvprog="${MVPROG-mv}" cpprog="${CPPROG-cp}" chmodprog="${CHMODPROG-chmod}" chownprog="${CHOWNPROG-chown}" chgrpprog="${CHGRPPROG-chgrp}" stripprog="${STRIPPROG-strip}" rmprog="${RMPROG-rm}" instcmd="$mvprog" chmodcmd="" chowncmd="" chgrpcmd="" stripcmd="" rmcmd="$rmprog -f" mvcmd="$mvprog" src="" dst="" while [ x"$1" != x ]; do case $1 in -c) instcmd="$cpprog" shift continue;; -m) chmodcmd="$chmodprog $2" shift shift continue;; -o) chowncmd="$chownprog $2" shift shift continue;; -g) chgrpcmd="$chgrpprog $2" shift shift continue;; -s) stripcmd="$stripprog" shift continue;; *) if [ x"$src" = x ] then src=$1 else dst=$1 fi shift continue;; esac done if [ x"$src" = x ] then echo "install: no input file specified" exit 1 fi if [ x"$dst" = x ] then echo "install: no destination specified" exit 1 fi # If destination is a directory, append the input filename; if your system # does not like double slashes in filenames, you may need to add some logic if [ -d $dst ] then dst="$dst"/`basename $src` fi # Make a temp file name in the proper directory. dstdir=`dirname $dst` dsttmp=$dstdir/#inst.$$# # Move or copy the file name to the temp name $doit $instcmd $src $dsttmp # and set any options; do chmod last to preserve setuid bits if [ x"$chowncmd" != x ]; then $doit $chowncmd $dsttmp; fi if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dsttmp; fi if [ x"$stripcmd" != x ]; then $doit $stripcmd $dsttmp; fi if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dsttmp; fi # Now rename the file to the real destination. $doit $rmcmd $dst $doit $mvcmd $dsttmp $dst exit 0 screen-5.0.2/input.h0000664000175000017500000000035715224432722012763 0ustar alexalex#ifndef SCREEN_INPUT_H #define SCREEN_INPUT_H #include void inp_setprompt (char *, char *); void Input (char *, size_t, int, void (*)(char *, size_t, void *), char *, int); int InInput (void); #endif /* SCREEN_INPUT_H */ screen-5.0.2/input.c0000664000175000017500000003170215224432722012754 0ustar alexalex/* Copyright (c) 2008, 2009 * Juergen Weigert (jnweiger@immd4.informatik.uni-erlangen.de) * Michael Schroeder (mlschroe@immd4.informatik.uni-erlangen.de) * Micah Cowan (micah@cowan.name) * Sadrul Habib Chowdhury (sadrul@users.sourceforge.net) * Copyright (c) 1993-2002, 2003, 2005, 2006, 2007 * Juergen Weigert (jnweiger@immd4.informatik.uni-erlangen.de) * Michael Schroeder (mlschroe@immd4.informatik.uni-erlangen.de) * Copyright (c) 1987 Oliver Laumann * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3, or (at your option) * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program (see the file COPYING); if not, see * https://www.gnu.org/licenses/, or contact Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02111-1301 USA * **************************************************************** */ #include "config.h" #include "input.h" #include #include "screen.h" #include "misc.h" #define INPUTLINE (flayer->l_height - 1) static void InpProcess(char **, size_t *); static void InpAbort(void); static void InpRedisplayLine(int, int, int, int); struct inpline { char buf[MAXSTR + 1]; /* text buffer */ size_t len; /* length of the editable string */ size_t pos; /* cursor position in editable string */ struct inpline *next, *prev; }; /* 'inphist' is used to store the current input when scrolling through history. * inpline->prev == history-prev * inpline->next == history-next */ static struct inpline inphist; struct inpdata { struct inpline inp; size_t inpmaxlen; /* MAXSTR, or less, if caller has shorter buffer */ char *inpstring; /* the prompt */ size_t inpstringlen; /* length of the prompt */ int inpmode; /* INP_NOECHO, INP_RAW, INP_EVERY */ void (*inpfinfunc) (char *buf, size_t len, void *priv); char *priv; /* private data for finfunc */ int privdata; /* private data space */ char *search; /* the search string */ }; static const struct LayFuncs InpLf = { InpProcess, InpAbort, InpRedisplayLine, DefClearLine, DefResize, DefRestore, NULL }; /* ** Here is the input routine */ /* called once, after InitOverlayPage in Input() or Isearch() */ void inp_setprompt(char *p, char *s) { struct inpdata *inpdata; inpdata = (struct inpdata *)flayer->l_data; if (p) { inpdata->inpstringlen = strlen(p); inpdata->inpstring = p; } if (s) { if (s != inpdata->inp.buf) strncpy(inpdata->inp.buf, s, ARRAY_SIZE(inpdata->inp.buf) - 1); inpdata->inp.buf[ARRAY_SIZE(inpdata->inp.buf) - 1] = 0; inpdata->inp.pos = inpdata->inp.len = strlen(inpdata->inp.buf); } InpRedisplayLine(INPUTLINE, 0, flayer->l_width - 1, 0); flayer->l_x = inpdata->inpstringlen + (inpdata->inpmode & INP_NOECHO ? 0 : inpdata->inp.pos); flayer->l_y = INPUTLINE; } /* * We dont use HS status line with Input(). * If we would use it, then we should check e_tgetflag("es") if * we are allowed to use esc sequences there. * * mode is an OR of * INP_NOECHO == suppress echoing of characters. * INP_RAW == raw mode. call finfunc after each character typed. * INP_EVERY == digraph mode. */ void Input(char *istr, size_t len, int mode, void (*finfunc) (char *buf, size_t len, void *priv), char *priv, int data) { size_t maxlen; struct inpdata *inpdata; if (!flayer) return; if (len > MAXSTR) len = MAXSTR; if (!(mode & INP_NOECHO)) { maxlen = flayer->l_width - 1 - strlen(istr); if (len > maxlen) len = maxlen; } if (InitOverlayPage(sizeof(struct inpdata), &InpLf, 1)) return; flayer->l_mode = 1; inpdata = (struct inpdata *)flayer->l_data; inpdata->inpmaxlen = len; inpdata->inpfinfunc = finfunc; inpdata->inp.pos = inpdata->inp.len = 0; inpdata->inp.prev = inphist.prev; inpdata->inpmode = mode; inpdata->privdata = data; if (!priv) priv = (char *)&inpdata->privdata; inpdata->priv = priv; inpdata->inpstringlen = 0; inpdata->inpstring = NULL; inpdata->search = NULL; if (istr) inp_setprompt(istr, (char *)NULL); } static void erase_chars(struct inpdata *inpdata, char *from, char *to, int x, int mv) { int chng; if ((ptrdiff_t)inpdata->inp.len > to - inpdata->inp.buf) memmove(from, to, inpdata->inp.len - (to - inpdata->inp.buf)); chng = to - from; if (mv) { x -= chng; inpdata->inp.pos -= chng; } inpdata->inp.len -= chng; if (!(inpdata->inpmode & INP_NOECHO)) { struct mchar mc; char *s = from < to ? from : to; mc = mchar_so; while (s < inpdata->inp.buf + inpdata->inp.len) { mc.image = *s++; LPutChar(flayer, &mc, x++, INPUTLINE); } while (chng--) LPutChar(flayer, &mchar_blank, x++, INPUTLINE); x = inpdata->inpstringlen + inpdata->inp.pos; LGotoPos(flayer, x, INPUTLINE); } } static void InpProcess(char **ppbuf, size_t *plen) { int len, x; char *pbuf; char ch; struct inpdata *inpdata; Display *inpdisplay; int prev, next, search = 0; inpdata = (struct inpdata *)flayer->l_data; inpdisplay = display; #define RESET_SEARCH do { if (inpdata->search) Free(inpdata->search); } while (0) LGotoPos(flayer, inpdata->inpstringlen + (inpdata->inpmode & INP_NOECHO ? 0 : inpdata->inp.pos), INPUTLINE); if (ppbuf == NULL) { InpAbort(); return; } x = inpdata->inpstringlen + inpdata->inp.pos; len = *plen; pbuf = *ppbuf; while (len) { char *p = inpdata->inp.buf + inpdata->inp.pos; ch = *pbuf++; len--; if (inpdata->inpmode & INP_EVERY) { inpdata->inp.buf[inpdata->inp.len] = ch; if (ch) { display = inpdisplay; (*inpdata->inpfinfunc) (inpdata->inp.buf, inpdata->inp.len, inpdata->priv); ch = inpdata->inp.buf[inpdata->inp.len]; } } else if (inpdata->inpmode & INP_RAW) { display = inpdisplay; (*inpdata->inpfinfunc) (&ch, 1, inpdata->priv); /* raw */ if (ch) continue; } if (((unsigned char)ch & 0177) >= ' ' && ch != 0177 && inpdata->inp.len < inpdata->inpmaxlen) { if (inpdata->inp.len > inpdata->inp.pos) memmove(p + 1, p, inpdata->inp.len - inpdata->inp.pos); inpdata->inp.buf[inpdata->inp.pos++] = ch; inpdata->inp.len++; if (!(inpdata->inpmode & INP_NOECHO)) { struct mchar mc; mc = mchar_so; mc.image = *p++; LPutChar(flayer, &mc, x, INPUTLINE); x++; if (p < inpdata->inp.buf + inpdata->inp.len) { while (p < inpdata->inp.buf + inpdata->inp.len) { mc.image = *p++; LPutChar(flayer, &mc, x++, INPUTLINE); } x = inpdata->inpstringlen + inpdata->inp.pos; LGotoPos(flayer, x, INPUTLINE); } } RESET_SEARCH; } else if ((ch == '\b' || ch == 0177) && inpdata->inp.pos > 0) { erase_chars(inpdata, p - 1, p, x, 1); RESET_SEARCH; } else if (ch == '\025') { /* CTRL-U */ x = inpdata->inpstringlen; if (inpdata->inp.len && !(inpdata->inpmode & INP_NOECHO)) { LClearArea(flayer, x, INPUTLINE, x + inpdata->inp.len - 1, INPUTLINE, 0, 0); LGotoPos(flayer, x, INPUTLINE); } inpdata->inp.len = inpdata->inp.pos = 0; } else if (ch == '\013') { /* CTRL-K */ x = inpdata->inpstringlen + inpdata->inp.pos; if (inpdata->inp.len > inpdata->inp.pos && !(inpdata->inpmode & INP_NOECHO)) { LClearArea(flayer, x, INPUTLINE, x + inpdata->inp.len - inpdata->inp.pos - 1, INPUTLINE, 0, 0); LGotoPos(flayer, x, INPUTLINE); } inpdata->inp.len = inpdata->inp.pos; } else if (ch == '\027' && inpdata->inp.pos > 0) { /* CTRL-W */ char *oldp = p--; while (p > inpdata->inp.buf && *p == ' ') p--; while (p > inpdata->inp.buf && *(p - 1) != ' ') p--; erase_chars(inpdata, p, oldp, x, 1); RESET_SEARCH; } else if (ch == '\004' && inpdata->inp.pos < inpdata->inp.len) { /* CTRL-D */ erase_chars(inpdata, p, p + 1, x, 0); RESET_SEARCH; } else if (ch == '\001' || (unsigned char)ch == 0201) { /* CTRL-A */ LGotoPos(flayer, x -= inpdata->inp.pos, INPUTLINE); inpdata->inp.pos = 0; } else if ((ch == '\002' || (unsigned char)ch == 0202) && inpdata->inp.pos > 0) { /* CTRL-B */ LGotoPos(flayer, --x, INPUTLINE); inpdata->inp.pos--; } else if (ch == '\005' || (unsigned char)ch == 0205) { /* CTRL-E */ LGotoPos(flayer, x += inpdata->inp.len - inpdata->inp.pos, INPUTLINE); inpdata->inp.pos = inpdata->inp.len; } else if ((ch == '\006' || (unsigned char)ch == 0206) && inpdata->inp.pos < inpdata->inp.len) { /* CTRL-F */ LGotoPos(flayer, ++x, INPUTLINE); inpdata->inp.pos++; } else if ((prev = ((ch == '\020' || (unsigned char)ch == 0220) && /* CTRL-P */ inpdata->inp.prev)) || (next = ((ch == '\016' || (unsigned char)ch == 0216) && /* CTRL-N */ inpdata->inp.next)) || (search = ((ch == '\022' || (unsigned char)ch == 0222) && inpdata->inp.prev))) { struct mchar mc; struct inpline *sel; int pos = -1; mc = mchar_so; if (prev) sel = inpdata->inp.prev; else if (next) sel = inpdata->inp.next; else { /* search */ inpdata->inp.buf[inpdata->inp.len] = 0; /* Remove the ctrl-r from the end */ if (!inpdata->search) inpdata->search = SaveStr(inpdata->inp.buf); for (sel = inpdata->inp.prev; sel; sel = sel->prev) { char *f; if ((f = strstr(sel->buf, inpdata->search))) { pos = f - sel->buf; break; } } if (!sel) continue; /* Did not find a match. Process the next input. */ } if (inpdata->inp.len && !(inpdata->inpmode & INP_NOECHO)) LClearArea(flayer, inpdata->inpstringlen, INPUTLINE, inpdata->inpstringlen + inpdata->inp.len - 1, INPUTLINE, 0, 0); if ((prev || search) && !inpdata->inp.next) inphist = inpdata->inp; memmove(&inpdata->inp, sel, sizeof(struct inpline)); if (pos != -1) inpdata->inp.pos = pos; if (inpdata->inp.len > inpdata->inpmaxlen) inpdata->inp.len = inpdata->inpmaxlen; if (inpdata->inp.pos > inpdata->inp.len) inpdata->inp.pos = inpdata->inp.len; x = inpdata->inpstringlen; p = inpdata->inp.buf; if (!(inpdata->inpmode & INP_NOECHO)) { while (p < inpdata->inp.buf + inpdata->inp.len) { mc.image = *p++; LPutChar(flayer, &mc, x++, INPUTLINE); } } x = inpdata->inpstringlen + inpdata->inp.pos; LGotoPos(flayer, x, INPUTLINE); } else if (ch == '\003' || ch == '\007' || ch == '\033' || ch == '\000' || ch == '\n' || ch == '\r') { if (ch != '\n' && ch != '\r') inpdata->inp.len = 0; inpdata->inp.buf[inpdata->inp.len] = 0; if (inpdata->inp.len && !(inpdata->inpmode & (INP_NOECHO | INP_RAW))) { struct inpline *store; /* Look for a duplicate first */ for (store = inphist.prev; store; store = store->prev) { if (strcmp(store->buf, inpdata->inp.buf) == 0) { if (store->next) store->next->prev = store->prev; if (store->prev) store->prev->next = store->next; store->pos = inpdata->inp.pos; break; } } if (!store) { store = malloc(sizeof(struct inpline)); memmove(store, &inpdata->inp, sizeof(struct inpline)); } store->next = &inphist; store->prev = inphist.prev; if (inphist.prev) inphist.prev->next = store; inphist.prev = store; } flayer->l_data = NULL; /* so inpdata does not get freed */ InpAbort(); /* redisplays... */ *ppbuf = pbuf; *plen = len; display = inpdisplay; if ((inpdata->inpmode & INP_RAW) == 0) (*inpdata->inpfinfunc) (inpdata->inp.buf, inpdata->inp.len, inpdata->priv); else (*inpdata->inpfinfunc) (pbuf - 1, 0, inpdata->priv); if (inpdata->search) free(inpdata->search); free(inpdata); return; } else { /* The user was searching, and then pressed some non-control input. So reset * the search string. */ RESET_SEARCH; } } if (!(inpdata->inpmode & INP_RAW)) { flayer->l_x = inpdata->inpstringlen + (inpdata->inpmode & INP_NOECHO ? 0 : inpdata->inp.pos); flayer->l_y = INPUTLINE; } *ppbuf = pbuf; *plen = len; } static void InpAbort(void) { LAY_CALL_UP(LayRedisplayLine(INPUTLINE, 0, flayer->l_width - 1, 0)); ExitOverlayPage(); } static void InpRedisplayLine(int y, int xs, int xe, int isblank) { int q, r, s, l, v; struct inpdata *inpdata; inpdata = (struct inpdata *)flayer->l_data; if (y != INPUTLINE) { LAY_CALL_UP(LayRedisplayLine(y, xs, xe, isblank)); return; } inpdata->inp.buf[inpdata->inp.len] = 0; q = xs; v = xe - xs + 1; s = 0; r = inpdata->inpstringlen; if (v > 0 && q < r) { l = v; if (l > r - q) l = r - q; LPutStr(flayer, inpdata->inpstring + q - s, l, &mchar_so, q, y); q += l; v -= l; } s = r; r += inpdata->inp.len; if (!(inpdata->inpmode & INP_NOECHO) && v > 0 && q < r) { l = v; if (l > r - q) l = r - q; LPutStr(flayer, inpdata->inp.buf + q - s, l, &mchar_so, q, y); q += l; v -= l; } r = flayer->l_width; if (!isblank && v > 0 && q < r) { l = v; if (l > r - q) l = r - q; LClearArea(flayer, q, y, q + l - 1, y, 0, 0); } } screen-5.0.2/image.h0000664000175000017500000001035615224432722012706 0ustar alexalex/* Copyright (c) 2008, 2009 * Juergen Weigert (jnweiger@immd4.informatik.uni-erlangen.de) * Michael Schroeder (mlschroe@immd4.informatik.uni-erlangen.de) * Micah Cowan (micah@cowan.name) * Sadrul Habib Chowdhury (sadrul@users.sourceforge.net) * Copyright (c) 1993-2002, 2003, 2005, 2006, 2007 * Juergen Weigert (jnweiger@immd4.informatik.uni-erlangen.de) * Michael Schroeder (mlschroe@immd4.informatik.uni-erlangen.de) * Copyright (c) 1987 Oliver Laumann * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3, or (at your option) * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program (see the file COPYING); if not, see * https://www.gnu.org/licenses/, or contact Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02111-1301 USA * **************************************************************** * $Id$ GNU */ #ifndef SCREEN_IMAGE_H #define SCREEN_IMAGE_H #include /* structure representing single cell of terminal */ struct mchar { uint32_t image; /* actual letter like a, b, c ... as Unicode code point */ uint32_t attr; /* attributes - bold, standout etc. */ uint32_t font; /* font :) */ uint32_t colorbg; /* background color */ uint32_t colorfg; /* foreground color */ uint32_t mbcs; /* used for multi byte character sets; TODO: possible to remove? use image now that it has 32 bits*/ }; struct mline { uint32_t *image; uint32_t *attr; uint32_t *font; uint32_t *colorbg; uint32_t *colorfg; }; #define save_mline(ml, n) { \ memmove(mline_old.image, (ml)->image, (n) * 4); \ memmove(mline_old.attr, (ml)->attr, (n) * 4); \ memmove(mline_old.font, (ml)->font, (n) * 4); \ memmove(mline_old.colorbg, (ml)->colorbg, (n) * 4); \ memmove(mline_old.colorfg, (ml)->colorfg, (n) * 4); \ } #define copy_mline(ml, xf, xt, n) { \ memmove((ml)->image + (xt), (ml)->image + (xf), (n) * 4); \ memmove((ml)->attr + (xt), (ml)->attr + (xf), (n) * 4); \ memmove((ml)->font + (xt), (ml)->font + (xf), (n) * 4); \ memmove((ml)->colorbg + (xt), (ml)->colorbg + (xf), (n) * 4); \ memmove((ml)->colorfg + (xt), (ml)->colorfg + (xf), (n) * 4); \ } #define clear_mline(ml, x, n) { \ memmove((ml)->image + (x), blank, (n) * 4); \ if ((ml)->attr != null) memset((ml)->attr + (x), 0, (n) * 4); \ if ((ml)->font != null) memset((ml)->font + (x), 0, (n) * 4); \ if ((ml)->colorbg != null) memset((ml)->colorbg + (x), 0, (n) * 4); \ if ((ml)->colorfg != null) memset((ml)->colorfg + (x), 0, (n) * 4); \ } #define cmp_mline(ml1, ml2, x) ( \ (ml1)->image[x] == (ml2)->image[x] \ && (ml1)->attr[x] == (ml2)->attr[x] \ && (ml1)->font[x] == (ml2)->font[x] \ && (ml1)->colorbg[x] == (ml2)->colorbg[x] \ && (ml1)->colorfg[x] == (ml2)->colorfg[x] \ ) #define cmp_mchar(mc1, mc2) ( \ (mc1)->image == (mc2)->image \ && (mc1)->attr == (mc2)->attr \ && (mc1)->font == (mc2)->font \ && (mc1)->colorbg == (mc2)->colorbg \ && (mc1)->colorfg == (mc2)->colorfg \ ) #define cmp_mchar_mline(mc, ml, x) ( \ (mc)->image == (ml)->image[x] \ && (mc)->attr == (ml)->attr[x] \ && (mc)->font == (ml)->font[x] \ && (mc)->colorbg == (ml)->colorbg[x] \ && (mc)->colorfg == (ml)->colorfg[x] \ ) #define copy_mchar2mline(mc, ml, x) { \ (ml)->image[x] = (mc)->image; \ (ml)->attr[x] = (mc)->attr; \ (ml)->font[x] = (mc)->font; \ (ml)->colorbg[x] = (mc)->colorbg; \ (ml)->colorfg[x] = (mc)->colorfg; \ } #define copy_mline2mchar(mc, ml, x) { \ (mc)->image = (ml)->image[x]; \ (mc)->attr = (ml)->attr[x]; \ (mc)->font = (ml)->font[x]; \ (mc)->colorbg = (ml)->colorbg[x]; \ (mc)->colorfg = (ml)->colorfg[x]; \ (mc)->mbcs = 0; \ } enum { REND_BELL = 0, REND_MONITOR, REND_SILENCE, NUM_RENDS }; #endif /* SCREEN_IMAGE_H */ screen-5.0.2/help.h0000664000175000017500000000056715224432722012557 0ustar alexalex#ifndef SCREEN_HELP_H #define SCREEN_HELP_H #include "comm.h" #include "canvas.h" void display_help (char *, struct action *); void display_bindkey (char *, struct action *); int InWList (void); void WListUpdatecv (Canvas *, Window *); void WListLinkChanged (void); void ZmodemPage (void); /* global variables */ extern char version[]; #endif /* SCREEN_HELP_H */ screen-5.0.2/help.c0000664000175000017500000003422215224432722012545 0ustar alexalex/* Copyright (c) 2010 * Juergen Weigert (jnweiger@immd4.informatik.uni-erlangen.de) * Sadrul Habib Chowdhury (sadrul@users.sourceforge.net) * Copyright (c) 2008, 2009 * Juergen Weigert (jnweiger@immd4.informatik.uni-erlangen.de) * Michael Schroeder (mlschroe@immd4.informatik.uni-erlangen.de) * Micah Cowan (micah@cowan.name) * Sadrul Habib Chowdhury (sadrul@users.sourceforge.net) * Copyright (c) 1993-2002, 2003, 2005, 2006, 2007 * Juergen Weigert (jnweiger@immd4.informatik.uni-erlangen.de) * Michael Schroeder (mlschroe@immd4.informatik.uni-erlangen.de) * Copyright (c) 1987 Oliver Laumann * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3, or (at your option) * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program (see the file COPYING); if not, see * https://www.gnu.org/licenses/, or contact Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02111-1301 USA * **************************************************************** */ #include "config.h" #include "help.h" #include #include #include #include "screen.h" #include "misc.h" #include "list_generic.h" #include "process.h" char version[60]; /* initialised by main() */ static void PadStr(char *, int, int, int); /* ** Here come the help page routines */ static void HelpProcess(char **, size_t *); static void HelpAbort(void); static void HelpRedisplayLine(int, int, int, int); static void add_key_to_buf(char *, int); static void AddAction(struct action *, int, int); static int helppage(void); struct helpdata { char *class; struct action *ktabp; int maxrow, grow, numcols, numrows, num_names; int numskip, numpages; int command_search, command_bindings; int refgrow, refcommand_search; int inter, mcom, mkey; int nact[RC_LAST + 1]; }; #define MAXKLEN 256 static const struct LayFuncs HelpLf = { HelpProcess, HelpAbort, HelpRedisplayLine, DefClearLine, DefResize, DefRestore, NULL }; void display_help(char *class, struct action *ktabp) { int i, n, key, mcom, mkey, l; struct helpdata *helpdata; int used[RC_LAST + 1]; if (flayer->l_height < 6) { LMsg(0, "Window height too small for help page"); return; } if (InitOverlayPage(sizeof(struct helpdata), &HelpLf, 0)) return; helpdata = (struct helpdata *)flayer->l_data; helpdata->class = class; helpdata->ktabp = ktabp; helpdata->num_names = helpdata->command_bindings = 0; helpdata->command_search = 0; for (n = 0; n <= RC_LAST; n++) used[n] = 0; mcom = 0; mkey = 0; for (key = 0; key < 256 + KMAP_KEYS; key++) { n = ktabp[key].nr; if (n == RC_ILLEGAL) continue; if (ktabp[key].args == noargs) { used[n] += (key <= ' ' || key == 0x7f) ? 3 : (key > 0x7f) ? 5 : 2; } else helpdata->command_bindings++; } for (n = i = 0; n <= RC_LAST; n++) if (used[n]) { l = strlen(comms[n].name); if (l > mcom) mcom = l; if (used[n] > mkey) mkey = used[n]; helpdata->nact[i++] = n; } helpdata->num_names = i; if (mkey > MAXKLEN) mkey = MAXKLEN; helpdata->numcols = flayer->l_width / (mcom + mkey + 1); if (helpdata->numcols == 0) { HelpAbort(); LMsg(0, "Width too small"); return; } helpdata->inter = (flayer->l_width - (mcom + mkey) * helpdata->numcols) / (helpdata->numcols + 1); if (helpdata->inter <= 0) helpdata->inter = 1; helpdata->mcom = mcom; helpdata->mkey = mkey; helpdata->numrows = (helpdata->num_names + helpdata->numcols - 1) / helpdata->numcols; helpdata->numskip = flayer->l_height - 5 - (2 + helpdata->numrows); while (helpdata->numskip < 0) helpdata->numskip += flayer->l_height - 5; helpdata->numskip %= flayer->l_height - 5; if (helpdata->numskip > flayer->l_height / 3 || helpdata->numskip > helpdata->command_bindings) helpdata->numskip = 1; helpdata->maxrow = 2 + helpdata->numrows + helpdata->numskip + helpdata->command_bindings; helpdata->grow = 0; helpdata->numpages = (helpdata->maxrow + flayer->l_height - 6) / (flayer->l_height - 5); flayer->l_x = 0; flayer->l_y = flayer->l_height - 1; helppage(); } static void HelpProcess(char **ppbuf, size_t *plen) { bool done = false; while (!done && *plen > 0) { switch (**ppbuf) { case ' ': if (helppage() == 0) break; /* FALLTHROUGH */ case '\r': case '\n': done = true; break; default: break; } ++*ppbuf; --*plen; } if (done) HelpAbort(); } static void HelpAbort(void) { LAY_CALL_UP(LRefreshAll(flayer, 0)); ExitOverlayPage(); } static int helppage(void) { struct helpdata *helpdata; int col, crow, n, key, x; char buf[MAXKLEN], Esc_buf[5], cbuf[512]; struct action *ktabp; helpdata = (struct helpdata *)flayer->l_data; ktabp = helpdata->ktabp; if (helpdata->grow >= helpdata->maxrow) return -1; helpdata->refgrow = helpdata->grow; helpdata->refcommand_search = helpdata->command_search; /* Clear the help screen */ LClearAll(flayer, 0); sprintf(cbuf, "Screen key bindings, page %d of %d.", helpdata->grow / (flayer->l_height - 5) + 1, helpdata->numpages); centerline(cbuf, 0); crow = 2; *Esc_buf = '\0'; *buf = '\0'; /* XXX fix escape character */ if (flayer->l_cvlist && flayer->l_cvlist->c_display) { add_key_to_buf(buf, flayer->l_cvlist->c_display->d_user->u_MetaEsc); add_key_to_buf(Esc_buf, flayer->l_cvlist->c_display->d_user->u_Esc); } else { strncpy(Esc_buf, "??", 5); strncpy(buf, "??", 256); } for (; crow < flayer->l_height - 3; crow++) { if (helpdata->grow < 1) { if (ktabp == ktab) sprintf(cbuf, "Command key: %s Literal %s: %s", Esc_buf, Esc_buf, buf); else sprintf(cbuf, "Command class: '%.80s'", helpdata->class); centerline(cbuf, crow); helpdata->grow++; } else if (helpdata->grow >= 2 && helpdata->grow - 2 < helpdata->numrows) { x = 0; for (col = 0; col < helpdata->numcols && (n = helpdata->numrows * col + (helpdata->grow - 2)) < helpdata->num_names; col++) { x += helpdata->inter - !col; n = helpdata->nact[n]; buf[0] = '\0'; for (key = 0; key < 256 + KMAP_KEYS; key++) if (ktabp[key].nr == n && ktabp[key].args == noargs && strlen(buf) < ARRAY_SIZE(buf) - 7) { strcat(buf, " "); add_key_to_buf(buf, key); } PadStr(comms[n].name, helpdata->mcom, x, crow); x += helpdata->mcom; PadStr(buf, helpdata->mkey, x, crow); x += helpdata->mkey; } helpdata->grow++; } else if (helpdata->grow - 2 - helpdata->numrows >= helpdata->numskip && helpdata->grow - 2 - helpdata->numrows - helpdata->numskip < helpdata->command_bindings) { while (ktabp[helpdata->command_search].nr == RC_ILLEGAL || ktabp[helpdata->command_search].args == noargs) { if (++helpdata->command_search >= 256 + KMAP_KEYS) return -1; } buf[0] = '\0'; add_key_to_buf(buf, helpdata->command_search); PadStr(buf, 5, 0, crow); AddAction(&ktabp[helpdata->command_search++], 5, crow); helpdata->grow++; } else helpdata->grow++; } sprintf(cbuf, "[Press Space %s Return to end.]", helpdata->grow < helpdata->maxrow ? "for next page;" : "or"); centerline(cbuf, flayer->l_height - 2); LaySetCursor(); return 0; } static void AddAction(struct action *act, int x, int y) { char buf[256]; int del, l; char *bp, *cp, **pp; int *lp, ll; int fr; struct mchar mchar_dol; mchar_dol = mchar_blank; mchar_dol.image = '$'; fr = flayer->l_width - 1 - x; if (fr <= 0) return; l = strlen(comms[act->nr].name); if (l + 1 > fr) l = fr - 1; PadStr(comms[act->nr].name, l, x, y); x += l; fr -= l + 1; LPutChar(flayer, fr ? &mchar_blank : &mchar_dol, x++, y); pp = act->args; lp = act->argl; while (pp && (cp = *pp) != NULL) { del = 0; bp = buf; ll = *lp++; if (!ll || (strchr(cp, ' ') != NULL)) { if (strchr(cp, '\'') != NULL) *bp++ = del = '"'; else *bp++ = del = '\''; } while (ll-- && bp < buf + 250) bp += AddXChar(bp, *(unsigned char *)cp++); if (del) *bp++ = del; *bp = 0; if ((fr -= (bp - buf) + 1) < 0) { fr += bp - buf; if (fr > 0) PadStr(buf, fr, x, y); if (fr == 0) LPutChar(flayer, &mchar_dol, x, y); return; } PadStr(buf, strlen(buf), x, y); x += strlen(buf); pp++; if (*pp) LPutChar(flayer, fr ? &mchar_blank : &mchar_dol, x++, y); } } static void add_key_to_buf(char *buf, int key) { buf += strlen(buf); if (key < 0) strncpy(buf, "unset", 6); else if (key == ' ') strncpy(buf, "sp", 3); else if (key >= 256) { key = key - 256 + T_CAPS; buf[0] = ':'; buf[1] = term[key].tcname[0]; buf[2] = term[key].tcname[1]; buf[3] = ':'; buf[4] = 0; } else buf[AddXChar(buf, key)] = 0; } static void HelpRedisplayLine(int y, int xs, int xe, int isblank) { if (y < 0) { struct helpdata *helpdata; helpdata = (struct helpdata *)flayer->l_data; helpdata->grow = helpdata->refgrow; helpdata->command_search = helpdata->refcommand_search; helppage(); return; } if (y != 0 && y != flayer->l_height - 1) return; if (!isblank) LClearArea(flayer, xs, y, xe, y, 0, 0); } /* ** ** The bindkey help page ** */ static void BindkeyProcess(char **, size_t *); static void BindkeyAbort(void); static void BindkeyRedisplayLine(int, int, int, int); static void bindkeypage(void); struct bindkeydata { char *title; struct action *tab; int pos; int last; int page; int pages; }; static const struct LayFuncs BindkeyLf = { BindkeyProcess, BindkeyAbort, BindkeyRedisplayLine, DefClearLine, DefResize, DefRestore, NULL }; void display_bindkey(char *title, struct action *tab) { struct bindkeydata *bindkeydata; int i, n; if (flayer->l_height < 6) { LMsg(0, "Window height too small for bindkey page"); return; } if (InitOverlayPage(sizeof(struct bindkeydata), &BindkeyLf, 0)) return; bindkeydata = (struct bindkeydata *)flayer->l_data; bindkeydata->title = title; bindkeydata->tab = tab; n = 0; for (i = 0; i < KMAP_KEYS + KMAP_AKEYS + kmap_extn; i++) { if (tab[i].nr != RC_ILLEGAL) n++; } bindkeydata->pos = 0; bindkeydata->page = 1; bindkeydata->pages = (n + flayer->l_height - 6) / (flayer->l_height - 5); if (bindkeydata->pages == 0) bindkeydata->pages = 1; flayer->l_x = 0; flayer->l_y = flayer->l_height - 1; bindkeypage(); } static void BindkeyAbort(void) { LAY_CALL_UP(LRefreshAll(flayer, 0)); ExitOverlayPage(); } static void bindkeypage(void) { struct bindkeydata *bindkeydata; struct kmap_ext *kme; char tbuf[256]; int del, i, y, sl; struct action *act; char *xch, *s, *p; bindkeydata = (struct bindkeydata *)flayer->l_data; LClearAll(flayer, 0); sprintf(tbuf, "%s key bindings, page %d of %d.", bindkeydata->title, bindkeydata->page, bindkeydata->pages); centerline(tbuf, 0); y = 2; for (i = bindkeydata->pos; i < KMAP_KEYS + KMAP_AKEYS + kmap_extn && y < flayer->l_height - 3; i++) { p = tbuf; xch = " "; if (i < KMAP_KEYS) { act = &bindkeydata->tab[i]; if (act->nr == RC_ILLEGAL) continue; del = *p++ = ':'; s = term[i + T_CAPS].tcname; sl = s ? strlen(s) : 0; } else if (i < KMAP_KEYS + KMAP_AKEYS) { act = &bindkeydata->tab[i]; if (act->nr == RC_ILLEGAL) continue; del = *p++ = ':'; s = term[i + (T_CAPS - T_OCAPS + T_CURSOR)].tcname; sl = s ? strlen(s) : 0; xch = "[A]"; } else { kme = kmap_exts + (i - (KMAP_KEYS + KMAP_AKEYS)); del = 0; s = kme->str; sl = kme->fl & ~KMAP_NOTIMEOUT; if ((kme->fl & KMAP_NOTIMEOUT) != 0) xch = "[T]"; act = bindkeydata->tab == dmtab ? &kme->dm : bindkeydata->tab == mmtab ? &kme->mm : &kme->um; if (act->nr == RC_ILLEGAL) continue; } while (sl-- > 0) p += AddXChar(p, *(unsigned char *)s++); if (del) *p++ = del; *p++ = ' '; while (p < tbuf + 15) *p++ = ' '; sprintf(p, "%s -> ", xch); p += 7; if (p - tbuf > flayer->l_width - 1) { tbuf[flayer->l_width - 2] = '$'; tbuf[flayer->l_width - 1] = 0; } PadStr(tbuf, strlen(tbuf), 0, y); AddAction(act, strlen(tbuf), y); y++; } y++; bindkeydata->last = i; sprintf(tbuf, "[Press Space %s Return to end.]", bindkeydata->page < bindkeydata->pages ? "for next page;" : "or"); centerline(tbuf, flayer->l_height - 2); LaySetCursor(); } static void BindkeyProcess(char **ppbuf, size_t *plen) { int done = 0; struct bindkeydata *bindkeydata; bindkeydata = (struct bindkeydata *)flayer->l_data; while (!done && *plen > 0) { switch (**ppbuf) { case ' ': if (bindkeydata->page < bindkeydata->pages) { bindkeydata->pos = bindkeydata->last; bindkeydata->page++; bindkeypage(); break; } /* FALLTHROUGH */ case '\r': case '\n': done = 1; break; default: break; } ++*ppbuf; --*plen; } if (done) BindkeyAbort(); } static void BindkeyRedisplayLine(int y, int xs, int xe, int isblank) { if (y < 0) { bindkeypage(); return; } if (y != 0 && y != flayer->l_height - 1) return; if (!isblank) LClearArea(flayer, xs, y, xe, y, 0, 0); } /* ** ** The zmodem active page ** */ static void ZmodemRedisplayLine(int, int, int, int); static int ZmodemResize(int, int); static const struct LayFuncs ZmodemLf = { DefProcess, NULL, ZmodemRedisplayLine, DefClearLine, ZmodemResize, DefRestore, NULL }; static int ZmodemResize(int wi, int he) { flayer->l_width = wi; flayer->l_height = he; flayer->l_x = flayer->l_width > 32 ? 32 : 0; return 0; } static void ZmodemRedisplayLine(int y, int xs, int xe, int isblank) { DefRedisplayLine(y, xs, xe, isblank); if (y == 0 && xs == 0) LPutStr(flayer, "Zmodem active on another display", flayer->l_width > 32 ? 32 : flayer->l_width, &mchar_blank, 0, 0); } void ZmodemPage(void) { if (InitOverlayPage(1, &ZmodemLf, 1)) return; LRefreshAll(flayer, 0); flayer->l_x = flayer->l_width > 32 ? 32 : 0; flayer->l_y = 0; } static void PadStr(char *str, int n, int x, int y) { int l; l = strlen(str); if (l > n) l = n; LPutStr(flayer, str, l, &mchar_blank, x, y); if (l < n) LPutStr(flayer, (char *)blank, n - l, &mchar_blank, x + l, y); } screen-5.0.2/fileio.h0000664000175000017500000000072515224432722013072 0ustar alexalex#ifndef SCREEN_FILEIO_H #define SCREEN_FILEIO_H #include "window.h" int StartRc (char *, int); void FinishRc (char *); void RcLine (char *, int); FILE *secfopen (char *, char *); int secopen (char *, int, int); void WriteFile (struct acluser *, char *, int); char *ReadFile (char *, int *); void KillBuffers (void); int printpipe (Window *, char *); int readpipe (char **); void do_source (char *); /* global variables */ extern char *rc_name; #endif screen-5.0.2/fileio.c0000664000175000017500000003532215224432722013066 0ustar alexalex/* Copyright (c) 2008, 2009 * Juergen Weigert (jnweiger@immd4.informatik.uni-erlangen.de) * Michael Schroeder (mlschroe@immd4.informatik.uni-erlangen.de) * Micah Cowan (micah@cowan.name) * Sadrul Habib Chowdhury (sadrul@users.sourceforge.net) * Copyright (c) 1993-2002, 2003, 2005, 2006, 2007 * Juergen Weigert (jnweiger@immd4.informatik.uni-erlangen.de) * Michael Schroeder (mlschroe@immd4.informatik.uni-erlangen.de) * Copyright (c) 1987 Oliver Laumann * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3, or (at your option) * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program (see the file COPYING); if not, see * https://www.gnu.org/licenses/, or contact Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02111-1301 USA * **************************************************************** */ #include "config.h" #include "fileio.h" #include #include #include #include #include #include #include #include "screen.h" #include "misc.h" #include "process.h" #include "termcap.h" #include "dumptermcap.h" #include "encoding.h" static char *CatExtra(char *, char *); static char *findrcfile(char *); char *rc_name = ""; int rc_recursion = 0; static char *CatExtra(char *str1, char *str2) { char *cp; size_t len1, len2; bool add_colon; len1 = strlen(str1); if (len1 == 0) return str2; add_colon = (str1[len1 - 1] != ':'); if (str2) { len2 = strlen(str2); if ((cp = realloc(str2, len1 + len2 + add_colon + 1)) == NULL) Panic(0, "%s", strnomem); memmove(cp + len1 + add_colon, cp, len2 + 1); } else { if ((cp = malloc(len1 + add_colon + 1)) == NULL) Panic(0, "%s", strnomem); cp[len1 + add_colon] = '\0'; } memmove(cp, str1, len1); if (add_colon) cp[len1] = ':'; return cp; } static char *findrcfile(char *rcfile) { char buf[256]; char *p; /* Tilde prefix support courtesy , * taken from a Debian patch. */ if (rcfile && *rcfile == '~') { static char rcfilename_tilde_exp[MAXPATHLEN + 1]; char *slash_position = strchr(rcfile, '/'); if (slash_position == rcfile + 1) { if (!home) { Msg(0, "%s: source: tilde expansion failed", rc_name); return NULL; } snprintf(rcfilename_tilde_exp, MAXPATHLEN, "%s/%s", home, rcfile + 2); } else if (slash_position) { struct passwd *p; *slash_position = 0; p = getpwnam(rcfile + 1); if (!p) { Msg(0, "%s: source: tilde expansion failed for user %s", rc_name, rcfile + 1); return NULL; } snprintf(rcfilename_tilde_exp, MAXPATHLEN, "%s/%s", p->pw_dir, slash_position + 1); } else { Msg(0, "%s: source: illegal tilde expression.", rc_name); return NULL; } rcfile = rcfilename_tilde_exp; } if (rcfile) { char *rcend = strrchr(rc_name, '/'); if (*rcfile != '/' && rcend && (rcend - rc_name) + strlen(rcfile) + 2 < ARRAY_SIZE(buf)) { strncpy(buf, rc_name, rcend - rc_name + 1); strncpy(buf + (rcend - rc_name) + 1, rcfile, 256 - (rcend - rc_name)); if (access(buf, R_OK) == 0) return SaveStr(buf); } return SaveStr(rcfile); } if ((p = getenv("SCREENRC")) != NULL && *p != '\0') { return SaveStr(p); } else { if (strlen(home) > ARRAY_SIZE(buf) - 12) Panic(0, "Rc: home too large"); sprintf(buf, "%s/.screenrc", home); return SaveStr(buf); } } /* * this will be called twice: * 1) rcfilename = "/etc/screenrc" * 2) rcfilename = RcFileName */ int StartRc(char *rcfilename, int nopanic) { int argc, len; char *p, *cp; char buf[2048]; char *args[MAXARGS]; int argl[MAXARGS]; FILE *fp; char *oldrc_name = rc_name; /* always fix termcap/info capabilities */ extra_incap = CatExtra("TF", extra_incap); /* Special settings for vt100 and others */ if (display && (!strncmp(D_termname, "vt", 2) || !strncmp(D_termname, "xterm", 5))) extra_incap = CatExtra ("xn:f0=\033Op:f1=\033Oq:f2=\033Or:f3=\033Os:f4=\033Ot:f5=\033Ou:f6=\033Ov:f7=\033Ow:f8=\033Ox:f9=\033Oy:f.=\033On:f,=\033Ol:fe=\033OM:f+=\033Ok:f-=\033Om:f*=\033Oj:f/=\033Oo:fq=\033OX", extra_incap); rc_name = findrcfile(rcfilename); if (rc_name == NULL || (fp = secfopen(rc_name, "r")) == NULL) { const char *rc_nonnull = rc_name ? rc_name : rcfilename; if (!rc_recursion && RcFileName && !strcmp(RcFileName, rc_nonnull)) { /* * User explicitly gave us that name, * this is the only case, where we get angry, if we can't read * the file. */ if (!nopanic) Panic(0, "Unable to open \"%s\".", rc_nonnull); /* possibly NOTREACHED */ } if (rc_name) Free(rc_name); rc_name = oldrc_name; return 1; } while (fgets(buf, ARRAY_SIZE(buf), fp) != NULL) { if ((p = strrchr(buf, '\n')) != NULL) *p = '\0'; if ((argc = Parse(buf, ARRAY_SIZE(buf), args, argl)) == 0) continue; if (strcmp(args[0], "echo") == 0) { if (!display) continue; if (argc < 2 || (argc == 3 && strcmp(args[1], "-n")) || argc > 3) { Msg(0, "%s: 'echo [-n] \"string\"' expected.", rc_name); continue; } AddStr(args[argc - 1]); if (argc != 3) { AddStr("\r\n"); Flush(0); } } else if (strcmp(args[0], "sleep") == 0) { if (!display) continue; if (argc != 2) { Msg(0, "%s: sleep: one numeric argument expected.", rc_name); continue; } DisplaySleep1000(1000 * atoi(args[1]), 1); } else if (!strcmp(args[0], "termcapinfo") || !strcmp(args[0], "terminfo")) { if (!display) continue; if (argc < 3 || argc > 4) { Msg(0, "%s: %s: incorrect number of arguments.", rc_name, args[0]); continue; } for (p = args[1]; p && *p; p = cp) { if ((cp = strchr(p, '|')) != NULL) *cp++ = '\0'; len = strlen(p); if (p[len - 1] == '*') { if (!(len - 1) || !strncmp(p, D_termname, len - 1)) break; } else if (!strcmp(p, D_termname)) break; } if (!(p && *p)) continue; extra_incap = CatExtra(args[2], extra_incap); if (argc == 4) extra_outcap = CatExtra(args[3], extra_outcap); } else if (!strcmp(args[0], "source")) { if (rc_recursion <= 10) { rc_recursion++; (void)StartRc(args[1], 0); rc_recursion--; } } } fclose(fp); Free(rc_name); rc_name = oldrc_name; return 0; } void FinishRc(char *rcfilename) { char buf[2048]; FILE *fp; char *oldrc_name = rc_name; rc_name = findrcfile(rcfilename); if (rc_name == NULL || (fp = secfopen(rc_name, "r")) == NULL) { const char *rc_nonnull = rc_name ? rc_name : rcfilename; if (rc_recursion) Msg(errno, "%s: source %s", oldrc_name, rc_nonnull); else if (RcFileName && !strcmp(RcFileName, rc_nonnull)) { /* * User explicitly gave us that name, * this is the only case, where we get angry, if we can't read * the file. */ Panic(0, "Unable to open \"%s\".", rc_nonnull); /* NOTREACHED */ } if (rc_name) Free(rc_name); rc_name = oldrc_name; return; } while (fgets(buf, ARRAY_SIZE(buf), fp) != NULL) RcLine(buf, ARRAY_SIZE(buf)); (void)fclose(fp); Free(rc_name); rc_name = oldrc_name; } void do_source(char *rcfilename) { if (rc_recursion > 10) { Msg(0, "%s: source: recursion limit reached", rc_name); return; } rc_recursion++; FinishRc(rcfilename); rc_recursion--; } /* * Running a Command Line in the environment determined by the display. * The fore window is taken from the display as well as the user. * This is bad when we run detached. */ void RcLine(char *ubuf, int ubufl) { char *args[MAXARGS]; int argl[MAXARGS]; if (display) { fore = D_fore; flayer = D_forecv->c_layer; } else flayer = fore ? fore->w_savelayer : NULL; if (Parse(ubuf, ubufl, args, argl) <= 0) return; if (!display) { /* the session owner does it, when there is no display here */ EffectiveAclUser = users; } DoCommand(args, argl); EffectiveAclUser = NULL; } static void putc_encoded(FILE *f, uint32_t c, uint32_t font, int encoding) { /* Filler character which is used for double-width characters. */ if (c == 0xff && font == 0xff) return; char buf[10]; int length = EncodeChar(buf, c, encoding, NULL); if (length < 0) { return; } buf[length] = 0; fputs(buf, f); } /* * needs display for copybuffer access and termcap dumping */ void WriteFile(struct acluser *user, char *fn, int dump) { /* dump==0: create .termcap, * dump==1: hardcopy, * dump==2: BUFFERFILE * dump==1: scrollback, */ int i, j, k; char *c; FILE *f; char fnbuf[FILENAME_MAX]; char *mode = "w"; int public = 0; struct stat stb, stb2; int fd, exists = 0; switch (dump) { case DUMP_TERMCAP: if (fn == NULL) { i = SocketName - SocketPath; if (i > (int)ARRAY_SIZE(fnbuf) - 9) i = 0; strncpy(fnbuf, SocketPath, i); strncpy(fnbuf + i, ".termcap", 9); fn = fnbuf; } break; case DUMP_HARDCOPY: case DUMP_SCROLLBACK: if (fn == NULL) { if (fore == NULL) return; if (hardcopydir && *hardcopydir && strlen(hardcopydir) < ARRAY_SIZE(fnbuf) - 21) sprintf(fnbuf, "%s/hardcopy.%d", hardcopydir, fore->w_number); else sprintf(fnbuf, "hardcopy.%d", fore->w_number); fn = fnbuf; } if (hardcopy_append && !access(fn, W_OK)) mode = "a"; break; case DUMP_EXCHANGE: if (fn == NULL) { strncpy(fnbuf, BufferFile, ARRAY_SIZE(fnbuf) - 1); fnbuf[ARRAY_SIZE(fnbuf) - 1] = 0; fn = fnbuf; } public = !strcmp(fn, DEFAULT_BUFFERFILE); exists = !lstat(fn, &stb); if (public && exists && (S_ISLNK(stb.st_mode) || stb.st_nlink > 1)) { Msg(0, "No write to links, please."); return; } break; } if (UserContext() > 0) { if (dump == DUMP_EXCHANGE && public) { if (exists) { if ((fd = open(fn, O_WRONLY, 0666)) >= 0) { if (fstat(fd, &stb2) == 0 && stb.st_dev == stb2.st_dev && stb.st_ino == stb2.st_ino) { if (ftruncate(fd, 0) != 0) { close(fd); fd = -1; } } else { close(fd); fd = -1; } } } else fd = open(fn, O_WRONLY | O_CREAT | O_EXCL, 0666); f = fd >= 0 ? fdopen(fd, mode) : NULL; } else f = fopen(fn, mode); if (f == NULL) { UserReturn(0); } else { uint32_t *p, *pf; switch (dump) { case DUMP_HARDCOPY: case DUMP_SCROLLBACK: if (!fore) break; if (*mode == 'a') { putc('>', f); for (j = fore->w_width - 2; j > 0; j--) putc('=', f); fputs("<\n", f); } if (dump == DUMP_SCROLLBACK) { for (i = fore->w_histheight - fore->w_scrollback_height; i < fore->w_histheight; i++) { p = (WIN(i)->image); pf = WIN(i)->font; for (k = fore->w_width - 1; k >= 0 && p[k] == ' '; k--) ; for (j = 0; j <= k; j++) putc_encoded(f, p[j], pf[j], fore->w_encoding); putc('\n', f); } } for (i = 0; i < fore->w_height; i++) { p = fore->w_mlines[i].image; pf = fore->w_mlines[i].font; for (k = fore->w_width - 1; k >= 0 && p[k] == ' '; k--) ; for (j = 0; j <= k; j++) putc_encoded(f, p[j], pf[j], fore->w_encoding); putc('\n', f); } break; case DUMP_TERMCAP: DumpTermcap(fore->w_aflag, f); break; case DUMP_EXCHANGE: c = user->u_plop.buf; for (i = user->u_plop.len; i-- > 0; c++) if (*c == '\r' && (i == 0 || c[1] != '\n')) putc('\n', f); else putc(*c, f); break; } (void)fclose(f); UserReturn(1); } } if (UserStatus() <= 0) Msg(0, "Cannot open \"%s\"", fn); else if (display && !*rc_name) { switch (dump) { case DUMP_TERMCAP: Msg(0, "Termcap entry written to \"%s\".", fn); break; case DUMP_HARDCOPY: case DUMP_SCROLLBACK: Msg(0, "Screen image %s to \"%s\".", (*mode == 'a') ? "appended" : "written", fn); break; case DUMP_EXCHANGE: Msg(0, "Copybuffer written to \"%s\".", fn); } } } /* * returns an allocated buffer which holds a copy of the file named filename. * lenp (if nonzero) points to a location, where the buffer size should be * stored. */ char *ReadFile(char *filename, int *lenp) { FILE *file; int l, size; char *buf = NULL; if ((file = secfopen(filename, "r")) == NULL) { Msg(errno, "no %s -- no slurp", filename); return NULL; } if (fseek(file, 0L, SEEK_END) < 0) { fclose(file); Msg(errno, "fseek %s", filename); return NULL; } size = ftell(file); if (size < 0) { fclose(file); Msg(errno, "ftell %s", filename); return NULL; } if ((buf = malloc(size)) == NULL) { fclose(file); Msg(0, "%s", strnomem); return NULL; } if (fseek(file, 0L, SEEK_SET) < 0) { free(buf); fclose(file); Msg(errno, "fseek %s", filename); return NULL; } errno = 0; if ((l = fread(buf, sizeof(char), size, file)) != size) { Msg(errno, "Got only %d bytes from %s", l, filename); } fclose(file); *lenp = l; return buf; } void KillBuffers(void) { if (UserContext() > 0) UserReturn(unlink(BufferFile) ? errno : 0); errno = UserStatus(); Msg(errno, "%s %sremoved", BufferFile, errno ? "not " : ""); } /* * (Almost) secure open and fopen... */ FILE *secfopen(char *name, char *mode) { FILE *fi; xseteuid(real_uid); xsetegid(real_gid); fi = fopen(name, mode); xseteuid(eff_uid); xsetegid(eff_gid); return fi; } int secopen(char *name, int flags, int mode) { int fd; xseteuid(real_uid); xsetegid(real_gid); fd = open(name, flags, mode); xseteuid(eff_uid); xsetegid(eff_gid); return fd; } int printpipe(Window *p, char *cmd) { int pi[2]; if (pipe(pi)) { WMsg(p, errno, "printing pipe"); return -1; } switch (fork()) { case -1: WMsg(p, errno, "printing fork"); return -1; case 0: display = p->w_pdisplay; displays = NULL; ServerSocket = -1; close(0); if (dup(pi[0]) < 0) Panic(errno, "printpipe dup"); closeallfiles(0); if (setgid(real_gid) || setuid(real_uid)) Panic(errno, "printpipe setuid"); eff_uid = real_uid; eff_gid = real_gid; #ifdef SIGPIPE xsignal(SIGPIPE, SIG_DFL); #endif execl("/bin/sh", "sh", "-c", cmd, NULL); Panic(errno, "/bin/sh"); default: break; } close(pi[0]); return pi[1]; } int readpipe(char **cmdv) { int pi[2]; if (pipe(pi)) { Msg(errno, "pipe"); return -1; } switch (fork()) { case -1: Msg(errno, "fork"); return -1; case 0: displays = NULL; ServerSocket = -1; close(1); if (dup(pi[1]) != 1) { close(pi[1]); Panic(0, "dup"); } closeallfiles(1); if (setgid(real_gid) || setuid(real_uid)) { close(1); Panic(errno, "setuid/setgid"); } eff_uid = real_uid; eff_gid = real_gid; execvp(*cmdv, cmdv); close(1); Panic(errno, "%s", *cmdv); default: break; } close(pi[1]); return pi[0]; } screen-5.0.2/etc/0000775000175000017500000000000015224432722012221 5ustar alexalexscreen-5.0.2/etc/toolcheck0000775000175000017500000000223215224432722014121 0ustar alexalex#!/bin/sh # toolcheck -- check for tools that have severe bugs. Good that all the buggy # tools identify by version numbers. This is the spirit of GNU :-) # # 24.7.95 jw. retval=0 reply="`sh -version 2>&1 < /dev/null | sed q`" case "$reply" in GNU*1.14.3*) echo "- sh is '$reply'"; echo " CAUTION: This shell has a buggy 'trap' command."; echo " The configure script may fail silently."; retval=1; ;; GNU*1.14.2*|GNU*1.14.4*|GNU*1.13.*) echo "- sh is '$reply' - good."; ;; GNU*) echo "- sh is '$reply'."; ;; *) ;; esac reply="`sed --version 2>&1 < /dev/null | sed q`" case "$reply" in GNU\ sed\ version\ 2.0[34]) echo "- sed is '$reply'"; echo " CAUTION: This sed cannot configure screen properly." retval=1; ;; GNU\ sed\ version\ 2.05|GNU\ sed\ version\ 2.03\ kevin) echo "- sed is '$reply' - good."; ;; GNU*) echo "- sed is '$reply'."; ;; *) ;; esac if [ "$retval" != 0 ]; then echo " ***********************************************************" echo " Please fix the above problem before reporting a screen bug!" echo " ***********************************************************" fi exit $retval screen-5.0.2/etc/screenrc0000664000175000017500000000716115224432722013755 0ustar alexalex# # Example of a user's .screenrc file # # no annoying audible bell, please vbell on # detach on hangup autodetach on # don't display the copyright page startup_message off # emulate .logout message pow_detach_msg "Screen session of $LOGNAME detached." # advertise hardstatus support to $TERMCAP # termcapinfo * '' 'hs:ts=\E_:fs=\E\\:ds=\E_\E\\' # make the shell in every window a login shell #shell -$SHELL # autoaka testing # shellaka '> |tcsh' # shellaka '$ |sh' # set every new windows hardstatus line to something descriptive # defhstatus "screen: ^En (^Et)" defscrollback 1000 # more convenient status messages location # status top right # don't kill window after the process died # zombie "^[" # enable support for the "alternate screen" capability in all windows # altscreen on ################ # # xterm tweaks # #xterm understands both im/ic and doesn't have a status line. #Note: Do not specify im and ic in the real termcap/info file as #some programs (e.g. vi) will not work anymore. termcap xterm hs@:cs=\E[%i%d;%dr:im=\E[4h:ei=\E[4l terminfo xterm hs@:cs=\E[%i%p1%d;%p2%dr:im=\E[4h:ei=\E[4l #80/132 column switching must be enabled for ^AW to work #change init sequence to not switch width termcapinfo xterm Z0=\E[?3h:Z1=\E[?3l:is=\E[r\E[m\E[2J\E[H\E[?7h\E[?1;4;6l # Make the output buffer large for (fast) xterms. #termcapinfo xterm* OL=10000 termcapinfo xterm* OL=100 # tell screen that xterm can switch to dark background and has function # keys. termcapinfo xterm 'VR=\E[?5h:VN=\E[?5l' termcapinfo xterm 'k1=\E[11~:k2=\E[12~:k3=\E[13~:k4=\E[14~' termcapinfo xterm 'kh=\EOH:kI=\E[2~:kD=\E[3~:kH=\EOF:kP=\E[5~:kN=\E[6~' # special xterm hardstatus: use the window title. termcapinfo xterm 'hs:ts=\E]2;:fs=\007:ds=\E]2;screen\007' #terminfo xterm 'vb=\E[?5h$<200/>\E[?5l' termcapinfo xterm 'vi=\E[?25l:ve=\E[34h\E[?25h:vs=\E[34l' # emulate part of the 'K' charset termcapinfo xterm 'XC=K%,%\E(B,[\304,\\\\\326,]\334,{\344,|\366,}\374,~\337' # xterm-52 tweaks: # - uses background color for delete operations termcapinfo xterm* be ################ # # wyse terminals # #wyse-75-42 must have flow control (xo = "terminal uses xon/xoff") #essential to have it here, as this is a slow terminal. termcapinfo wy75-42 xo:hs@ # New termcap sequences for cursor application mode. termcapinfo wy* CS=\E[?1h:CE=\E[?1l:vi=\E[?25l:ve=\E[?25h:VR=\E[?5h:VN=\E[?5l:cb=\E[1K:CD=\E[1J ################ # # other terminals # # make hp700 termcap/info better termcapinfo hp700 'Z0=\E[?3h:Z1=\E[?3l:hs:ts=\E[62"p\E[0$~\E[2$~\E[1$}:fs=\E[0}\E[61"p:ds=\E[62"p\E[1$~\E[61"p:ic@' # Extend the vt100 description by some sequences. termcap vt100* ms:AL=\E[%dL:DL=\E[%dM:UP=\E[%dA:DO=\E[%dB:LE=\E[%dD:RI=\E[%dC terminfo vt100* ms:AL=\E[%p1%dL:DL=\E[%p1%dM:UP=\E[%p1%dA:DO=\E[%p1%dB:LE=\E[%p1%dD:RI=\E[%p1%dC termcapinfo linux C8 # old rxvt versions also need this # termcapinfo rxvt C8 ################ # # keybindings # #remove some stupid / dangerous key bindings bind k bind ^k bind . bind ^\ bind \\ bind ^h bind h #make them better bind 'K' kill bind 'I' login on bind 'O' login off bind '}' history # Yet another hack: # Prepend/append register [/] to the paste if ^a^] is pressed. # This lets me have autoindent mode in vi. register [ "\033:se noai\015a" register ] "\033:se ai\015a" bind ^] paste [.] ################ # # default windows # # screen -t local 0 # screen -t mail 1 mutt # screen -t 40 2 rlogin server # caption always "%3n %t%? @%u%?%? [%h]%?%=%c" # hardstatus alwaysignore # hardstatus alwayslastline "%Lw" # bind = resize = # bind + resize +1 # bind - resize -1 # bind _ resize max # # defnonblock 1 # blankerprg rain -d 100 # idle 30 blanker screen-5.0.2/etc/newsyntax380000775000175000017500000000373515224432722014372 0ustar alexalex#! /bin/sh # # newsyntax38 -- update a screenrc file from 3.3 to 3.8 syntax # # Please bring your scripts up to syntax level 3.3 before running this script. # Please check all comments after running this script and watch out # for funny passages. # # * aka and shellaka are replaced by title and shelltitle. # # * Pairs of termcap and terminfo commands are folded into a single # termcapinfo command where possible. # # * trailing blanks are zapped. Unintentionally. # # 12.10.95, jnweiger, use at your own risk. # if [ $# != 1 ]; then echo "usage $0 screenrcfile" echo "" echo "The named file will be updated in place to the syntax of screen 3.8" echo "A backup copy will be written to .bak" exit 1; fi #Ultrix 4.2 /bin/sh does not handle "read a < $1" #Dean Gaudet exec < $1 read a if [ "$a" = "#3.8" ]; then echo "$1 already updated" exit 0 fi rm -f $1.old $1.dups cp $1 $1.old echo "#3.8" > $1 echo "# Do not remove the above line. This screen rc file was updated" >> $1 echo "# by the newsyntax script." >> $1 # termcap and terminfo lines can only be folded when there is no parameter # expansion in the codes. Parameters are denoted differently in # termcap and termcap syntax. Everything else is identical, I assume. # Thus codes not containing '%' can be safely folded. sed < $1.old > $1.dups \ -e 's/^\([ #]*\)aka/\1title/' \ -e 's/^\([ #]*\)shellaka/\1shelltitle/' \ -e 's/^\([ #]*\)termcap[ ][ ]*\([^%]*$\)/\1termcapinfo \2/' \ -e 's/^\([ #]*\)terminfo[ ][ ]*\([^%]*$\)/\1termcapinfo \2/' \ -e 's/\\/\\\\/g' # Oh, my bourne shell seems to gobble backslashes while reading. # Thus the sed above duplicates them in advance. # Hope this is not just another silly bash featurism. # It still zaps trailing blanks. I do not know why. But that is nice. exec < $1.dups while read a ; do if [ "$a" = "$b" ]; then case "$a" in *termcapinfo*) continue ;; esac fi echo "$a" >> $1 b="$a" done rm -f $1.dups screen-5.0.2/etc/newsyntax0000775000175000017500000000360315224432722014211 0ustar alexalex#!/bin/sh # # newsyntax -- update a screenrc file from 3.2 to 3.3 syntax # # please check all comments after running this script and watch out # for funny passages. # if [ $# != 1 ]; then echo "usage $0 screenrcfile" exit 1; fi #Ultrix 4.2 /bin/sh does not handle "read a < $1" #Dean Gaudet exec < $1 read a if [ ."$a" = '.#3.3' ]; then echo "$1 already updated" exit 0 fi cp $1 $1.old echo "#3.3" > $1 echo "# Do not remove the above line. This screen rc file was updated" >> $1 echo "# by the newsyntax script." >> $1 sed < $1.old >> $1 \ -e 's/\([ #]\)flow/\1defflow/g' \ -e 's/^flow/defflow/g' \ -e 's/\([ #]\)set[ ]*defflow/\1flow/g' \ -e 's/^set[ ]*defflow/flow/g' \ -e 's/\([ #]\)mode/\1defmode/g' \ -e 's/^mode/defmode/g' \ -e 's/\([ #]\)set[ ]*defmode/\1defmode/g' \ -e 's/^set[ ]*defmode/defmode/g' \ -e 's/\([ #]\)monitor/\1defmonitor/g' \ -e 's/^monitor/defmonitor/g' \ -e 's/\([ #]\)set[ ]*defmonitor/\1monitor/g' \ -e 's/^set[ ]*defmonitor/monitor/g' \ -e 's/\([ #]\)login/\1deflogin/g' \ -e 's/^login/deflogin/g' \ -e 's/\([ #]\)set[ ]*deflogin/\1login/g' \ -e 's/^set[ ]*deflogin/login/g' \ -e 's/\([ #]\)wrap/\1defwrap/g' \ -e 's/^wrap/defwrap/g' \ -e 's/\([ #]\)set[ ]*defwrap/\1wrap/g' \ -e 's/^set[ ]*defwrap/wrap/g' \ -e 's/\([ #]\)scrollback/\1defscrollback/g' \ -e 's/^scrollback/defscrollback/g' \ -e 's/\([ #]\)set[ ]*defscrollback/\1scrollback/g' \ -e 's/^set[ ]*defscrollback/scrollback/g' \ -e 's/\([ #]\)refresh/\1allPARtial/g' \ -e 's/^refresh/allPARtial/g' \ -e 's/\([ #]\)redraw/\1allPARtial/g' \ -e 's/^redraw/allPARtial/g' \ -e 's/\([ #]\)set[ ]*allPARtial/\1PARtial/g' \ -e 's/^set[ ]*allPARtial/PARtial/g' \ -e 's/\([ #]\)visualbell/\1vbell/g' \ -e 's/^visualbell/vbell/g' \ -e 's/PARtial\([ ]*\)on/partial\1off/g' \ -e 's/PARtial\([ ]*\)off/partial\1on/g' \ -e 's/allPARtial/refresh/g' \ -e 's/^set[ ]//g' screen-5.0.2/etc/mkinstalldirs0000775000175000017500000000115315224432722015027 0ustar alexalex#!/bin/sh # Make directory hierarchy. # Written by Noah Friedman # Public domain. defaultIFS=' ' IFS="${IFS-${defaultIFS}}" errstatus=0 for file in ${1+"$@"} ; do oIFS="${IFS}" # Some sh's can't handle IFS=/ for some reason. IFS='%' set - `echo ${file} | sed -e 's@/@%@g' -e 's@^%@/@'` IFS="${oIFS}" pathcomp='' for d in ${1+"$@"} ; do pathcomp="${pathcomp}${d}" if test ! -d "${pathcomp}"; then echo "mkdir $pathcomp" 1>&2 mkdir "${pathcomp}" || errstatus=$? fi pathcomp="${pathcomp}/" done done exit $errstatus # eof screen-5.0.2/etc/etcscreenrc0000664000175000017500000000635715224432722014457 0ustar alexalex# # This is an example for the global screenrc file. # You may want to install this file as /usr/local/etc/screenrc. # Check config.h for the exact location. # # Flaws of termcap and standard settings are done here. # #startup_message off #defflow on # will force screen to process ^S/^Q deflogin on #autodetach off vbell on vbell_msg " Wuff ---- Wuff!! " # all termcap entries are now duplicated as terminfo entries. # only difference should be the slightly modified syntax, and check for # terminfo entries, that are already corrected in the database. # # G0 we have a SEMI-GRAPHICS-CHARACTER-MODE # WS this sequence resizes our window. # cs this sequence changes the scrollregion # hs@ we have no hardware statusline. screen will only believe that # there is a hardware status line if hs,ts,fs,ds are all set. # ts to statusline # fs from statusline # ds delete statusline # al add one line # AL add multiple lines # dl delete one line # DL delete multiple lines # ic insert one char (space) # IC insert multiple chars # nx terminal uses xon/xoff termcap facit|vt100|xterm LP:G0 terminfo facit|vt100|xterm LP:G0 #the vt100 description does not mention "dl". *sigh* termcap vt100 dl=5\E[M terminfo vt100 dl=5\E[M #facit's "al" / "dl" are buggy if the current / last line #contain attributes... termcap facit al=\E[L\E[K:AL@:dl@:DL@:cs=\E[%i%d;%dr:ic@ terminfo facit al=\E[L\E[K:AL@:dl@:DL@:cs=\E[%i%p1%d;%p2%dr:ic@ #make sun termcap/info better termcap sun 'up=^K:AL=\E[%dL:DL=\E[%dM:UP=\E[%dA:DO=\E[%dB:LE=\E[%dD:RI=\E[%dC:IC=\E[%d@:WS=1000\E[8;%d;%dt' terminfo sun 'up=^K:AL=\E[%p1%dL:DL=\E[%p1%dM:UP=\E[%p1%dA:DO=\E[%p1%dB:LE=\E[%p1%dD:RI=\E[%p1%dC:IC=\E[%p1%d@:WS=\E[8;%p1%d;%p2%dt$<1000>' #xterm understands both im/ic and doesn't have a status line. #Note: Do not specify im and ic in the real termcap/info file as #some programs (e.g. vi) will (no,no, may (jw)) not work anymore. termcap xterm|fptwist hs@:cs=\E[%i%d;%dr:im=\E[4h:ei=\E[4l terminfo xterm|fptwist hs@:cs=\E[%i%p1%d;%p2%dr:im=\E[4h:ei=\E[4l # Long time I had this in my private screenrc file. But many people # seem to want it (jw): # we do not want the width to change to 80 characters on startup: # on suns, /etc/termcap has :is=\E[r\E[m\E[2J\E[H\E[?7h\E[?1;3;4;6l: termcap xterm 'is=\E[r\E[m\E[2J\E[H\E[?7h\E[?1;4;6l' terminfo xterm 'is=\E[r\E[m\E[2J\E[H\E[?7h\E[?1;4;6l' # # Do not use xterms alternate window buffer. # This one would not add lines to the scrollback buffer. termcap xterm|xterms|xs ti=\E7\E[?47l terminfo xterm|xterms|xs ti=\E7\E[?47l #make hp700 termcap/info better termcap hp700 'Z0=\E[?3h:Z1=\E[?3l:hs:ts=\E[62"p\E[0$~\E[2$~\E[1$}:fs=\E[0}\E[61"p:ds=\E[62"p\E[1$~\E[61"p:ic@' terminfo hp700 'Z0=\E[?3h:Z1=\E[?3l:hs:ts=\E[62"p\E[0$~\E[2$~\E[1$}:fs=\E[0}\E[61"p:ds=\E[62"p\E[1$~\E[61"p:ic@' #wyse-75-42 must have defflow control (xo = "terminal uses xon/xoff") #(nowadays: nx = padding doesn't work, have to use xon/off) #essential to have it here, as this is a slow terminal. termcap wy75-42 nx:xo:Z0=\E[?3h\E[31h:Z1=\E[?3l\E[31h terminfo wy75-42 nx:xo:Z0=\E[?3h\E[31h:Z1=\E[?3l\E[31h #remove some stupid / dangerous key bindings bind ^k #bind L bind ^\ #make them better bind \\ quit bind K kill bind I login on bind O login off bind } history screen-5.0.2/etc/countmail0000775000175000017500000000255215224432722014146 0ustar alexalex#!/usr/bin/perl sub countmsgs { return -1 unless open(M, "<$mbox"); my $inhdr = 0; my $cl = undef; my $msgread = 0; my $count = 0; while() { if (!$inhdr && /^From\s+\S+\s+(?i:sun|mon|tue|wed|thu|fri|sat)\s+(?i:jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec)\s+\d+\s/) { $inhdr = 1; $msgread = 0; undef $cl; next; } if ($inhdr) { if (/^content-length:\s+(\d+)/i) { $cl = 0+$1; next; } if (/^status:\s+(\S)/i) { $msgread = 1 unless $1 eq 'N' || $1 eq 'U'; next; } if ($_ eq "\n") { $count++ if !$msgread; seek(M, $cl, 1) if defined $cl; $inhdr = 0; } } } close M; return $count; } $| = 1; $mbox = $ARGV[0] || $ENV{'MAIL'}; $oldfmt = $ARGV[1] || "%4d "; $newfmt = $ARGV[2] || "\005{Rk}%4d \005{-}"; @oldstat = stat($mbox); if (!@oldstat) { print "\005{Rk} ??? \005{-}\n"; exit 1; } $oldcount = 0; while(1) { $count = countmsgs($mbox); if ($count == -1) { print "\005{Rk} ??? \005{-}\n"; } elsif ($count < $oldcount || $count == 0) { printf "$oldfmt\n", $count; } else { printf "$newfmt\n", $count; } $oldcount = $count; while (1) { @newstat = stat($mbox); if (!@newstat) { print "\005{Rk} ??? \005{-}\n"; exit 1; } last if $newstat[7] != $oldstat[7] || $newstat[9] != $oldstat[9]; sleep 1; } @oldstat = @newstat; } screen-5.0.2/etc/completer.zsh0000664000175000017500000000722115224432722014743 0ustar alexalex#compdef screen #Generated by # help2simple.pl -c screen -p -f # simple2long.xsl # args.xsl # For details see: # http://www.geocities.com/f_rosencrantz/xml_completion.htm local context state line typeset -A opt_args _arguments \ "-a[Force all capabilities into each window's termcap.]" \ '-A:Adapt all windows to the new display width & height.' \ "-c:Read configuration file instead of '.screenrc'.:_files -/" \ '-d:Detach the elsewhere running screen (with -r: reattach here).:->sessionname' \ '-dmS:Start as daemon: Screen session in detached mode.' \ '-D:Detach and logout remote (with -r: reattach here).' \ '-e:Change command characters.' \ '-f-:Flow control on, -fn = off, -fa = auto.:((n\:Flow\ control\ off a\:Flow\ control\ auto))' \ '-h:Set the size of the scrollback history buffer.' \ '-i[Interrupt output sooner when flow control is on.]' \ '-l[Login mode on (update /var/run/utmp), -ln = off.]' \ '-list[Do nothing, just list our SocketDir.]' \ '-ls[Do nothing, just list our SocketDir.]' \ "-L[Terminal's last character can be safely updated.]" \ '-m[ignore $STY variable, do create a new screen session.]' \ '-O[Choose optimal output rather than exact vt100 emulation.]' \ '-p:Preselect the named window if it exists.' \ '-q[Quiet startup. Exits with non-zero return code if unsuccessful.]' \ '-r[Reattach to a detached screen process.]:Handling Tag sessionname:->sessionname' \ '-R[Reattach if possible, otherwise start a new session.]' \ '-s:Shell to execute rather than $SHELL.' \ '-S:Name this session .sockname instead of ...' \ "-t:Set title. (window's name)." \ '-T:Use term as $TERM for windows, rather than "screen".' \ '-U[Tell screen to use UTF-8 encoding.]' \ '-v[Print "Screen version 3.09.11beta (FAU) 11-Oct-01".]' \ '-wipe[Do nothing, just clean up SocketDir.]' \ '-x[Attach to a not detached screen. (Multi display mode).]' \ '-X[Execute as a screen command in the specified session.]:Handling Tag screencmd:( acladd addacl aclchg acldel aclgrp aclumask activity allpartial at attrcolor autodetach autonuke bce bell_msg bind bindkey break breaktype bufferfile c1 caption charset chdir clear colon command compacthist console copy copy_reg crlf debug defc1 defautonuke defbce defbreaktype defcharset defescape defflow defgr defhstatus defkanji deflogin defmode defmonitor defobuflimit defscrollback defshell defsilence defslowpaste defutf8 defwrap defwritelock detach dinfo displays digraph dumptermcap echo escape exec fit flow focus gr hardcopy hardcopy_append hardcopydir hardstatus height help history hstatus info ins_reg kill lastmsg license lockscreen log logfile login logtstamp mapdefault mapnotnext maptimeout markkeys meta monitor msgminwait msgwait multiuser next nonblock number obu! ! flimit only other partial password paste pastefont pow_break pow_detach pow_detach_msg prev printcmd process quit readbuf readreg redisplay register remove removebuf reset resize screen scrollback select sessionname setenv shell shelltitle silence silencewait sleep slowpaste sorendition split startup_message stuff su term termcap terminfo termcapinfo time title unsetenv utf8 vbell vbell_msg vbellwait verbose version wall width windows wrap writebuf writelock xoff xon zombie)' case $state in "sessionname") # Complete folder names. local screendir screendir=(`screen -ls | grep Socket | sed -n -e 's/\.$//' -e '$p' | awk '{print $NF;}'`) _wanted files expl 'screen process' _path_files -W screendir ;; esac screen-5.0.2/etc/ccdefs0000775000175000017500000000143715224432722013403 0ustar alexalex#!/bin/sh cd /tmp umask 022 CC=cc CPP=cpp PATH="$PATH:/lib" TEMP=def$$ trap 'rm -f ${TEMP}*; trap 0; exit' 0 1 2 3 15 set `type $CC` q=$# set x `type $CC` shift $q cc=$1 set `type $CPP` q=$# set x `type $CPP` shift $q cpp=$1 strings - "$cc" 2>/dev/null | tr ' ' '\012' > ${TEMP}.x if test -x "$cpp"; then strings - "$cpp" 2>/dev/null | tr ' ' '\012' >> ${TEMP}.x else echo "Warning: cpp not found." fi sort < ${TEMP}.x | uniq | awk ' /^-D[A-Za-z_][A-Za-z_0-9]*$/ { printf("#ifdef %s\n", substr($0,3)) printf("\"%s\": %s\n", substr($0,3), substr($0,3)) print "#endif" } /^[A-Za-z_][A-Za-z_0-9]*$/ { printf("#ifdef %s\n", $0) printf("\"%s\": %s\n", $0, $0) print "#endif" } ' > ${TEMP}.c echo "Defines in cc are:" cc -E ${TEMP}.c | sed -n -e 's/"\([^:]*\)":/\1:/p' | sort | uniq screen-5.0.2/encoding.h0000664000175000017500000000176415224432722013415 0ustar alexalex#ifndef SCREEN_ENCODING_H #define SCREEN_ENCODING_H #include "window.h" void InitBuiltinTabs (void); struct mchar *recode_mchar (struct mchar *, int, int); struct mline *recode_mline (struct mline *, int, int, int); int FromUtf8 (int, int *); void AddUtf8 (uint32_t); size_t ToUtf8 (char *, uint32_t); size_t ToUtf8_comb (char *, uint32_t); bool utf8_isdouble (uint32_t); bool utf8_iscomb (uint32_t); void utf8_handle_comb (unsigned int, struct mchar *); int ContainsSpecialDeffont (struct mline *, int, int, int); int LoadFontTranslation (int, char *); void LoadFontTranslationsForEncoding (int); void WinSwitchEncoding (Window *, int); int FindEncoding (char *); char *EncodingName (int); int EncodingDefFont (int); void ResetEncoding (Window *); int CanEncodeFont (int, int); int DecodeChar (int, int, int *); int RecodeBuf (unsigned char *, int, int, int, unsigned char *); int PrepareEncodedChar (int); int EncodeChar (char *, int, int, int *); #endif /* SCREEN_ENCODING_H */ screen-5.0.2/encoding.c0000664000175000017500000010542315224432722013405 0ustar alexalex/* Copyright (c) 1993-2003 * Juergen Weigert (jnweiger@immd4.informatik.uni-erlangen.de) * Michael Schroeder (mlschroe@immd4.informatik.uni-erlangen.de) * Copyright (c) 1987 Oliver Laumann * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3, or (at your option) * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program (see the file COPYING); if not, see * https://www.gnu.org/licenses/, or contact Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02111-1301 USA * **************************************************************** */ #include "config.h" #include "encoding.h" #include #include #include #include "screen.h" #include "fileio.h" #include "misc.h" static int encmatch(char *, char *); static int recode_char(int, int, int); static int recode_char_to_encoding(int, int); static void comb_tofront(int); static int recode_char_dw(int, int *, int, int); static int recode_char_dw_to_encoding(int, int *, int); struct encoding { char *name; char *charsets; int deffont; int usegr; int noc1; char *fontlist; }; /* big5 font: ^X */ /* KOI8-R font: 96 ! */ /* KOI8-U font: 96 # */ /* CP1251 font: 96 ? */ struct encoding encodings[] = { {"C", NULL, 0, 0, 0, NULL}, {"eucJP", "B\002I\00401", 0, 1, 0, "\002\004I"}, {"SJIS", "BIBB01", 0, 1, 1, "\002I"}, {"eucKR", "B\003BB01", 0, 1, 0, "\003"}, {"eucCN", "B\001BB01", 0, 1, 0, "\001"}, {"Big5", "B\030BB01", 0, 1, 0, "\030"}, {"KOI8-R", NULL, 0x80 | '!', 0, 1, NULL}, {"CP1251", NULL, 0x80 | '?', 0, 1, NULL}, {"UTF-8", NULL, -1, 0, 0, NULL}, {"ISO8859-2", NULL, 0x80 | 'B', 0, 0, NULL}, {"ISO8859-3", NULL, 0x80 | 'C', 0, 0, NULL}, {"ISO8859-4", NULL, 0x80 | 'D', 0, 0, NULL}, {"ISO8859-5", NULL, 0x80 | 'L', 0, 0, NULL}, {"ISO8859-6", NULL, 0x80 | 'G', 0, 0, NULL}, {"ISO8859-7", NULL, 0x80 | 'F', 0, 0, NULL}, {"ISO8859-8", NULL, 0x80 | 'H', 0, 0, NULL}, {"ISO8859-9", NULL, 0x80 | 'M', 0, 0, NULL}, {"ISO8859-10", NULL, 0x80 | 'V', 0, 0, NULL}, {"ISO8859-15", NULL, 0x80 | 'b', 0, 0, NULL}, {"jis", NULL, 0, 0, 0, "\002\004I"}, {"GBK", "B\031BB01", 0x80 | 'b', 1, 1, "\031"}, {"KOI8-U", NULL, 0x80 | '#', 0, 1, NULL} }; static unsigned short builtin_tabs[][2] = { {0x30, 0}, /* 0: special graphics (line drawing) */ {0x005f, 0x25AE}, {0x0060, 0x25C6}, {0x0061, 0x2592}, {0x0062, 0x2409}, {0x0063, 0x240C}, {0x0064, 0x240D}, {0x0065, 0x240A}, {0x0066, 0x00B0}, {0x0067, 0x00B1}, {0x0068, 0x2424}, {0x0069, 0x240B}, {0x006a, 0x2518}, {0x006b, 0x2510}, {0x006c, 0x250C}, {0x006d, 0x2514}, {0x006e, 0x253C}, {0x006f, 0x23BA}, {0x0070, 0x23BB}, {0x0071, 0x2500}, {0x0072, 0x23BC}, {0x0073, 0x23BD}, {0x0074, 0x251C}, {0x0075, 0x2524}, {0x0076, 0x2534}, {0x0077, 0x252C}, {0x0078, 0x2502}, {0x0079, 0x2264}, {0x007a, 0x2265}, {0x007b, 0x03C0}, {0x007c, 0x2260}, {0x007d, 0x00A3}, {0x007e, 0x00B7}, {0, 0}, {0x34, 0}, /* 4: Dutch */ {0x0023, 0x00a3}, {0x0040, 0x00be}, {0x005b, 0x00ff}, {0x005c, 0x00bd}, {0x005d, 0x007c}, {0x007b, 0x00a8}, {0x007c, 0x0066}, {0x007d, 0x00bc}, {0x007e, 0x00b4}, {0, 0}, {0x35, 0}, /* 5: Finnish */ {0x005b, 0x00c4}, {0x005c, 0x00d6}, {0x005d, 0x00c5}, {0x005e, 0x00dc}, {0x0060, 0x00e9}, {0x007b, 0x00e4}, {0x007c, 0x00f6}, {0x007d, 0x00e5}, {0x007e, 0x00fc}, {0, 0}, {0x36, 0}, /* 6: Norwegian/Danish */ {0x0040, 0x00c4}, {0x005b, 0x00c6}, {0x005c, 0x00d8}, {0x005d, 0x00c5}, {0x005e, 0x00dc}, {0x0060, 0x00e4}, {0x007b, 0x00e6}, {0x007c, 0x00f8}, {0x007d, 0x00e5}, {0x007e, 0x00fc}, {0, 0}, {0x37, 0}, /* 7: Swedish */ {0x0040, 0x00c9}, {0x005b, 0x00c4}, {0x005c, 0x00d6}, {0x005d, 0x00c5}, {0x005e, 0x00dc}, {0x0060, 0x00e9}, {0x007b, 0x00e4}, {0x007c, 0x00f6}, {0x007d, 0x00e5}, {0x007e, 0x00fc}, {0, 0}, {0x3d, 0}, /* =: Swiss */ {0x0023, 0x00f9}, {0x0040, 0x00e0}, {0x005b, 0x00e9}, {0x005c, 0x00e7}, {0x005d, 0x00ea}, {0x005e, 0x00ee}, {0x005f, 0x00e8}, {0x0060, 0x00f4}, {0x007b, 0x00e4}, {0x007c, 0x00f6}, {0x007d, 0x00fc}, {0x007e, 0x00fb}, {0, 0}, {0x41, 0}, /* A: UK */ {0x0023, 0x00a3}, {0, 0}, {0x4b, 0}, /* K: German */ {0x0040, 0x00a7}, {0x005b, 0x00c4}, {0x005c, 0x00d6}, {0x005d, 0x00dc}, {0x007b, 0x00e4}, {0x007c, 0x00f6}, {0x007d, 0x00fc}, {0x007e, 0x00df}, {0, 0}, {0x51, 0}, /* Q: French Canadian */ {0x0040, 0x00e0}, {0x005b, 0x00e2}, {0x005c, 0x00e7}, {0x005d, 0x00ea}, {0x005e, 0x00ee}, {0x0060, 0x00f4}, {0x007b, 0x00e9}, {0x007c, 0x00f9}, {0x007d, 0x00e8}, {0x007e, 0x00fb}, {0, 0}, {0x52, 0}, /* R: French */ {0x0023, 0x00a3}, {0x0040, 0x00e0}, {0x005b, 0x00b0}, {0x005c, 0x00e7}, {0x005d, 0x00a7}, {0x007b, 0x00e9}, {0x007c, 0x00f9}, {0x007d, 0x00e8}, {0x007e, 0x00a8}, {0, 0}, {0x59, 0}, /* Y: Italian */ {0x0023, 0x00a3}, {0x0040, 0x00a7}, {0x005b, 0x00b0}, {0x005c, 0x00e7}, {0x005d, 0x00e9}, {0x0060, 0x00f9}, {0x007b, 0x00e0}, {0x007c, 0x00f2}, {0x007d, 0x00e8}, {0x007e, 0x00ec}, {0, 0}, {0x5a, 0}, /* Z: Spanish */ {0x0023, 0x00a3}, {0x0040, 0x00a7}, {0x005b, 0x00a1}, {0x005c, 0x00d1}, {0x005d, 0x00bf}, {0x007b, 0x00b0}, {0x007c, 0x00f1}, {0x007d, 0x00e7}, {0, 0}, {0xe2, 0}, /* 96-b: ISO-8859-15 */ {0x00a4, 0x20ac}, {0x00a6, 0x0160}, {0x00a8, 0x0161}, {0x00b4, 0x017D}, {0x00b8, 0x017E}, {0x00bc, 0x0152}, {0x00bd, 0x0153}, {0x00be, 0x0178}, {0, 0}, {0x4a, 0}, /* J: JIS 0201 Roman */ {0x005c, 0x00a5}, {0x007e, 0x203e}, {0, 0}, {0x49, 0}, /* I: halfwidth katakana */ {0x0021, 0xff61}, {0x005f | 0x8000, 0xff9f}, {0, 0}, {0, 0} }; struct recodetab { unsigned short (*tab)[2]; int flags; }; #define RECODETAB_ALLOCED 1 #define RECODETAB_BUILTIN 2 #define RECODETAB_TRIED 4 static struct recodetab recodetabs[256]; void InitBuiltinTabs(void) { unsigned short (*p)[2]; for (p = builtin_tabs; (*p)[0]; p++) { recodetabs[(*p)[0]].flags = RECODETAB_BUILTIN; recodetabs[(*p)[0]].tab = p + 1; p++; while ((*p)[0]) p++; } } static int recode_char(int c, int to_utf, int font) { int f; unsigned short (*p)[2]; if (to_utf) { if (c < 256) return c; f = (c >> 8) & 0xff; c &= 0xff; /* map aliases to keep the table small */ switch (f) { case 'C': f ^= ('C' ^ '5'); break; case 'E': f ^= ('E' ^ '6'); break; case 'H': f ^= ('H' ^ '7'); break; default: break; } p = recodetabs[f].tab; if (p == NULL && recodetabs[f].flags == 0) { LoadFontTranslation(f, NULL); p = recodetabs[f].tab; } if (p) for (; (*p)[0]; p++) { if ((p[0][0] & 0x8000) && (c <= (p[0][0] & 0x7fff)) && c >= p[-1][0]) return c - p[-1][0] + p[-1][1]; if ((*p)[0] == c) return (*p)[1]; } return c & 0xff; /* map to latin1 */ } if (font == -1) { if (c < 256) return c; /* latin1 */ for (font = 32; font < 128; font++) { p = recodetabs[font].tab; if (p) for (; (*p)[1]; p++) { if ((p[0][0] & 0x8000) && c <= p[0][1] && c >= p[-1][1]) return (c - p[-1][1] + p[-1][0]) | (font << 8); if ((*p)[1] == c) return (*p)[0] | (font << 8); } } return '?'; } if (c < 128 && (font & 128) != 0) return c; if (font >= 32) { p = recodetabs[font].tab; if (p == NULL && recodetabs[font].flags == 0) { LoadFontTranslation(font, NULL); p = recodetabs[font].tab; } if (p) for (; (*p)[1]; p++) { if ((p[0][0] & 0x8000) && c <= p[0][1] && c >= p[-1][1]) return (c - p[-1][1] + p[-1][0]) | (font & 128 ? 0 : font << 8); if ((*p)[1] == c) return (*p)[0] | (font & 128 ? 0 : font << 8); } } return -1; } static int recode_char_dw(int c, int *c2p, int to_utf, int font) { int f; unsigned short (*p)[2]; if (to_utf) { f = (c >> 8) & 0xff; c = (c & 255) << 8 | (*c2p & 255); *c2p = 0xffff; p = recodetabs[f].tab; if (p == NULL && recodetabs[f].flags == 0) { LoadFontTranslation(f, NULL); p = recodetabs[f].tab; } if (p) for (; (*p)[0]; p++) if ((*p)[0] == c) { if (!utf8_isdouble((*p)[1])) *c2p = ' '; return (*p)[1]; } return UCS_REPL_DW; } if (font == -1) { for (font = 0; font < 030; font++) { p = recodetabs[font].tab; if (p) for (; (*p)[1]; p++) if ((*p)[1] == c) { *c2p = ((*p)[0] & 255) | font << 8 | 0x8000; return ((*p)[0] >> 8) | font << 8; } } *c2p = '?'; return '?'; } if (font < 32) { p = recodetabs[font].tab; if (p == NULL && recodetabs[font].flags == 0) { LoadFontTranslation(font, NULL); p = recodetabs[font].tab; } if (p) for (; (*p)[1]; p++) if ((*p)[1] == c) { *c2p = ((*p)[0] & 255) | font << 8 | 0x8000; return ((*p)[0] >> 8) | font << 8; } } return -1; } static int recode_char_to_encoding(int c, int encoding) { char *fp; int x; if (encoding == UTF8) return recode_char(c, 1, -1); if ((fp = encodings[encoding].fontlist) != NULL) while (*fp) if ((x = recode_char(c, 0, (unsigned char)*fp++)) != -1) return x; if (encodings[encoding].deffont) if ((x = recode_char(c, 0, encodings[encoding].deffont)) != -1) return x; return recode_char(c, 0, -1); } static int recode_char_dw_to_encoding(int c, int *c2p, int encoding) { char *fp; int x; if (encoding == UTF8) return recode_char_dw(c, c2p, 1, -1); if ((fp = encodings[encoding].fontlist) != NULL) while (*fp) if ((x = recode_char_dw(c, c2p, 0, (unsigned char)*fp++)) != -1) return x; if (encodings[encoding].deffont) if ((x = recode_char_dw(c, c2p, 0, encodings[encoding].deffont)) != -1) return x; return recode_char_dw(c, c2p, 0, -1); } struct mchar *recode_mchar(struct mchar *mc, int from, int to) { static struct mchar rmc; int c; if (from == to || (from != UTF8 && to != UTF8)) return mc; rmc = *mc; if (rmc.font == 0 && from != UTF8) rmc.font = encodings[from].deffont; if (rmc.font == 0) /* latin1 is the same in unicode */ return mc; c = rmc.image | (rmc.font << 8); if (rmc.mbcs) { int c2 = rmc.mbcs; c = recode_char_dw_to_encoding(c, &c2, to); rmc.mbcs = c2; } else c = recode_char_to_encoding(c, to); rmc.image = c & 255; rmc.font = c >> 8 & 255; return &rmc; } struct mline *recode_mline(struct mline *ml, int w, int from, int to) { static int maxlen; static int last; static struct mline rml[2], *rl; int i, c; if (from == to || (from != UTF8 && to != UTF8) || w == 0) return ml; if (ml->font == null && encodings[from].deffont == 0) return ml; if (w > maxlen) { for (i = 0; i < 2; i++) { if (rml[i].image == NULL) rml[i].image = malloc(w * 4); else rml[i].image = realloc(rml[i].image, w * 4); if (rml[i].font == NULL) rml[i].font = malloc(w * 4); else rml[i].font = realloc(rml[i].font, w * 4); if (rml[i].image == NULL || rml[i].font == NULL) { maxlen = 0; return ml; /* sorry */ } } maxlen = w; } rl = rml + last; rl->attr = ml->attr; rl->colorbg = ml->colorbg; rl->colorfg = ml->colorfg; for (i = 0; i < w; i++) { c = ml->image[i] | (ml->font[i] << 8); if (from != UTF8 && c < 256) c |= encodings[from].deffont << 8; if ((from != UTF8 && (c & 0x1f00) != 0 && (c & 0xe000) == 0) || (from == UTF8 && utf8_isdouble(c))) { if (i + 1 == w) c = '?'; else { int c2; i++; c2 = ml->image[i] | (ml->font[i] << 8); c = recode_char_dw_to_encoding(c, &c2, to); rl->font[i - 1] = c >> 8 & 255; rl->image[i - 1] = c & 255; c = c2; } } else c = recode_char_to_encoding(c, to); rl->image[i] = c & 255; rl->font[i] = c >> 8 & 255; } last ^= 1; return rl; } struct combchar { unsigned int c1; unsigned int c2; unsigned int next; unsigned int prev; }; struct combchar **combchars; void AddUtf8(uint32_t c) { if (c >= 0xd800 && c < 0xe000 && combchars && combchars[c - 0xd800]) { AddUtf8(combchars[c - 0xd800]->c1); c = combchars[c - 0xd800]->c2; } if (c >= 0x10000) { AddChar((c & 0x1fc0000) >> 18 ^ 0xf0); c = (c & 0x3ffff) ^ ((0xe0 ^ 0x80) << 12); } if (c >= 0x800) { AddChar((c & 0x7f000) >> 12 ^ 0xe0); c = (c & 0x0fff) ^ ((0xc0 ^ 0x80) << 6); } if (c >= 0x80) { AddChar((c & 0x1fc0) >> 6 ^ 0xc0); c = (c & 0x3f) | 0x80; } AddChar(c); } size_t ToUtf8_comb(char *p, uint32_t c) { int l; if (c >= 0xd800 && c < 0xe000 && combchars && combchars[c - 0xd800]) { l = ToUtf8_comb(p, combchars[c - 0xd800]->c1); return l + ToUtf8(p ? p + l : NULL, combchars[c - 0xd800]->c2); } return ToUtf8(p, c); } size_t ToUtf8(char *p, uint32_t c) { int l = 1; if (c >= 0x10000) { if (p) *p++ = (c & 0x1fc0000) >> 18 ^ 0xf0; l++; c = (c & 0x3ffff) ^ ((0xe0 ^ 0x80) << 12); } if (c >= 0x800) { if (p) *p++ = (c & 0x7f000) >> 12 ^ 0xe0; l++; c = (c & 0x0fff) | 0x1000; } if (c >= 0x80) { if (p) *p++ = (c & 0x1fc0) >> 6 ^ 0xc0; l++; c = (c & 0x3f) | 0x80; } if (p) *p++ = c; return l; } /* * returns: * -1: need more bytes, sequence not finished * -2: corrupt sequence found, redo last char * >= 0: decoded character */ int FromUtf8(int c, int *utf8charp) { int utf8char = *utf8charp; if (utf8char) { if ((c & 0xc0) != 0x80) { *utf8charp = 0; return -2; /* corrupt sequence! */ } else c = (c & 0x3f) | (utf8char << 6); if (!(utf8char & 0x40000000)) { /* check for overlong sequences */ if ((c & 0x820823e0) == 0x80000000) c = 0xfdffffff; else if ((c & 0x020821f0) == 0x02000000) c = 0xfff7ffff; else if ((c & 0x000820f8) == 0x00080000) c = 0xffffd000; else if ((c & 0x0000207c) == 0x00002000) c = 0xffffff70; } } else { /* new sequence */ if (c >= 0xfe) c = UCS_REPL; else if (c >= 0xfc) c = (c & 0x01) | 0xbffffffc; /* 5 bytes to follow */ else if (c >= 0xf8) c = (c & 0x03) | 0xbfffff00; /* 4 */ else if (c >= 0xf0) c = (c & 0x07) | 0xbfffc000; /* 3 */ else if (c >= 0xe0) c = (c & 0x0f) | 0xbff00000; /* 2 */ else if (c >= 0xc2) c = (c & 0x1f) | 0xfc000000; /* 1 */ else if (c >= 0xc0) c = 0xfdffffff; /* overlong */ else if (c >= 0x80) c = UCS_REPL; } *utf8charp = utf8char = (c & 0x80000000) ? c : 0; if (utf8char) return -1; if (c & 0xff800000) c = UCS_REPL; /* valid Unicode has 21 bits */ if (c >= 0xd800 && (c <= 0xdfff || c == 0xfffe || c == 0xffff)) c = UCS_REPL; /* illegal code */ return c; } void WinSwitchEncoding(Window *p, int encoding) { int i, j, c; struct mline *ml; Display *d; Canvas *cv; Layer *oldflayer; if ((p->w_encoding == UTF8) == (encoding == UTF8)) { p->w_encoding = encoding; return; } oldflayer = flayer; for (d = displays; d; d = d->d_next) for (cv = d->d_cvlist; cv; cv = cv->c_next) if (p == Layer2Window(cv->c_layer)) { flayer = cv->c_layer; while (flayer->l_next) { if (oldflayer == flayer) oldflayer = flayer->l_next; ExitOverlayPage(); } } flayer = oldflayer; for (j = 0; j < p->w_height + p->w_histheight; j++) { ml = j < p->w_height ? &p->w_mlines[j] : &p->w_hlines[j - p->w_height]; if (ml->font == null && encodings[p->w_encoding].deffont == 0) continue; for (i = 0; i < p->w_width; i++) { c = ml->image[i] | (ml->font[i] << 8); if (p->w_encoding != UTF8 && c < 256) c |= encodings[p->w_encoding].deffont << 8; if (c < 256) continue; if (ml->font == null) { if ((ml->font = calloc(p->w_width + 1, 4)) == NULL) { ml->font = null; break; } } if ((p->w_encoding != UTF8 && (c & 0x1f00) != 0 && (c & 0xe000) == 0) || (p->w_encoding == UTF8 && utf8_isdouble(c))) { if (i + 1 == p->w_width) c = '?'; else { int c2; i++; c2 = ml->image[i] | (ml->font[i] << 8); c = recode_char_dw_to_encoding(c, &c2, encoding); ml->font[i - 1] = c >> 8 & 255; ml->image[i - 1] = c & 255; c = c2; } } else c = recode_char_to_encoding(c, encoding); ml->image[i] = c & 255; ml->font[i] = c >> 8 & 255; } } p->w_encoding = encoding; return; } struct interval { uint32_t first; uint32_t last; }; /* auxiliary function for binary search in interval table */ static bool bisearch(const uint32_t ucs, const struct interval *table, const size_t size) { size_t min = 0; size_t max = size; if (ucs < table[0].first || ucs > table[max].last) return 0; while (max >= min) { size_t mid = (min + max) / 2; if (ucs > table[mid].last) min = mid + 1; else if (ucs < table[mid].first) max = mid - 1; else return 1; } return 0; } bool utf8_isdouble(uint32_t c) { /* A sorted list of intervals of ambiguous width characters generated by * https://github.com/GNOME/glib/blob/glib-2-50/glib/gen-unicode-tables.pl */ static const struct interval ambiguous[] = { {0x00A1, 0x00A1}, {0x00A4, 0x00A4}, {0x00A7, 0x00A8}, {0x00AA, 0x00AA}, {0x00AD, 0x00AE}, {0x00B0, 0x00B4}, {0x00B6, 0x00BA}, {0x00BC, 0x00BF}, {0x00C6, 0x00C6}, {0x00D0, 0x00D0}, {0x00D7, 0x00D8}, {0x00DE, 0x00E1}, {0x00E6, 0x00E6}, {0x00E8, 0x00EA}, {0x00EC, 0x00ED}, {0x00F0, 0x00F0}, {0x00F2, 0x00F3}, {0x00F7, 0x00FA}, {0x00FC, 0x00FC}, {0x00FE, 0x00FE}, {0x0101, 0x0101}, {0x0111, 0x0111}, {0x0113, 0x0113}, {0x011B, 0x011B}, {0x0126, 0x0127}, {0x012B, 0x012B}, {0x0131, 0x0133}, {0x0138, 0x0138}, {0x013F, 0x0142}, {0x0144, 0x0144}, {0x0148, 0x014B}, {0x014D, 0x014D}, {0x0152, 0x0153}, {0x0166, 0x0167}, {0x016B, 0x016B}, {0x01CE, 0x01CE}, {0x01D0, 0x01D0}, {0x01D2, 0x01D2}, {0x01D4, 0x01D4}, {0x01D6, 0x01D6}, {0x01D8, 0x01D8}, {0x01DA, 0x01DA}, {0x01DC, 0x01DC}, {0x0251, 0x0251}, {0x0261, 0x0261}, {0x02C4, 0x02C4}, {0x02C7, 0x02C7}, {0x02C9, 0x02CB}, {0x02CD, 0x02CD}, {0x02D0, 0x02D0}, {0x02D8, 0x02DB}, {0x02DD, 0x02DD}, {0x02DF, 0x02DF}, {0x0300, 0x036F}, {0x0391, 0x03A1}, {0x03A3, 0x03A9}, {0x03B1, 0x03C1}, {0x03C3, 0x03C9}, {0x0401, 0x0401}, {0x0410, 0x044F}, {0x0451, 0x0451}, {0x2010, 0x2010}, {0x2013, 0x2016}, {0x2018, 0x2019}, {0x201C, 0x201D}, {0x2020, 0x2022}, {0x2024, 0x2027}, {0x2030, 0x2030}, {0x2032, 0x2033}, {0x2035, 0x2035}, {0x203B, 0x203B}, {0x203E, 0x203E}, {0x2074, 0x2074}, {0x207F, 0x207F}, {0x2081, 0x2084}, {0x20AC, 0x20AC}, {0x2103, 0x2103}, {0x2105, 0x2105}, {0x2109, 0x2109}, {0x2113, 0x2113}, {0x2116, 0x2116}, {0x2121, 0x2122}, {0x2126, 0x2126}, {0x212B, 0x212B}, {0x2153, 0x2154}, {0x215B, 0x215E}, {0x2160, 0x216B}, {0x2170, 0x2179}, {0x2189, 0x2189}, {0x2190, 0x2199}, {0x21B8, 0x21B9}, {0x21D2, 0x21D2}, {0x21D4, 0x21D4}, {0x21E7, 0x21E7}, {0x2200, 0x2200}, {0x2202, 0x2203}, {0x2207, 0x2208}, {0x220B, 0x220B}, {0x220F, 0x220F}, {0x2211, 0x2211}, {0x2215, 0x2215}, {0x221A, 0x221A}, {0x221D, 0x2220}, {0x2223, 0x2223}, {0x2225, 0x2225}, {0x2227, 0x222C}, {0x222E, 0x222E}, {0x2234, 0x2237}, {0x223C, 0x223D}, {0x2248, 0x2248}, {0x224C, 0x224C}, {0x2252, 0x2252}, {0x2260, 0x2261}, {0x2264, 0x2267}, {0x226A, 0x226B}, {0x226E, 0x226F}, {0x2282, 0x2283}, {0x2286, 0x2287}, {0x2295, 0x2295}, {0x2299, 0x2299}, {0x22A5, 0x22A5}, {0x22BF, 0x22BF}, {0x2312, 0x2312}, {0x2460, 0x24E9}, {0x24EB, 0x254B}, {0x2550, 0x2573}, {0x2580, 0x258F}, {0x2592, 0x2595}, {0x25A0, 0x25A1}, {0x25A3, 0x25A9}, {0x25B2, 0x25B3}, {0x25B6, 0x25B7}, {0x25BC, 0x25BD}, {0x25C0, 0x25C1}, {0x25C6, 0x25C8}, {0x25CB, 0x25CB}, {0x25CE, 0x25D1}, {0x25E2, 0x25E5}, {0x25EF, 0x25EF}, {0x2605, 0x2606}, {0x2609, 0x2609}, {0x260E, 0x260F}, {0x261C, 0x261C}, {0x261E, 0x261E}, {0x2640, 0x2640}, {0x2642, 0x2642}, {0x2660, 0x2661}, {0x2663, 0x2665}, {0x2667, 0x266A}, {0x266C, 0x266D}, {0x266F, 0x266F}, {0x269E, 0x269F}, {0x26BF, 0x26BF}, {0x26C6, 0x26CD}, {0x26CF, 0x26D3}, {0x26D5, 0x26E1}, {0x26E3, 0x26E3}, {0x26E8, 0x26E9}, {0x26EB, 0x26F1}, {0x26F4, 0x26F4}, {0x26F6, 0x26F9}, {0x26FB, 0x26FC}, {0x26FE, 0x26FF}, {0x273D, 0x273D}, {0x2776, 0x277F}, {0x2B56, 0x2B59}, {0x3248, 0x324F}, {0xE000, 0xF8FF}, {0xFE00, 0xFE0F}, {0xFFFD, 0xFFFD}, {0x1F100, 0x1F10A}, {0x1F110, 0x1F12D}, {0x1F130, 0x1F169}, {0x1F170, 0x1F18D}, {0x1F18F, 0x1F190}, {0x1F19B, 0x1F1AC}, {0xE0100, 0xE01EF}, {0xF0000, 0xFFFFD}, {0x100000, 0x10FFFD}, }; if (c >= 0xdf00 && c <= 0xdfff) return 1; /* dw combining sequence */ return (wcwidth(c) == 2 || (cjkwidth && bisearch(c, ambiguous, ARRAY_SIZE(ambiguous) - 1))); } bool utf8_iscomb(uint32_t c) { /* taken from Markus Kuhn's wcwidth */ static const struct interval combining[] = { {0x0300, 0x036F}, {0x0483, 0x0486}, {0x0488, 0x0489}, {0x0591, 0x05BD}, {0x05BF, 0x05BF}, {0x05C1, 0x05C2}, {0x05C4, 0x05C5}, {0x05C7, 0x05C7}, {0x0600, 0x0603}, {0x0610, 0x0615}, {0x064B, 0x065E}, {0x0670, 0x0670}, {0x06D6, 0x06E4}, {0x06E7, 0x06E8}, {0x06EA, 0x06ED}, {0x070F, 0x070F}, {0x0711, 0x0711}, {0x0730, 0x074A}, {0x07A6, 0x07B0}, {0x07EB, 0x07F3}, {0x0901, 0x0902}, {0x093C, 0x093C}, {0x0941, 0x0948}, {0x094D, 0x094D}, {0x0951, 0x0954}, {0x0962, 0x0963}, {0x0981, 0x0981}, {0x09BC, 0x09BC}, {0x09C1, 0x09C4}, {0x09CD, 0x09CD}, {0x09E2, 0x09E3}, {0x0A01, 0x0A02}, {0x0A3C, 0x0A3C}, {0x0A41, 0x0A42}, {0x0A47, 0x0A48}, {0x0A4B, 0x0A4D}, {0x0A70, 0x0A71}, {0x0A81, 0x0A82}, {0x0ABC, 0x0ABC}, {0x0AC1, 0x0AC5}, {0x0AC7, 0x0AC8}, {0x0ACD, 0x0ACD}, {0x0AE2, 0x0AE3}, {0x0B01, 0x0B01}, {0x0B3C, 0x0B3C}, {0x0B3F, 0x0B3F}, {0x0B41, 0x0B43}, {0x0B4D, 0x0B4D}, {0x0B56, 0x0B56}, {0x0B82, 0x0B82}, {0x0BC0, 0x0BC0}, {0x0BCD, 0x0BCD}, {0x0C3E, 0x0C40}, {0x0C46, 0x0C48}, {0x0C4A, 0x0C4D}, {0x0C55, 0x0C56}, {0x0CBC, 0x0CBC}, {0x0CBF, 0x0CBF}, {0x0CC6, 0x0CC6}, {0x0CCC, 0x0CCD}, {0x0CE2, 0x0CE3}, {0x0D41, 0x0D43}, {0x0D4D, 0x0D4D}, {0x0DCA, 0x0DCA}, {0x0DD2, 0x0DD4}, {0x0DD6, 0x0DD6}, {0x0E31, 0x0E31}, {0x0E34, 0x0E3A}, {0x0E47, 0x0E4E}, {0x0EB1, 0x0EB1}, {0x0EB4, 0x0EB9}, {0x0EBB, 0x0EBC}, {0x0EC8, 0x0ECD}, {0x0F18, 0x0F19}, {0x0F35, 0x0F35}, {0x0F37, 0x0F37}, {0x0F39, 0x0F39}, {0x0F71, 0x0F7E}, {0x0F80, 0x0F84}, {0x0F86, 0x0F87}, {0x0F90, 0x0F97}, {0x0F99, 0x0FBC}, {0x0FC6, 0x0FC6}, {0x102D, 0x1030}, {0x1032, 0x1032}, {0x1036, 0x1037}, {0x1039, 0x1039}, {0x1058, 0x1059}, {0x1160, 0x11FF}, {0x135F, 0x135F}, {0x1712, 0x1714}, {0x1732, 0x1734}, {0x1752, 0x1753}, {0x1772, 0x1773}, {0x17B4, 0x17B5}, {0x17B7, 0x17BD}, {0x17C6, 0x17C6}, {0x17C9, 0x17D3}, {0x17DD, 0x17DD}, {0x180B, 0x180D}, {0x18A9, 0x18A9}, {0x1920, 0x1922}, {0x1927, 0x1928}, {0x1932, 0x1932}, {0x1939, 0x193B}, {0x1A17, 0x1A18}, {0x1B00, 0x1B03}, {0x1B34, 0x1B34}, {0x1B36, 0x1B3A}, {0x1B3C, 0x1B3C}, {0x1B42, 0x1B42}, {0x1B6B, 0x1B73}, {0x1DC0, 0x1DCA}, {0x1DFE, 0x1DFF}, {0x200B, 0x200F}, {0x202A, 0x202E}, {0x2060, 0x2063}, {0x206A, 0x206F}, {0x20D0, 0x20EF}, {0x302A, 0x302F}, {0x3099, 0x309A}, {0xA806, 0xA806}, {0xA80B, 0xA80B}, {0xA825, 0xA826}, {0xFB1E, 0xFB1E}, {0xFE00, 0xFE0F}, {0xFE20, 0xFE23}, {0xFEFF, 0xFEFF}, {0xFFF9, 0xFFFB}, {0x10A01, 0x10A03}, {0x10A05, 0x10A06}, {0x10A0C, 0x10A0F}, {0x10A38, 0x10A3A}, {0x10A3F, 0x10A3F}, {0x1D167, 0x1D169}, {0x1D173, 0x1D182}, {0x1D185, 0x1D18B}, {0x1D1AA, 0x1D1AD}, {0x1D242, 0x1D244}, {0xE0001, 0xE0001}, {0xE0020, 0xE007F}, {0xE0100, 0xE01EF} }; return bisearch(c, combining, ARRAY_SIZE(combining) - 1); } static void comb_tofront(int i) { for (;;) { int root = i >= 0x700 ? 0x801 : 0x800; combchars[combchars[i]->prev]->next = combchars[i]->next; combchars[combchars[i]->next]->prev = combchars[i]->prev; combchars[i]->next = combchars[root]->next; combchars[i]->prev = root; combchars[combchars[root]->next]->prev = i; combchars[root]->next = i; i = combchars[i]->c1; if (i < 0xd800 || i >= 0xe000) return; i -= 0xd800; } } void utf8_handle_comb(unsigned int c, struct mchar *mc) { int root; unsigned int i, c1; int isdouble; c1 = mc->image | (mc->font << 8); isdouble = c1 >= 0x1100 && utf8_isdouble(c1); if (!combchars) { combchars = calloc(0x802, sizeof(struct combchar *)); if (!combchars) return; combchars[0x800] = malloc(sizeof(struct combchar)); combchars[0x801] = malloc(sizeof(struct combchar)); if (!combchars[0x800] || !combchars[0x801]) { if (combchars[0x800]) free(combchars[0x800]); if (combchars[0x801]) free(combchars[0x801]); free(combchars); return; } combchars[0x800]->c1 = 0x000; combchars[0x800]->c2 = 0x700; combchars[0x800]->next = 0x800; combchars[0x800]->prev = 0x800; combchars[0x801]->c1 = 0x700; combchars[0x801]->c2 = 0x800; combchars[0x801]->next = 0x801; combchars[0x801]->prev = 0x801; } root = isdouble ? 0x801 : 0x800; for (i = combchars[root]->c1; i < combchars[root]->c2; i++) { if (!combchars[i]) break; if (combchars[i]->c1 == c1 && combchars[i]->c2 == c) break; } if (i == combchars[root]->c2) { /* full, recycle old entry */ if (c1 >= 0xd800 && c1 < 0xe000) comb_tofront(c1 - 0xd800); i = combchars[root]->prev; if (i == 0x800 || i == 0x801 || c1 == i + 0xd800) { /* completely full, can't recycle */ mc->image = '?'; mc->font = 0; return; } /* FIXME: delete old char from all buffers */ } else if (!combchars[i]) { combchars[i] = malloc(sizeof(struct combchar)); if (!combchars[i]) return; combchars[i]->prev = i; combchars[i]->next = i; } combchars[i]->c1 = c1; combchars[i]->c2 = c; mc->image = i & 0xff; mc->font = (i >> 8) + 0xd8; comb_tofront(i); } static int encmatch(char *s1, char *s2) { int c1, c2; do { c1 = (unsigned char)*s1; if (c1 >= 'A' && c1 <= 'Z') c1 += 'a' - 'A'; if (!(c1 >= 'a' && c1 <= 'z') && !(c1 >= '0' && c1 <= '9')) { s1++; continue; } c2 = (unsigned char)*s2; if (c2 >= 'A' && c2 <= 'Z') c2 += 'a' - 'A'; if (!(c2 >= 'a' && c2 <= 'z') && !(c2 >= '0' && c2 <= '9')) { s2++; continue; } if (c1 != c2) return 0; s1++; s2++; } while (c1); return 1; } int FindEncoding(char *name) { int encoding; if (name == NULL || *name == 0) return 0; if (encmatch(name, "euc")) name = "eucJP"; if (encmatch(name, "off") || encmatch(name, "iso8859-1")) return 0; for (encoding = 0; encoding < (int)(ARRAY_SIZE(encodings)); encoding++) if (encmatch(name, encodings[encoding].name)) { LoadFontTranslationsForEncoding(encoding); return encoding; } return -1; } char *EncodingName(int encoding) { if (encoding >= (int)(ARRAY_SIZE(encodings))) return NULL; return encodings[encoding].name; } int EncodingDefFont(int encoding) { return encodings[encoding].deffont; } void ResetEncoding(Window *p) { char *c; int encoding = p->w_encoding; c = encodings[encoding].charsets; if (c) SetCharsets(p, c); LoadFontTranslationsForEncoding(encoding); if (encodings[encoding].usegr) { p->w_gr = 2; p->w_FontE = encodings[encoding].charsets[1]; } else p->w_FontE = 0; if (encodings[encoding].noc1) p->w_c1 = false; } /* decoded char: 32-bit * fontx: non-bmp utf8 * c2: multi-byte character * font is always zero for utf8 * returns: -1 need more bytes * -2 decode error */ int DecodeChar(int c, int encoding, int *statep) { int t; if (encoding == UTF8) { c = FromUtf8(c, statep); if (c >= 0x10000) c = (c & 0x7f0000) << 8 | (c & 0xffff); return c; } if (encoding == SJIS) { if (!*statep) { if ((0x81 <= c && c <= 0x9f) || (0xe0 <= c && c <= 0xef)) { *statep = c; return -1; } if (c < 0x80) return c; return c | (KANA << 16); } t = c; c = *statep; *statep = 0; if (0x40 <= t && t <= 0xfc && t != 0x7f) { if (c <= 0x9f) c = (c - 0x81) * 2 + 0x21; else c = (c - 0xc1) * 2 + 0x21; if (t <= 0x7e) t -= 0x1f; else if (t <= 0x9e) t -= 0x20; else t -= 0x7e, c++; return (c << 8) | t | (KANJI << 16); } return t; } if (encoding == EUC_JP || encoding == EUC_KR || encoding == EUC_CN) { if (!*statep) { if (c & 0x80) { *statep = c; return -1; } return c; } t = c; c = *statep; *statep = 0; if (encoding == EUC_JP) { if (c == 0x8e) return t | (KANA << 16); if (c == 0x8f) { *statep = t | (KANJI0212 << 8); return -1; } } c &= 0xff7f; t &= 0x7f; c = c << 8 | t; if (encoding == EUC_KR) return c | (3 << 16); if (encoding == EUC_CN) return c | (1 << 16); if (c & (KANJI0212 << 16)) return c; else return c | (KANJI << 16); } if (encoding == BIG5 || encoding == GBK) { if (!*statep) { if (c & 0x80) { if (encoding == GBK && c == 0x80) return 0xa4 | (('b' | 0x80) << 16); *statep = c; return -1; } return c; } t = c; c = *statep; *statep = 0; c &= 0x7f; return c << 8 | t | (encoding == BIG5 ? 030 << 16 : 031 << 16); } return c | (encodings[encoding].deffont << 16); } int EncodeChar(char *bp, int c, int encoding, int *fontp) { int t, f, l; if (c == -1 && fontp) { if (*fontp == 0) return 0; if (bp) { *bp++ = 033; *bp++ = '('; *bp++ = 'B'; } return 3; } f = (c >> 16) & 0xff; if (encoding == UTF8) { if (f) { if (is_dw_font(f)) { int c2 = c & 0xff; c = (c >> 8 & 0xff) | (f << 8); c = recode_char_dw_to_encoding(c, &c2, encoding); } else { c = (c & 0xff) | (f << 8); c = recode_char_to_encoding(c, encoding); } } return ToUtf8(bp, c); } if (f == 0 && (c & 0x7f00ff00) != 0) { /* is_utf8? */ if (c >= 0x10000) c = (c & 0x7f0000) >> 8 | (c & 0xffff); if (utf8_isdouble(c)) { int c2 = 0xffff; c = recode_char_dw_to_encoding(c, &c2, encoding); c = (c << 8) | (c2 & 0xff); } else { c = recode_char_to_encoding(c, encoding); c = ((c & 0xff00) << 8) | (c & 0xff); } f = c >> 16; } if (f & 0x80) /* map special 96-fonts to latin1 */ f = 0; if (encoding == SJIS) { if (f == KANA) c = (c & 0xff) | 0x80; else if (f == KANJI) { if (!bp) return 2; t = c & 0xff; c = (c >> 8) & 0xff; t += (c & 1) ? ((t <= 0x5f) ? 0x1f : 0x20) : 0x7e; c = (c - 0x21) / 2 + ((c < 0x5f) ? 0x81 : 0xc1); *bp++ = c; *bp++ = t; return 2; } } if (encoding == EUC) { if (f == KANA) { if (bp) { *bp++ = 0x8e; *bp++ = c | 0x80; } return 2; } if (f == KANJI) { if (bp) { *bp++ = (c >> 8) | 0x80; *bp++ = c | 0x80; } return 2; } if (f == KANJI0212) { if (bp) { *bp++ = 0x8f; *bp++ = c >> 8; *bp++ = c; } return 3; } } if ((encoding == EUC_KR && f == 3) || (encoding == EUC_CN && f == 1)) { if (bp) { *bp++ = (c >> 8) | 0x80; *bp++ = c | 0x80; } return 2; } if ((encoding == BIG5 && f == 030) || (encoding == GBK && f == 031)) { if (bp) { *bp++ = (c >> 8) | 0x80; *bp++ = c; } return 2; } if (encoding == GBK && f == 0 && c == 0xa4) c = 0x80; l = 0; if (fontp && f != *fontp) { *fontp = f; if (f && f < ' ') { if (bp) { *bp++ = 033; *bp++ = '$'; if (f > 2) *bp++ = '('; *bp++ = '@' + f; } l += f > 2 ? 4 : 3; } else if (f < 128) { if (f == 0) f = 'B'; if (bp) { *bp++ = 033; *bp++ = '('; *bp++ = f; } l += 3; } } if (c & 0xff00) { if (bp) *bp++ = c >> 8; l++; } if (bp) *bp++ = c; return l + 1; } int CanEncodeFont(int encoding, int f) { switch (encoding) { case UTF8: return 1; case SJIS: return f == KANJI || f == KANA; case EUC: return f == KANJI || f == KANA || f == KANJI0212; case EUC_KR: return f == 3; case EUC_CN: return f == 1; case BIG5: return f == 030; case GBK: return f == 031; default: break; } return 0; } int PrepareEncodedChar(int c) { int encoding; int t = 0; int f; encoding = D_encoding; f = D_rend.font; t = D_mbcs; if (encoding == SJIS) { if (f == KANA) return c | 0x80; else if (f == KANJI) { t += (c & 1) ? ((t <= 0x5f) ? 0x1f : 0x20) : 0x7e; c = (c - 0x21) / 2 + ((c < 0x5f) ? 0x81 : 0xc1); D_mbcs = t; } return c; } if (encoding == EUC) { if (f == KANA) { AddChar(0x8e); return c | 0x80; } if (f == KANJI) { D_mbcs = t | 0x80; return c | 0x80; } if (f == KANJI0212) { AddChar(0x8f); D_mbcs = t | 0x80; return c | 0x80; } } if ((encoding == EUC_KR && f == 3) || (encoding == EUC_CN && f == 1)) { D_mbcs = t | 0x80; return c | 0x80; } if ((encoding == BIG5 && f == 030) || (encoding == GBK && f == 031)) return c | 0x80; return c; } int RecodeBuf(unsigned char *fbuf, int flen, int fenc, int tenc, unsigned char *tbuf) { int c, i, j; int decstate = 0, font = 0; for (i = j = 0; i < flen; i++) { c = fbuf[i]; c = DecodeChar(c, fenc, &decstate); if (c == -2) i--; if (c < 0) continue; j += EncodeChar(tbuf ? (char *)tbuf + j : NULL, c, tenc, &font); } j += EncodeChar(tbuf ? (char *)tbuf + j : NULL, -1, tenc, &font); return j; } int ContainsSpecialDeffont(struct mline *ml, int xs, int xe, int encoding) { uint32_t *f, *i; int c, x, dx; if (encoding == UTF8 || encodings[encoding].deffont == 0) return 0; i = ml->image + xs; f = ml->font + xs; dx = xe - xs + 1; while (dx-- > 0) { if (*f++) continue; c = *i++; x = recode_char_to_encoding(c | (encodings[encoding].deffont << 8), UTF8); if (c != x) { return 1; } } return 0; } int LoadFontTranslation(int font, char *file) { char buf[1024], *myfile; FILE *f; int i; int fo; int x, u, c, ok; unsigned short (*p)[2], (*tab)[2]; myfile = file; if (myfile == NULL) { if (font == 0 || screenencodings == NULL) return -1; if (strlen(screenencodings) > ARRAY_SIZE(buf) - 10) return -1; sprintf(buf, "%s/%02x", screenencodings, font & 0xff); myfile = buf; } if ((f = secfopen(myfile, "r")) == NULL) return -1; i = ok = 0; for (;;) { for (; i < 12; i++) if (getc(f) != "ScreenI2UTF8"[i]) break; if (getc(f) != 0) /* format */ break; fo = getc(f); /* id */ if (fo == EOF) break; if (font != -1 && font != fo) break; i = getc(f); x = getc(f); if (x == EOF) break; i = i << 8 | x; getc(f); while ((x = getc(f)) && x != EOF) getc(f); /* skip font name (padded to 2 bytes) */ if ((p = malloc(sizeof(*p) * (i + 1) * 4)) == NULL) break; tab = p; while (i > 0) { x = getc(f); x = x << 8 | getc(f); u = getc(f); c = getc(f); u = u << 8 | c; if (c == EOF) break; (*p)[0] = x; (*p)[1] = u; p++; i--; } (*p)[0] = 0; (*p)[1] = 0; if (i || (tab[0][0] & 0x8000)) { free(tab); break; } if (recodetabs[fo].tab && (recodetabs[fo].flags & RECODETAB_ALLOCED) != 0) free(recodetabs[fo].tab); recodetabs[fo].tab = tab; recodetabs[fo].flags = RECODETAB_ALLOCED; c = getc(f); if (c == EOF) { ok = 1; break; } if (c != 'S') break; i = 1; } fclose(f); if (font != -1 && file == NULL && recodetabs[font].flags == 0) recodetabs[font].flags = RECODETAB_TRIED; return ok ? 0 : -1; } void LoadFontTranslationsForEncoding(int encoding) { char *c; int f; if ((c = encodings[encoding].fontlist) != NULL) while ((f = (unsigned char)*c++) != 0) if (recodetabs[f].flags == 0) LoadFontTranslation(f, NULL); f = encodings[encoding].deffont; if (f > 0 && recodetabs[f].flags == 0) LoadFontTranslation(f, NULL); } screen-5.0.2/dumptermcap.h0000664000175000017500000000017715224432722014145 0ustar alexalex#ifndef SCREEN_DUMPTERMCAP_H #define SCREEN_DUMPTERMCAP_H void DumpTermcap (int, FILE *); #endif /* SCREEN_DUMPTERMCAP_H */ screen-5.0.2/doc/0000775000175000017500000000000015224432722012213 5ustar alexalexscreen-5.0.2/doc/window_to_display.ps0000664000175000017500000011253715224432722016326 0ustar alexalex%!PS-Adobe-2.0 EPSF-1.2 %%Creator: idraw %%DocumentFonts: Courier Times-Bold %%Pages: 1 %%BoundingBox: 20 154 576 782 %%EndComments %%BeginIdrawPrologue /arrowhead { 0 begin transform originalCTM itransform /taily exch def /tailx exch def transform originalCTM itransform /tipy exch def /tipx exch def /dy tipy taily sub def /dx tipx tailx sub def /angle dx 0 ne dy 0 ne or { dy dx atan } { 90 } ifelse def gsave originalCTM setmatrix tipx tipy translate angle rotate newpath arrowHeight neg arrowWidth 2 div moveto 0 0 lineto arrowHeight neg arrowWidth 2 div neg lineto patternNone not { originalCTM setmatrix /padtip arrowHeight 2 exp 0.25 arrowWidth 2 exp mul add sqrt brushWidth mul arrowWidth div def /padtail brushWidth 2 div def tipx tipy translate angle rotate padtip 0 translate arrowHeight padtip add padtail add arrowHeight div dup scale arrowheadpath ifill } if brushNone not { originalCTM setmatrix tipx tipy translate angle rotate arrowheadpath istroke } if grestore end } dup 0 9 dict put def /arrowheadpath { newpath arrowHeight neg arrowWidth 2 div moveto 0 0 lineto arrowHeight neg arrowWidth 2 div neg lineto } def /leftarrow { 0 begin y exch get /taily exch def x exch get /tailx exch def y exch get /tipy exch def x exch get /tipx exch def brushLeftArrow { tipx tipy tailx taily arrowhead } if end } dup 0 4 dict put def /rightarrow { 0 begin y exch get /tipy exch def x exch get /tipx exch def y exch get /taily exch def x exch get /tailx exch def brushRightArrow { tipx tipy tailx taily arrowhead } if end } dup 0 4 dict put def %%EndIdrawPrologue /arrowHeight 8 def /arrowWidth 4 def /IdrawDict 52 dict def IdrawDict begin /reencodeISO { dup dup findfont dup length dict begin { 1 index /FID ne { def }{ pop pop } ifelse } forall /Encoding ISOLatin1Encoding def currentdict end definefont } def /ISOLatin1Encoding [ /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef /space/exclam/quotedbl/numbersign/dollar/percent/ampersand/quoteright /parenleft/parenright/asterisk/plus/comma/minus/period/slash /zero/one/two/three/four/five/six/seven/eight/nine/colon/semicolon /less/equal/greater/question/at/A/B/C/D/E/F/G/H/I/J/K/L/M/N /O/P/Q/R/S/T/U/V/W/X/Y/Z/bracketleft/backslash/bracketright /asciicircum/underscore/quoteleft/a/b/c/d/e/f/g/h/i/j/k/l/m /n/o/p/q/r/s/t/u/v/w/x/y/z/braceleft/bar/braceright/asciitilde /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef /.notdef/dotlessi/grave/acute/circumflex/tilde/macron/breve /dotaccent/dieresis/.notdef/ring/cedilla/.notdef/hungarumlaut /ogonek/caron/space/exclamdown/cent/sterling/currency/yen/brokenbar /section/dieresis/copyright/ordfeminine/guillemotleft/logicalnot /hyphen/registered/macron/degree/plusminus/twosuperior/threesuperior /acute/mu/paragraph/periodcentered/cedilla/onesuperior/ordmasculine /guillemotright/onequarter/onehalf/threequarters/questiondown /Agrave/Aacute/Acircumflex/Atilde/Adieresis/Aring/AE/Ccedilla /Egrave/Eacute/Ecircumflex/Edieresis/Igrave/Iacute/Icircumflex /Idieresis/Eth/Ntilde/Ograve/Oacute/Ocircumflex/Otilde/Odieresis /multiply/Oslash/Ugrave/Uacute/Ucircumflex/Udieresis/Yacute /Thorn/germandbls/agrave/aacute/acircumflex/atilde/adieresis /aring/ae/ccedilla/egrave/eacute/ecircumflex/edieresis/igrave /iacute/icircumflex/idieresis/eth/ntilde/ograve/oacute/ocircumflex /otilde/odieresis/divide/oslash/ugrave/uacute/ucircumflex/udieresis /yacute/thorn/ydieresis ] def /Courier reencodeISO def /Times-Bold reencodeISO def /none null def /numGraphicParameters 17 def /stringLimit 65535 def /Begin { save numGraphicParameters dict begin } def /End { end restore } def /SetB { dup type /nulltype eq { pop false /brushRightArrow idef false /brushLeftArrow idef true /brushNone idef } { /brushDashOffset idef /brushDashArray idef 0 ne /brushRightArrow idef 0 ne /brushLeftArrow idef /brushWidth idef false /brushNone idef } ifelse } def /SetCFg { /fgblue idef /fggreen idef /fgred idef } def /SetCBg { /bgblue idef /bggreen idef /bgred idef } def /SetF { /printSize idef /printFont idef } def /SetP { dup type /nulltype eq { pop true /patternNone idef } { dup -1 eq { /patternGrayLevel idef /patternString idef } { /patternGrayLevel idef } ifelse false /patternNone idef } ifelse } def /BSpl { 0 begin storexyn newpath n 1 gt { 0 0 0 0 0 0 1 1 true subspline n 2 gt { 0 0 0 0 1 1 2 2 false subspline 1 1 n 3 sub { /i exch def i 1 sub dup i dup i 1 add dup i 2 add dup false subspline } for n 3 sub dup n 2 sub dup n 1 sub dup 2 copy false subspline } if n 2 sub dup n 1 sub dup 2 copy 2 copy false subspline patternNone not brushLeftArrow not brushRightArrow not and and { ifill } if brushNone not { istroke } if 0 0 1 1 leftarrow n 2 sub dup n 1 sub dup rightarrow } if end } dup 0 4 dict put def /Circ { newpath 0 360 arc patternNone not { ifill } if brushNone not { istroke } if } def /CBSpl { 0 begin dup 2 gt { storexyn newpath n 1 sub dup 0 0 1 1 2 2 true subspline 1 1 n 3 sub { /i exch def i 1 sub dup i dup i 1 add dup i 2 add dup false subspline } for n 3 sub dup n 2 sub dup n 1 sub dup 0 0 false subspline n 2 sub dup n 1 sub dup 0 0 1 1 false subspline patternNone not { ifill } if brushNone not { istroke } if } { Poly } ifelse end } dup 0 4 dict put def /Elli { 0 begin newpath 4 2 roll translate scale 0 0 1 0 360 arc patternNone not { ifill } if brushNone not { istroke } if end } dup 0 1 dict put def /Line { 0 begin 2 storexyn newpath x 0 get y 0 get moveto x 1 get y 1 get lineto brushNone not { istroke } if 0 0 1 1 leftarrow 0 0 1 1 rightarrow end } dup 0 4 dict put def /MLine { 0 begin storexyn newpath n 1 gt { x 0 get y 0 get moveto 1 1 n 1 sub { /i exch def x i get y i get lineto } for patternNone not brushLeftArrow not brushRightArrow not and and { ifill } if brushNone not { istroke } if 0 0 1 1 leftarrow n 2 sub dup n 1 sub dup rightarrow } if end } dup 0 4 dict put def /Poly { 3 1 roll newpath moveto -1 add { lineto } repeat closepath patternNone not { ifill } if brushNone not { istroke } if } def /Rect { 0 begin /t exch def /r exch def /b exch def /l exch def newpath l b moveto l t lineto r t lineto r b lineto closepath patternNone not { ifill } if brushNone not { istroke } if end } dup 0 4 dict put def /Text { ishow } def /idef { dup where { pop pop pop } { exch def } ifelse } def /ifill { 0 begin gsave patternGrayLevel -1 ne { fgred bgred fgred sub patternGrayLevel mul add fggreen bggreen fggreen sub patternGrayLevel mul add fgblue bgblue fgblue sub patternGrayLevel mul add setrgbcolor eofill } { eoclip originalCTM setmatrix pathbbox /t exch def /r exch def /b exch def /l exch def /w r l sub ceiling cvi def /h t b sub ceiling cvi def /imageByteWidth w 8 div ceiling cvi def /imageHeight h def bgred bggreen bgblue setrgbcolor eofill fgred fggreen fgblue setrgbcolor w 0 gt h 0 gt and { l w add b translate w neg h scale w h true [w 0 0 h neg 0 h] { patternproc } imagemask } if } ifelse grestore end } dup 0 8 dict put def /istroke { gsave brushDashOffset -1 eq { [] 0 setdash 1 setgray } { brushDashArray brushDashOffset setdash fgred fggreen fgblue setrgbcolor } ifelse brushWidth setlinewidth originalCTM setmatrix stroke grestore } def /ishow { 0 begin gsave fgred fggreen fgblue setrgbcolor /fontDict printFont printSize scalefont dup setfont def /descender fontDict begin 0 [FontBBox] 1 get FontMatrix end transform exch pop def /vertoffset 1 printSize sub descender sub def { 0 vertoffset moveto show /vertoffset vertoffset printSize sub def } forall grestore end } dup 0 3 dict put def /patternproc { 0 begin /patternByteLength patternString length def /patternHeight patternByteLength 8 mul sqrt cvi def /patternWidth patternHeight def /patternByteWidth patternWidth 8 idiv def /imageByteMaxLength imageByteWidth imageHeight mul stringLimit patternByteWidth sub min def /imageMaxHeight imageByteMaxLength imageByteWidth idiv patternHeight idiv patternHeight mul patternHeight max def /imageHeight imageHeight imageMaxHeight sub store /imageString imageByteWidth imageMaxHeight mul patternByteWidth add string def 0 1 imageMaxHeight 1 sub { /y exch def /patternRow y patternByteWidth mul patternByteLength mod def /patternRowString patternString patternRow patternByteWidth getinterval def /imageRow y imageByteWidth mul def 0 patternByteWidth imageByteWidth 1 sub { /x exch def imageString imageRow x add patternRowString putinterval } for } for imageString end } dup 0 12 dict put def /min { dup 3 2 roll dup 4 3 roll lt { exch } if pop } def /max { dup 3 2 roll dup 4 3 roll gt { exch } if pop } def /midpoint { 0 begin /y1 exch def /x1 exch def /y0 exch def /x0 exch def x0 x1 add 2 div y0 y1 add 2 div end } dup 0 4 dict put def /thirdpoint { 0 begin /y1 exch def /x1 exch def /y0 exch def /x0 exch def x0 2 mul x1 add 3 div y0 2 mul y1 add 3 div end } dup 0 4 dict put def /subspline { 0 begin /movetoNeeded exch def y exch get /y3 exch def x exch get /x3 exch def y exch get /y2 exch def x exch get /x2 exch def y exch get /y1 exch def x exch get /x1 exch def y exch get /y0 exch def x exch get /x0 exch def x1 y1 x2 y2 thirdpoint /p1y exch def /p1x exch def x2 y2 x1 y1 thirdpoint /p2y exch def /p2x exch def x1 y1 x0 y0 thirdpoint p1x p1y midpoint /p0y exch def /p0x exch def x2 y2 x3 y3 thirdpoint p2x p2y midpoint /p3y exch def /p3x exch def movetoNeeded { p0x p0y moveto } if p1x p1y p2x p2y p3x p3y curveto end } dup 0 17 dict put def /storexyn { /n exch def /y n array def /x n array def n 1 sub -1 0 { /i exch def y i 3 2 roll put x i 3 2 roll put } for } def /SSten { fgred fggreen fgblue setrgbcolor dup true exch 1 0 0 -1 0 6 -1 roll matrix astore } def /FSten { dup 3 -1 roll dup 4 1 roll exch newpath 0 0 moveto dup 0 exch lineto exch dup 3 1 roll exch lineto 0 lineto closepath bgred bggreen bgblue setrgbcolor eofill SSten } def /Rast { exch dup 3 1 roll 1 0 0 -1 0 6 -1 roll matrix astore } def %%EndProlog %I Idraw 10 Grid 8 8 %%Page: 1 1 Begin %I b u %I cfg u %I cbg u %I f u %I p u %I t [ 0.95606 0 0 0.95606 0 0 ] concat /originalCTM matrix currentmatrix def Begin %I BSpl %I b 65535 1 0 1 [] 0 SetB %I cfg Black 0 0 0 SetCFg %I cbg White 1 1 1 SetCBg none SetP %I p n %I t [ 1 -0 -0 1 -4 119 ] concat %I 6 276 433 276 449 292 449 364 449 380 449 380 433 6 BSpl %I 1 End Begin %I Pict %I b u %I cfg u %I cbg u %I f u %I p u %I t u Begin %I Pict %I b u %I cfg u %I cbg u %I f u %I p u %I t [ 1 0 0 1 -400 -208 ] concat Begin %I CBSpl %I b 65535 2 0 0 [] 0 SetB %I cfg Black 0 0 0 SetCFg %I cbg LtGray 0.762951 0.762951 0.762951 SetCBg %I p 0.5 SetP %I t [ 0.5 0 0 0.5 350 330.5 ] concat %I 12 340 107 340 123 340 187 340 203 356 203 468 203 484 203 484 187 484 123 484 107 468 107 356 107 12 CBSpl End Begin %I Text %I cfg Black 0 0 0 SetCFg %I f -*-courier-medium-r-normal-*-10-*-*-*-*-*-*-* Courier 10 SetF %I t [ 1 0 0 1 535.5 381 ] concat %I [ (w_ptyfd) ] Text End End %I eop Begin %I Pict %I b u %I cfg u %I cbg u %I f u %I p u %I t [ 1 0 0 1 88 -23.9999 ] concat Begin %I Pict %I b u %I cfg u %I cbg u %I f u %I p u %I t [ -4.37114e-08 -1 1 -4.37114e-08 -608 640 ] concat Begin %I Poly none SetB %I b n %I cfg Black 0 0 0 SetCFg %I cbg LtGray 0.762951 0.762951 0.762951 SetCBg %I p 0.5 SetP %I t [ 0.5 0 0 0.5 238 522.5 ] concat %I 4 164 315 228 315 228 363 164 363 4 Poly End Begin %I Rect %I b 65535 2 0 0 [] 0 SetB %I cfg Black 0 0 0 SetCFg %I cbg White 1 1 1 SetCBg none SetP %I p n %I t [ 1 0 0 1 111 317 ] concat %I 233 363 241 387 Rect End Begin %I Line %I b 65535 2 0 0 [] 0 SetB %I cfg Black 0 0 0 SetCFg %I cbg White 1 1 1 SetCBg none SetP %I p n %I t [ 1 0 0 1 111 317 ] concat %I 225 387 225 363 Line %I 1 End Begin %I Line %I b 65535 2 0 0 [] 0 SetB %I cfg Black 0 0 0 SetCFg %I cbg White 1 1 1 SetCBg none SetP %I p n %I t [ 1 0 0 1 111 317 ] concat %I 217 387 217 363 Line %I 1 End Begin %I Line %I b 65535 2 0 0 [] 0 SetB %I cfg Black 0 0 0 SetCFg %I cbg White 1 1 1 SetCBg none SetP %I p n %I t [ 1 0 0 1 111 317 ] concat %I 233 363 201 363 Line %I 1 End Begin %I Line %I b 65535 2 0 0 [] 0 SetB %I cfg Black 0 0 0 SetCFg %I cbg White 1 1 1 SetCBg none SetP %I p n %I t [ 1 0 0 1 111 317 ] concat %I 201 387 233 387 Line %I 1 End End %I eop Begin %I Text %I cfg Black 0 0 0 SetCFg %I f -*-courier-medium-r-normal-*-10-*-*-*-*-*-*-* Courier 10 SetF %I t [ 1 0 0 1 66.5 285 ] concat %I [ (d_obuf) ] Text End End %I eop Begin %I Text %I cfg Black 0 0 0 SetCFg %I f -*-courier-medium-r-normal-*-10-*-*-*-*-*-*-* Courier 10 SetF %I t [ 1 0 0 1 153.5 244 ] concat %I [ (write\(\)) ] Text End Begin %I BSpl %I b 65535 2 0 1 [] 0 SetB %I cfg Black 0 0 0 SetCFg %I cbg Black 0 0 0 SetCBg none SetP %I p n %I t [ 0.5 0 0 0.5 56 123.5 ] concat %I 3 272 281 288 249 272 201 3 BSpl %I 2 End End %I eop Begin %I Pict %I b u %I cfg u %I cbg u %I f u %I p u %I t u Begin %I Pict %I b u %I cfg u %I cbg u %I f u %I p u %I t [ 1 0 0 1 -239.5 -207.5 ] concat Begin %I CBSpl %I b 65535 2 0 0 [] 0 SetB %I cfg Black 0 0 0 SetCFg %I cbg LtGray 0.762951 0.762951 0.762951 SetCBg %I p 0.5 SetP %I t [ 0.5 0 0 0.5 350 330.5 ] concat %I 12 340 107 340 123 340 187 340 203 356 203 468 203 484 203 484 187 484 123 484 107 468 107 356 107 12 CBSpl End Begin %I Text %I cfg Black 0 0 0 SetCFg %I f -*-courier-medium-r-normal-*-10-*-*-*-*-*-*-* Courier 10 SetF %I t [ 1 0 0 1 535.5 381 ] concat %I [ (w_ptyfd) ] Text End End %I eop Begin %I Pict %I b u %I cfg u %I cbg u %I f u %I p u %I t [ 1 0 0 1 248.5 -23.5 ] concat Begin %I Pict %I b u %I cfg u %I cbg u %I f u %I p u %I t [ -4.37114e-08 -1 1 -4.37114e-08 -608 640 ] concat Begin %I Poly none SetB %I b n %I cfg Black 0 0 0 SetCFg %I cbg LtGray 0.762951 0.762951 0.762951 SetCBg %I p 0.5 SetP %I t [ 0.5 0 0 0.5 238 522.5 ] concat %I 4 164 315 228 315 228 363 164 363 4 Poly End Begin %I Rect %I b 65535 2 0 0 [] 0 SetB %I cfg Black 0 0 0 SetCFg %I cbg White 1 1 1 SetCBg none SetP %I p n %I t [ 1 0 0 1 111 317 ] concat %I 233 363 241 387 Rect End Begin %I Line %I b 65535 2 0 0 [] 0 SetB %I cfg Black 0 0 0 SetCFg %I cbg White 1 1 1 SetCBg none SetP %I p n %I t [ 1 0 0 1 111 317 ] concat %I 225 387 225 363 Line %I 1 End Begin %I Line %I b 65535 2 0 0 [] 0 SetB %I cfg Black 0 0 0 SetCFg %I cbg White 1 1 1 SetCBg none SetP %I p n %I t [ 1 0 0 1 111 317 ] concat %I 217 387 217 363 Line %I 1 End Begin %I Line %I b 65535 2 0 0 [] 0 SetB %I cfg Black 0 0 0 SetCFg %I cbg White 1 1 1 SetCBg none SetP %I p n %I t [ 1 0 0 1 111 317 ] concat %I 233 363 201 363 Line %I 1 End Begin %I Line %I b 65535 2 0 0 [] 0 SetB %I cfg Black 0 0 0 SetCFg %I cbg White 1 1 1 SetCBg none SetP %I p n %I t [ 1 0 0 1 111 317 ] concat %I 201 387 233 387 Line %I 1 End End %I eop Begin %I Text %I cfg Black 0 0 0 SetCFg %I f -*-courier-medium-r-normal-*-10-*-*-*-*-*-*-* Courier 10 SetF %I t [ 1 0 0 1 66.5 285 ] concat %I [ (d_obuf) ] Text End End %I eop Begin %I Text %I cfg Black 0 0 0 SetCFg %I f -*-courier-medium-r-normal-*-10-*-*-*-*-*-*-* Courier 10 SetF %I t [ 1 0 0 1 314 244.5 ] concat %I [ (write\(\)) ] Text End Begin %I BSpl %I b 65535 2 0 1 [] 0 SetB %I cfg Black 0 0 0 SetCFg %I cbg Black 0 0 0 SetCBg none SetP %I p n %I t [ 0.5 0 0 0.5 216.5 124 ] concat %I 3 272 281 288 249 272 201 3 BSpl %I 2 End End %I eop Begin %I Pict %I b u %I cfg u %I cbg u %I f u %I p u %I t u Begin %I Pict %I b u %I cfg u %I cbg u %I f u %I p u %I t [ 1 0 0 1 -79.5 -207.5 ] concat Begin %I CBSpl %I b 65535 2 0 0 [] 0 SetB %I cfg Black 0 0 0 SetCFg %I cbg LtGray 0.762951 0.762951 0.762951 SetCBg %I p 0.5 SetP %I t [ 0.5 0 0 0.5 350 330.5 ] concat %I 12 340 107 340 123 340 187 340 203 356 203 468 203 484 203 484 187 484 123 484 107 468 107 356 107 12 CBSpl End Begin %I Text %I cfg Black 0 0 0 SetCFg %I f -*-courier-medium-r-normal-*-10-*-*-*-*-*-*-* Courier 10 SetF %I t [ 1 0 0 1 535.5 381 ] concat %I [ (w_ptyfd) ] Text End End %I eop Begin %I Pict %I b u %I cfg u %I cbg u %I f u %I p u %I t [ 1 0 0 1 408.5 -23.5 ] concat Begin %I Pict %I b u %I cfg u %I cbg u %I f u %I p u %I t [ -4.37114e-08 -1 1 -4.37114e-08 -608 640 ] concat Begin %I Poly none SetB %I b n %I cfg Black 0 0 0 SetCFg %I cbg LtGray 0.762951 0.762951 0.762951 SetCBg %I p 0.5 SetP %I t [ 0.5 0 0 0.5 238 522.5 ] concat %I 4 164 315 228 315 228 363 164 363 4 Poly End Begin %I Rect %I b 65535 2 0 0 [] 0 SetB %I cfg Black 0 0 0 SetCFg %I cbg White 1 1 1 SetCBg none SetP %I p n %I t [ 1 0 0 1 111 317 ] concat %I 233 363 241 387 Rect End Begin %I Line %I b 65535 2 0 0 [] 0 SetB %I cfg Black 0 0 0 SetCFg %I cbg White 1 1 1 SetCBg none SetP %I p n %I t [ 1 0 0 1 111 317 ] concat %I 225 387 225 363 Line %I 1 End Begin %I Line %I b 65535 2 0 0 [] 0 SetB %I cfg Black 0 0 0 SetCFg %I cbg White 1 1 1 SetCBg none SetP %I p n %I t [ 1 0 0 1 111 317 ] concat %I 217 387 217 363 Line %I 1 End Begin %I Line %I b 65535 2 0 0 [] 0 SetB %I cfg Black 0 0 0 SetCFg %I cbg White 1 1 1 SetCBg none SetP %I p n %I t [ 1 0 0 1 111 317 ] concat %I 233 363 201 363 Line %I 1 End Begin %I Line %I b 65535 2 0 0 [] 0 SetB %I cfg Black 0 0 0 SetCFg %I cbg White 1 1 1 SetCBg none SetP %I p n %I t [ 1 0 0 1 111 317 ] concat %I 201 387 233 387 Line %I 1 End End %I eop Begin %I Text %I cfg Black 0 0 0 SetCFg %I f -*-courier-medium-r-normal-*-10-*-*-*-*-*-*-* Courier 10 SetF %I t [ 1 0 0 1 66.5 285 ] concat %I [ (d_obuf) ] Text End End %I eop Begin %I Text %I cfg Black 0 0 0 SetCFg %I f -*-courier-medium-r-normal-*-10-*-*-*-*-*-*-* Courier 10 SetF %I t [ 1 0 0 1 474 244.5 ] concat %I [ (write\(\)) ] Text End Begin %I BSpl %I b 65535 2 0 1 [] 0 SetB %I cfg Black 0 0 0 SetCFg %I cbg Black 0 0 0 SetCBg none SetP %I p n %I t [ 0.5 0 0 0.5 376.5 124 ] concat %I 3 272 281 288 249 272 201 3 BSpl %I 2 End End %I eop Begin %I Text %I cfg Black 0 0 0 SetCFg %I f -*-courier-medium-r-normal-*-10-*-*-*-*-*-*-* Courier 10 SetF %I t [ 1 0 0 1 289 540 ] concat %I [ (WriteString\(\)) ] Text End Begin %I Pict %I b u %I cfg u %I cbg u %I f u %I p u %I t [ 1 0 0 1 0 168 ] concat Begin %I Pict %I b u %I cfg u %I cbg u %I f u %I p u %I t [ 1 0 0 1 32 56 ] concat Begin %I Rect %I b 65535 3 0 0 [] 0 SetB %I cfg Black 0 0 0 SetCFg %I cbg LtGray 0.762951 0.762951 0.762951 SetCBg %I p 0.5 SetP %I t [ 1 0 0 1 61 197 ] concat %I 195 243 259 291 Rect End Begin %I Line %I b 65535 1 0 0 [] 0 SetB %I cfg Black 0 0 0 SetCFg %I cbg White 1 1 1 SetCBg none SetP %I p n %I t [ 1 0 0 1 61 197 ] concat %I 203 283 251 283 Line %I 1 End Begin %I Line %I b 65535 1 0 0 [] 0 SetB %I cfg Black 0 0 0 SetCFg %I cbg White 1 1 1 SetCBg none SetP %I p n %I t [ 1 0 0 1 61 197 ] concat %I 203 275 251 275 Line %I 1 End Begin %I Line %I b 65535 1 0 0 [] 0 SetB %I cfg Black 0 0 0 SetCFg %I cbg White 1 1 1 SetCBg none SetP %I p n %I t [ 1 0 0 1 61 197 ] concat %I 203 267 251 267 Line %I 1 End Begin %I Line %I b 65535 1 0 0 [] 0 SetB %I cfg Black 0 0 0 SetCFg %I cbg White 1 1 1 SetCBg none SetP %I p n %I t [ 1 0 0 1 61 197 ] concat %I 203 259 251 259 Line %I 1 End Begin %I Line %I b 65535 1 0 0 [] 0 SetB %I cfg Black 0 0 0 SetCFg %I cbg White 1 1 1 SetCBg none SetP %I p n %I t [ 1 0 0 1 61 197 ] concat %I 203 251 251 251 Line %I 1 End Begin %I Line %I b 65535 0 0 0 [] 0 SetB %I cfg Black 0 0 0 SetCFg %I cbg White 1 1 1 SetCBg none SetP %I p n %I t [ 1 0 0 1 61 197 ] concat %I 203 299 251 299 Line %I 1 End Begin %I Line %I b 65535 0 0 0 [] 0 SetB %I cfg Black 0 0 0 SetCFg %I cbg White 1 1 1 SetCBg none SetP %I p n %I t [ 1 0 0 1 61 197 ] concat %I 203 307 251 307 Line %I 1 End Begin %I Line %I b 65535 0 0 0 [] 0 SetB %I cfg Black 0 0 0 SetCFg %I cbg White 1 1 1 SetCBg none SetP %I p n %I t [ 1 0 0 1 61 197 ] concat %I 203 315 251 315 Line %I 1 End Begin %I Line %I b 65535 0 0 0 [] 0 SetB %I cfg Black 0 0 0 SetCFg %I cbg White 1 1 1 SetCBg none SetP %I p n %I t [ 1 0 0 1 61 197 ] concat %I 203 323 251 323 Line %I 1 End Begin %I Line %I b 65535 0 0 0 [] 0 SetB %I cfg Black 0 0 0 SetCFg %I cbg White 1 1 1 SetCBg none SetP %I p n %I t [ 1 0 0 1 53 197 ] concat %I 203 331 251 331 Line %I 1 End Begin %I Line %I b 65535 0 0 0 [] 0 SetB %I cfg Black 0 0 0 SetCFg %I cbg White 1 1 1 SetCBg none SetP %I p n %I t [ 0.5 0 0 0.5 162 329 ] concat %I 188 318 188 366 Line %I 2 End Begin %I Line %I b 65535 0 0 0 [] 0 SetB %I cfg Black 0 0 0 SetCFg %I cbg White 1 1 1 SetCBg none SetP %I p n %I t [ 0.5 0 0 0.5 162 329 ] concat %I 316 318 316 366 Line %I 2 End Begin %I BSpl %I b 65535 0 0 0 [] 0 SetB %I cfg Black 0 0 0 SetCFg %I cbg White 1 1 1 SetCBg none SetP %I p n %I t [ 0.5 0 0 0.5 162 329 ] concat %I 3 316 366 316 398 300 398 3 BSpl %I 2 End Begin %I BSpl %I b 65535 0 0 0 [] 0 SetB %I cfg Black 0 0 0 SetCFg %I cbg White 1 1 1 SetCBg none SetP %I p n %I t [ 0.5 0 0 0.5 162 329 ] concat %I 3 188 366 188 398 172 398 3 BSpl %I 2 End End %I eop Begin %I Text %I cfg Black 0 0 0 SetCFg %I f -*-courier-medium-r-normal-*-10-*-*-*-*-*-*-* Courier 10 SetF %I t [ 1 0 0 1 296 492.5 ] concat %I [ (w_image[]) ] Text End End %I eop Begin %I Text %I cfg Black 0 0 0 SetCFg %I f -*-courier-medium-r-normal-*-10-*-*-*-*-*-*-* Courier 10 SetF %I t [ 1 0 0 1 312 567 ] concat %I [ (\(CB8\)) ] Text End Begin %I Pict %I b u %I cfg u %I cbg u %I f u %I p u %I t [ 1 0 0 1 1.52588e-05 16 ] concat Begin %I Pict %I b u %I cfg u %I cbg u %I f u %I p u %I t [ -4.37114e-08 -1 1 -4.37114e-08 -567.5 808.5 ] concat Begin %I Poly none SetB %I b n %I cfg Black 0 0 0 SetCFg %I cbg LtGray 0.762951 0.762951 0.762951 SetCBg %I p 0.5 SetP %I t [ 0.5 0 0 0.5 238 522.5 ] concat %I 4 164 315 228 315 228 363 164 363 4 Poly End Begin %I Rect %I b 65535 2 0 0 [] 0 SetB %I cfg Black 0 0 0 SetCFg %I cbg White 1 1 1 SetCBg none SetP %I p n %I t [ 1 0 0 1 111 317 ] concat %I 233 363 241 387 Rect End Begin %I Line %I b 65535 2 0 0 [] 0 SetB %I cfg Black 0 0 0 SetCFg %I cbg White 1 1 1 SetCBg none SetP %I p n %I t [ 1 0 0 1 111 317 ] concat %I 225 387 225 363 Line %I 1 End Begin %I Line %I b 65535 2 0 0 [] 0 SetB %I cfg Black 0 0 0 SetCFg %I cbg White 1 1 1 SetCBg none SetP %I p n %I t [ 1 0 0 1 111 317 ] concat %I 217 387 217 363 Line %I 1 End Begin %I Line %I b 65535 2 0 0 [] 0 SetB %I cfg Black 0 0 0 SetCFg %I cbg White 1 1 1 SetCBg none SetP %I p n %I t [ 1 0 0 1 111 317 ] concat %I 233 363 201 363 Line %I 1 End Begin %I Line %I b 65535 2 0 0 [] 0 SetB %I cfg Black 0 0 0 SetCFg %I cbg White 1 1 1 SetCBg none SetP %I p n %I t [ 1 0 0 1 111 317 ] concat %I 201 387 233 387 Line %I 1 End End %I eop Begin %I Text %I cfg Black 0 0 0 SetCFg %I f -*-courier-medium-r-normal-*-10-*-*-*-*-*-*-* Courier 10 SetF %I t [ 1 0 0 1 101 453.5 ] concat %I [ (w_string) ] Text End End %I eop Begin %I Pict %I b u %I cfg u %I cbg u %I f u %I p u %I t u Begin %I Pict %I b u %I cfg u %I cbg u %I f u %I p u %I t u Begin %I Poly none SetB %I b n %I cfg Black 0 0 0 SetCFg %I cbg LtGray 0.762951 0.762951 0.762951 SetCBg %I p 0.5 SetP %I t [ 0.5 0 0 0.5 230 434.5 ] concat %I 4 164 315 228 315 228 363 164 363 4 Poly End Begin %I Pict %I b 65535 2 0 0 [] 0 SetB %I cfg u %I cbg u %I f u %I p u %I t [ 1 0 0 1 -32 32 ] concat Begin %I Rect %I b 65535 3 0 0 [] 0 SetB %I cfg Black 0 0 0 SetCFg %I cbg White 1 1 1 SetCBg none SetP %I p n %I t [ 1 -0 -0 1 135 197.5 ] concat %I 233 363 241 387 Rect End Begin %I Line %I b 65535 3 0 0 [] 0 SetB %I cfg Black 0 0 0 SetCFg %I cbg White 1 1 1 SetCBg none SetP %I p n %I t [ 1 -0 -0 1 135 197.5 ] concat %I 225 387 225 363 Line %I 1 End Begin %I Line %I b 65535 3 0 0 [] 0 SetB %I cfg Black 0 0 0 SetCFg %I cbg White 1 1 1 SetCBg none SetP %I p n %I t [ 1 -0 -0 1 135 197.5 ] concat %I 217 387 217 363 Line %I 1 End Begin %I Line %I b 65535 3 0 0 [] 0 SetB %I cfg Black 0 0 0 SetCFg %I cbg White 1 1 1 SetCBg none SetP %I p n %I t [ 1 -0 -0 1 135 197.5 ] concat %I 233 363 201 363 Line %I 1 End Begin %I Line %I b 65535 3 0 0 [] 0 SetB %I cfg Black 0 0 0 SetCFg %I cbg White 1 1 1 SetCBg none SetP %I p n %I t [ 1 -0 -0 1 135 197.5 ] concat %I 201 387 233 387 Line %I 1 End End %I eop End %I eop Begin %I Text %I cfg Black 0 0 0 SetCFg %I f -*-courier-medium-r-normal-*-10-*-*-*-*-*-*-* Courier 10 SetF %I t [ 1 0 0 1 300.5 589 ] concat %I [ (w_outbuf) ] Text End End %I eop Begin %I Text %I cfg Black 0 0 0 SetCFg %I f -*-times-bold-r-normal-*-14-*-*-*-*-*-*-* Times-Bold 14 SetF %I t [ 1 0 0 1 185 814 ] concat %I [ (Window to display data flow in Screen) ] Text End Begin %I BSpl %I b 65535 1 0 1 [] 0 SetB %I cfg Black 0 0 0 SetCFg %I cbg White 1 1 1 SetCBg none SetP %I p n %I t [ 1 -0 -0 1 -4 119 ] concat %I 4 108 361 60 361 44 361 44 345 4 BSpl %I 1 End Begin %I BSpl %I b 65535 1 0 1 [] 0 SetB %I cfg Black 0 0 0 SetCFg %I cbg White 1 1 1 SetCBg none SetP %I p n %I t [ 1 -0 -0 1 -4 119 ] concat %I 4 148 361 156 361 172 361 172 345 4 BSpl %I 1 End Begin %I Text %I cfg Black 0 0 0 SetCFg %I f -*-courier-medium-r-normal-*-10-*-*-*-*-*-*-* Courier 10 SetF %I t [ 1 0 0 1 34 491 ] concat %I [ (PrintFlush\(\)) ] Text End Begin %I BSpl %I b 65535 1 0 1 [] 0 SetB %I cfg Black 0 0 0 SetCFg %I cbg White 1 1 1 SetCBg none SetP %I p n %I t [ 1 -0 -0 1 -4 119 ] concat %I 7 300 409 276 409 276 433 276 457 276 481 300 481 308 481 7 BSpl %I 1 End Begin %I BSpl %I b 65535 1 0 1 [] 0 SetB %I cfg Black 0 0 0 SetCFg %I cbg White 1 1 1 SetCBg none SetP %I p n %I t [ 1 -0 -0 1 -4 119 ] concat %I 4 356 481 380 481 380 457 380 449 4 BSpl %I 1 End Begin %I BSpl %I b 65535 1 0 1 [] 0 SetB %I cfg Black 0 0 0 SetCFg %I cbg White 1 1 1 SetCBg none SetP %I p n %I t [ 1 -0 -0 1 -4 119 ] concat %I 5 220 505 220 529 220 553 244 553 252 553 5 BSpl %I 1 End Begin %I BSpl %I b 65535 1 0 1 [] 0 SetB %I cfg Black 0 0 0 SetCFg %I cbg White 1 1 1 SetCBg none SetP %I p n %I t [ 1 -0 -0 1 -4 119 ] concat %I 6 276 409 252 409 252 433 252 529 252 553 284 553 6 BSpl %I 1 End Begin %I Pict %I b u %I cfg u %I cbg u %I f u %I p u %I t [ 1 0 0 1 0 136 ] concat Begin %I CBSpl %I b 65535 2 0 0 [] 0 SetB %I cfg Black 0 0 0 SetCFg %I cbg LtGray 0.762951 0.762951 0.762951 SetCBg %I p 0.5 SetP %I t [ 0.5 0 0 0.5 350 330.5 ] concat %I 12 340 107 340 123 340 187 340 203 356 203 468 203 484 203 484 187 484 123 484 107 468 107 356 107 12 CBSpl End Begin %I Text %I cfg Black 0 0 0 SetCFg %I f -*-courier-medium-r-normal-*-10-*-*-*-*-*-*-* Courier 10 SetF %I t [ 1 0 0 1 535.5 381 ] concat %I [ (w_ptyfd) ] Text End End %I eop Begin %I Pict %I b u %I cfg u %I cbg u %I f u %I p u %I t [ 1 0 0 1 0 88 ] concat Begin %I Pict %I b u %I cfg u %I cbg u %I f u %I p u %I t u Begin %I Rect none SetB %I b n %I cfg Black 0 0 0 SetCFg %I cbg LtGray 0.762951 0.762951 0.762951 SetCBg %I p 0.5 SetP %I t [ 0.5 -0 -0 0.5 380.5 362.5 ] concat %I 71 123 135 171 Rect End Begin %I Pict %I b 65535 2 0 0 [] 0 SetB %I cfg u %I cbg u %I f u %I p u %I t [ 1 0 0 1 24 -136 ] concat Begin %I Rect %I b 65535 3 0 0 [] 0 SetB %I cfg Black 0 0 0 SetCFg %I cbg White 1 1 1 SetCBg none SetP %I p n %I t [ 1 -0 -0 1 135 197.5 ] concat %I 257 363 265 387 Rect End Begin %I Line %I b 65535 3 0 0 [] 0 SetB %I cfg Black 0 0 0 SetCFg %I cbg White 1 1 1 SetCBg none SetP %I p n %I t [ 1 -0 -0 1 135 197.5 ] concat %I 273 387 273 363 Line %I 1 End Begin %I Line %I b 65535 3 0 0 [] 0 SetB %I cfg Black 0 0 0 SetCFg %I cbg White 1 1 1 SetCBg none SetP %I p n %I t [ 1 -0 -0 1 135 197.5 ] concat %I 281 387 281 363 Line %I 1 End Begin %I Line %I b 65535 3 0 0 [] 0 SetB %I cfg Black 0 0 0 SetCFg %I cbg White 1 1 1 SetCBg none SetP %I p n %I t [ 1 -0 -0 1 135 197.5 ] concat %I 265 363 297 363 Line %I 1 End Begin %I Line %I b 65535 3 0 0 [] 0 SetB %I cfg Black 0 0 0 SetCFg %I cbg White 1 1 1 SetCBg none SetP %I p n %I t [ 1 -0 -0 1 135 197.5 ] concat %I 265 387 297 387 Line %I 1 End End %I eop End %I eop Begin %I Text %I cfg Black 0 0 0 SetCFg %I f -*-courier-medium-r-normal-*-10-*-*-*-*-*-*-* Courier 10 SetF %I t [ 1 0 0 1 416.5 419 ] concat %I [ (main:buf) ] Text End End %I eop Begin %I Text %I cfg Black 0 0 0 SetCFg %I f -*-courier-medium-r-normal-*-10-*-*-*-*-*-*-* Courier 10 SetF %I t [ 1 0 0 1 464 538 ] concat %I [ (read\(\)) ] Text End Begin %I BSpl %I b 65535 2 0 1 [] 0 SetB %I cfg Black 0 0 0 SetCFg %I cbg White 1 1 1 SetCBg none SetP %I p n %I t [ 1 0 0 1 -4 111 ] concat %I 3 516 409 484 417 460 409 3 BSpl %I 1 End Begin %I BSpl %I b 65535 1 0 1 [] 0 SetB %I cfg Black 0 0 0 SetCFg %I cbg White 1 1 1 SetCBg none SetP %I p n %I t [ 1 -0 -0 1 -4 119 ] concat %I 7 412 401 396 401 396 385 396 361 396 345 412 345 420 345 7 BSpl %I 1 End Begin %I BSpl %I b 65535 1 0 1 [] 0 SetB %I cfg Black 0 0 0 SetCFg %I cbg White 1 1 1 SetCBg none SetP %I p n %I t [ 1 -0 -0 1 -4 119 ] concat %I 3 36 337 36 305 76 257 3 BSpl %I 1 End Begin %I BSpl %I b 65535 1 0 1 [] 0 SetB %I cfg Black 0 0 0 SetCFg %I cbg White 1 1 1 SetCBg none SetP %I p n %I t [ 1 -0 -0 1 -4 119 ] concat %I 3 44 337 52 297 108 265 3 BSpl %I 1 End Begin %I BSpl %I b 65535 1 0 1 [] 0 SetB %I cfg Black 0 0 0 SetCFg %I cbg White 1 1 1 SetCBg none SetP %I p n %I t [ 1 -0 -0 1 -4 119 ] concat %I 3 52 337 68 297 132 273 3 BSpl %I 1 End Begin %I BSpl %I b 65535 1 0 1 [] 0 SetB %I cfg Black 0 0 0 SetCFg %I cbg White 1 1 1 SetCBg none SetP %I p n %I t [ 1 -0 -0 1 -4 119 ] concat %I 3 164 337 164 321 172 273 3 BSpl %I 1 End Begin %I BSpl %I b 65535 1 0 1 [] 0 SetB %I cfg Black 0 0 0 SetCFg %I cbg White 1 1 1 SetCBg none SetP %I p n %I t [ 1 -0 -0 1 -4 119 ] concat %I 3 172 337 172 321 204 289 3 BSpl %I 1 End Begin %I Pict %I b u %I cfg u %I cbg u %I f u %I p u %I t [ 1 0 0 1 0 104 ] concat Begin %I Rect none SetB %I b n %I cfg Black 0 0 0 SetCFg %I cbg White 1 1 1 SetCBg %I p 1 SetP %I t [ 1 -0 -0 1 -4 119 ] concat %I 28 201 92 217 Rect End Begin %I Text %I cfg Black 0 0 0 SetCFg %I f -*-courier-medium-r-normal-*-10-*-*-*-*-*-*-* Courier 10 SetF %I t [ 1 0 0 1 29.5 332 ] concat %I [ (AddStrn\(\)) ] Text End End %I eop Begin %I Pict %I b u %I cfg u %I cbg u %I f u %I p u %I t u Begin %I Text %I cfg Black 0 0 0 SetCFg %I f -*-courier-medium-r-normal-*-10-*-*-*-*-*-*-* Courier 10 SetF %I t [ 1 0 0 1 471 481 ] concat %I [ (write\(\)) ] Text End Begin %I Pict %I b u %I cfg u %I cbg u %I f u none SetP %I p n %I t [ 1 0 0 1 0 -120 ] concat Begin %I CBSpl %I b 65520 2 0 0 [12 4] 0 SetB %I cfg Black 0 0 0 SetCFg %I cbg LtGray 0.762951 0.762951 0.762951 SetCBg %I p 0.5 SetP %I t [ 0.5 0 0 0.5 350 482.5 ] concat %I 12 340 107 340 123 340 187 340 203 356 203 468 203 484 203 484 187 484 123 484 107 468 107 356 107 12 CBSpl End Begin %I Text %I cfg Black 0 0 0 SetCFg %I f -*-courier-medium-r-normal-*-10-*-*-*-*-*-*-* Courier 10 SetF %I t [ 1 0 0 1 511.5 533 ] concat %I [ (w_pwin->p_ptyfd) ] Text End End %I eop Begin %I BSpl %I b 65535 1 1 0 [] 0 SetB %I cfg Black 0 0 0 SetCFg %I cbg White 1 1 1 SetCBg none SetP %I p n %I t [ 1 -0 -0 1 -4 119 ] concat %I 3 516 345 492 353 468 345 3 BSpl %I 1 End Begin %I Pict %I b u %I cfg u %I cbg u %I f u %I p u %I t u Begin %I Text %I cfg Black 0 0 0 SetCFg %I f -*-courier-medium-r-normal-*-10-*-*-*-*-*-*-* Courier 10 SetF %I t [ 1 0 0 1 391.5 445.5 ] concat %I [ (w_pwin->p_inbuf) ] Text End Begin %I Pict %I b u %I cfg u %I cbg u %I f u %I p u %I t u Begin %I Poly none SetB %I b n %I cfg Black 0 0 0 SetCFg %I cbg LtGray 0.762951 0.762951 0.762951 SetCBg none SetP %I p n %I t [ 0.5 0 0 0.5 342 290.5 ] concat %I 4 164 315 228 315 228 363 164 363 4 Poly End Begin %I Rect %I b 65520 2 0 0 [12 4] 0 SetB %I cfg Black 0 0 0 SetCFg %I cbg White 1 1 1 SetCBg none SetP %I p n %I t [ 1 0 0 1 215 85.0002 ] concat %I 233 363 241 387 Rect End Begin %I Line %I b 65520 2 0 0 [12 4] 0 SetB %I cfg Black 0 0 0 SetCFg %I cbg White 1 1 1 SetCBg none SetP %I p n %I t [ 1 0 0 1 215 85.0002 ] concat %I 225 387 225 363 Line %I 1 End Begin %I Line %I b 65520 2 0 0 [12 4] 0 SetB %I cfg Black 0 0 0 SetCFg %I cbg White 1 1 1 SetCBg none SetP %I p n %I t [ 1 0 0 1 215 85.0002 ] concat %I 233 363 201 363 Line %I 1 End Begin %I Line %I b 65520 2 0 0 [12 4] 0 SetB %I cfg Black 0 0 0 SetCFg %I cbg White 1 1 1 SetCBg none SetP %I p n %I t [ 1 0 0 1 215 85.0002 ] concat %I 201 387 233 387 Line %I 1 End Begin %I Line %I b 65520 2 0 0 [12 4] 0 SetB %I cfg Black 0 0 0 SetCFg %I cbg White 1 1 1 SetCBg none SetP %I p n %I t [ 1 -0 -0 1 119 140 ] concat %I 313 308 313 332 Line %I 1 End End %I eop End %I eop End %I eop Begin %I Line %I b 65520 0 0 0 [12 4] 0 SetB %I cfg LtGray 0.762951 0.762951 0.762951 SetCFg %I cbg White 1 1 1 SetCBg none SetP %I p n %I t [ 1 -0 -0 1 -22 198.5 ] concat %I 222 210 358 106 Line %I 1 End Begin %I Line %I b 65520 0 0 0 [12 4] 0 SetB %I cfg LtGray 0.762951 0.762951 0.762951 SetCFg %I cbg White 1 1 1 SetCBg none SetP %I p n %I t [ 1 -0 -0 1 -22 198.5 ] concat %I 190 194 198 106 Line %I 1 End Begin %I Line %I b 65520 0 0 0 [12 4] 0 SetB %I cfg LtGray 0.762951 0.762951 0.762951 SetCFg %I cbg White 1 1 1 SetCBg none SetP %I p n %I t [ 1 -0 -0 1 -22 198.5 ] concat %I 150 194 518 106 Line %I 1 End Begin %I Line %I b 65520 0 0 0 [12 4] 0 SetB %I cfg LtGray 0.762951 0.762951 0.762951 SetCFg %I cbg White 1 1 1 SetCBg none SetP %I p n %I t [ 1 -0 -0 1 -22 198.5 ] concat %I 126 186 358 106 Line %I 1 End Begin %I Line %I b 65520 0 0 0 [12 4] 0 SetB %I cfg LtGray 0.762951 0.762951 0.762951 SetCFg %I cbg White 1 1 1 SetCBg none SetP %I p n %I t [ 1 -0 -0 1 -22 198.5 ] concat %I 94 178 198 106 Line %I 1 End Begin %I Pict %I b u %I cfg u %I cbg u %I f u %I p u %I t u Begin %I Text %I cfg Black 0 0 0 SetCFg %I f -*-courier-medium-r-normal-*-10-*-*-*-*-*-*-* Courier 10 SetF %I t [ 1 0 0 1 184 615 ] concat %I [ (Special\(\)) ] Text End Begin %I BSpl %I b 65535 1 0 1 [] 0 SetB %I cfg Black 0 0 0 SetCFg %I cbg White 1 1 1 SetCBg none SetP %I p n %I t [ 1 -0 -0 1 -4 127 ] concat %I 6 220 505 220 529 196 529 164 529 140 529 140 505 6 BSpl %I 1 End Begin %I BSpl %I b 65535 1 0 1 [] 0 SetB %I cfg Black 0 0 0 SetCFg %I cbg White 1 1 1 SetCBg none SetP %I p n %I t [ 1 -0 -0 1 -22 198.5 ] concat %I 3 166 425 166 409 198 378 3 BSpl %I 1 End Begin %I BSpl %I b 65535 1 0 1 [] 0 SetB %I cfg Black 0 0 0 SetCFg %I cbg White 1 1 1 SetCBg none SetP %I p n %I t [ 1 -0 -0 1 -22 198.5 ] concat %I 3 158 425 158 410 182 370 3 BSpl %I 1 End Begin %I BSpl %I b 65535 1 0 1 [] 0 SetB %I cfg Black 0 0 0 SetCFg %I cbg White 1 1 1 SetCBg none SetP %I p n %I t [ 1 -0 -0 1 -22 198.5 ] concat %I 3 150 425 150 409 158 362 3 BSpl %I 1 End End %I eop Begin %I BSpl %I b 65535 1 0 1 [] 0 SetB %I cfg Black 0 0 0 SetCFg %I cbg White 1 1 1 SetCBg none SetP %I p n %I t [ 1 -0 -0 1 -22 198.5 ] concat %I 3 198 257 198 241 254 210 3 BSpl %I 1 End Begin %I Pict %I b u %I cfg u %I cbg u %I f u %I p u %I t [ 1 0 0 1 120 48 ] concat Begin %I Rect none SetB %I b n %I cfg Black 0 0 0 SetCFg %I cbg White 1 1 1 SetCBg %I p 1 SetP %I t [ 1 -0 -0 1 -4 119 ] concat %I 28 257 108 273 Rect End Begin %I Text %I cfg Black 0 0 0 SetCFg %I f -*-courier-medium-r-normal-*-10-*-*-*-*-*-*-* Courier 10 SetF %I t [ 1 0 0 1 28.5 388 ] concat %I [ (MakeStatus\(\)) ] Text End End %I eop Begin %I Line %I b 65520 0 0 0 [12 4] 0 SetB %I cfg LtGray 0.762951 0.762951 0.762951 SetCFg %I cbg White 1 1 1 SetCBg none SetP %I p n %I t [ 1 -0 -0 1 -22 198.5 ] concat %I 254 210 518 106 Line %I 1 End Begin %I Line %I b 65520 0 0 0 [12 4] 0 SetB %I cfg LtGray 0.762951 0.762951 0.762951 SetCFg %I cbg White 1 1 1 SetCBg none SetP %I p n %I t [ 1 -0 -0 1 -22 198.5 ] concat %I 198 378 518 106 Line %I 1 End Begin %I Line %I b 65520 0 0 0 [12 4] 0 SetB %I cfg LtGray 0.762951 0.762951 0.762951 SetCFg %I cbg White 1 1 1 SetCBg none SetP %I p n %I t [ 1 -0 -0 1 -22 198.5 ] concat %I 182 370 358 106 Line %I 1 End Begin %I Line %I b 65520 0 0 0 [12 4] 0 SetB %I cfg LtGray 0.762951 0.762951 0.762951 SetCFg %I cbg Black 0 0 0 SetCBg none SetP %I p n %I t [ 1 -0 -0 1 -22 198.5 ] concat %I 158 362 198 106 Line %I 1 End Begin %I BSpl %I b 65535 2 0 1 [] 0 SetB %I cfg Black 0 0 0 SetCFg %I cbg White 1 1 1 SetCBg none SetP %I p n %I t [ 1 -0 -0 1 -4 119 ] concat %I 4 268 337 268 281 180 241 180 185 4 BSpl %I 1 End Begin %I BSpl %I b 65535 2 0 1 [] 0 SetB %I cfg Black 0 0 0 SetCFg %I cbg White 1 1 1 SetCBg none SetP %I p n %I t [ 0.5 -0 -0 0.5 197.5 193.5 ] concat %I 4 181 525 181 413 277 333 277 221 4 BSpl %I 2 End Begin %I BSpl %I b 65535 2 0 1 [] 0 SetB %I cfg Black 0 0 0 SetCFg %I cbg White 1 1 1 SetCBg none SetP %I p n %I t [ 1 -0 -0 1 -4 119 ] concat %I 4 316 337 316 281 500 241 500 185 4 BSpl %I 1 End Begin %I Text %I cfg Black 0 0 0 SetCFg %I f -*-courier-medium-r-normal-*-10-*-*-*-*-*-*-* Courier 10 SetF %I t [ 0.587415 -0.809286 0.809286 0.587415 298.171 395.796 ] concat %I [ (AddChar\(\)) ] Text End Begin %I Text %I cfg Black 0 0 0 SetCFg %I f -*-courier-medium-r-normal-*-10-*-*-*-*-*-*-* Courier 10 SetF %I t [ 0.810117 0.586269 -0.586269 0.810117 198.687 362.705 ] concat %I [ (AddChar\(\)) ] Text End Begin %I Text %I cfg Black 0 0 0 SetCFg %I f -*-courier-medium-r-normal-*-10-*-*-*-*-*-*-* Courier 10 SetF %I t [ 0.954268 -0.298951 0.298951 0.954268 391.408 381.739 ] concat %I [ (AddChar\(\)) ] Text End Begin %I BSpl %I b 65535 2 0 1 [] 0 SetB %I cfg Black 0 0 0 SetCFg %I cbg Black 0 0 0 SetCBg none SetP %I p n %I t [ 1 -0 -0 1 -4 119 ] concat %I 5 412 409 308 409 292 409 292 393 292 361 5 BSpl %I 1 End Begin %I Text %I cfg Black 0 0 0 SetCFg %I f -*-courier-medium-r-normal-*-10-*-*-*-*-*-*-* Courier 10 SetF %I t [ 1 0 0 1 232.5 473.5 ] concat %I [ (w_dlist->next->next...) ] Text End Begin %I Text %I cfg Black 0 0 0 SetCFg %I f -*-courier-medium-r-normal-*-10-*-*-*-*-*-*-* Courier 10 SetF %I t [ 1 0 0 1 134 540 ] concat %I [ (PrintChar\(\)) ] Text End Begin %I Text %I cfg Black 0 0 0 SetCFg %I f -*-courier-medium-r-normal-*-10-*-*-*-*-*-*-* Courier 10 SetF %I t [ 1 0 0 1 139 525 ] concat %I [ (SaveChar\(\)) ] Text End Begin %I BSpl %I b 65535 1 0 1 [] 0 SetB %I cfg Black 0 0 0 SetCFg %I cbg Black 0 0 0 SetCBg none SetP %I p n %I t [ 1 -0 -0 1 -4 119 ] concat %I 5 412 409 292 409 148 409 132 409 132 393 5 BSpl %I 1 End Begin %I BSpl %I b 65535 1 0 1 [] 0 SetB %I cfg Black 0 0 0 SetCFg %I cbg White 1 1 1 SetCBg none SetP %I p n %I t [ 1 -0 -0 1 -4 119 ] concat %I 4 244 409 220 409 220 433 220 481 4 BSpl %I 1 End End %I eop showpage %%Trailer end screen-5.0.2/doc/screen.texinfo0000664000175000017500000067544315224432722015113 0ustar alexalex\input texinfo @c -*-texinfo-*- @c %**start of header @c vi:set wm=5 @documentencoding ISO-8859-15 @setfilename screen.info @settitle Screen User's Manual @dircategory General Commands @finalout @setchapternewpage odd @c %**end of header @set version 5.0.2 @direntry * Screen: (screen). Full-screen window manager. @end direntry @c For examples, use a literal escape in info. @ifinfo @set esc ^[ @end ifinfo @iftex @set esc @end iftex @ifinfo This file documents the @code{Screen} virtual terminal manager. Copyright (c) 1993-2026 Free Software Foundation, Inc. Permission is granted to make and distribute verbatim copies of this manual provided the copyright notice and this permission notice are preserved on all copies. @ignore Permission is granted to process this file through TeX and print the results, provided the printed document carries copying permission notice identical to this one except for the removal of this paragraph (this paragraph not being relevant to the printed manual). @end ignore Permission is granted to copy and distribute modified versions of this manual under the conditions for verbatim copying, provided that the entire resulting derived work is distributed under the terms of a permission notice identical to this one. Permission is granted to copy and distribute translations of this manual into another language, under the above conditions for modified versions, except that this permission notice may be stated in a translation approved by the Foundation. @end ifinfo @titlepage @title GNU Screen @subtitle The virtual terminal manager @subtitle for Version @value{version} @subtitle Jul 2026 @page @vskip 0pt plus 1filll Copyright @copyright{} 1993-2026 Free Software Foundation, Inc. Permission is granted to make and distribute verbatim copies of this manual provided the copyright notice and this permission notice are preserved on all copies. Permission is granted to copy and distribute modified versions of this manual under the conditions for verbatim copying, provided that the entire resulting derived work is distributed under the terms of a permission notice identical to this one. Permission is granted to copy and distribute translations of this manual into another language, under the above conditions for modified versions, except that this permission notice may be stated in a translation approved by the Foundation. @end titlepage @summarycontents @contents @node Top @top Screen This file documents the @code{Screen} virtual terminal manager, version @value{version}. @menu * Overview:: Preliminary information. * Installation:: Getting @code{screen} running on your system. * Getting Started:: An introduction to @code{screen}. * Invoking Screen:: Command line options for @code{screen}. * Customization:: The @file{.screenrc} file. * Commands:: List all of the commands. * New Window:: Running a program in a new window. * Selecting:: Selecting a window to display. * Session Management:: Suspend/detach, grant access, connect sessions. * Regions:: Split-screen commands. * Window Settings:: Titles, logging, etc. * Virtual Terminal:: Controlling the @code{screen} VT100 emulation. * Copy and Paste:: Exchanging text between windows and sessions. * Subprocess Execution:: I/O filtering with @code{exec}. * Key Binding:: Binding commands to keys. * Flow Control:: Trap or pass flow control characters. * Termcap:: Tweaking your terminal's termcap entry. * Message Line:: The @code{screen} message line. * Logging:: Keeping a record of your session. * Startup:: Functions only useful at @code{screen} startup. * Miscellaneous:: Various other commands. * String Escapes:: Inserting current information into strings * Environment:: Environment variables used by @code{screen}. * Files:: Files used by @code{screen}. * Credits:: Who's who of @code{screen}. * Bugs:: What to do if you find a bug. * Concept Index:: Index of concepts. * Command Index:: Index of all @code{screen} commands. * Keystroke Index:: Index of default key bindings. @end menu @c ---------------------------------------------------------------- @node Overview @chapter Overview @cindex overview Screen is a full-screen window manager that multiplexes a physical terminal between several processes, typically interactive shells. Each virtual terminal provides the functions of the DEC VT100 terminal and, in addition, several control functions from the ISO 6429 (ECMA 48, ANSI X3.64) and ISO 2022 standards (e.g. insert/delete line and support for multiple character sets). There is a scrollback history buffer for each virtual terminal and a copy-and-paste mechanism that allows the user to move text regions between windows. When @code{screen} is called, it creates a single window with a shell in it (or the specified command) and then gets out of your way so that you can use the program as you normally would. Then, at any time, you can create new (full-screen) windows with other programs in them (including more shells), kill the current window, view a list of the active windows, turn output logging on and off, copy text between windows, view the scrollback history, switch between windows, etc. All windows run their programs completely independent of each other. Programs continue to run when their window is currently not visible and even when the whole screen session is detached from the user's terminal. When a program terminates, @code{screen} (per default) kills the window that contained it. If this window was in the foreground, the display switches to the previously displayed window; if none are left, @code{screen} exits. Shells usually distinguish between running as login-shell or sub-shell. Screen runs them as sub-shells, unless told otherwise (See @code{shell} .screenrc command). Everything you type is sent to the program running in the current window. The only exception to this is the one keystroke that is used to initiate a command to the window manager. By default, each command begins with a control-a (abbreviated @kbd{C-a} from now on), and is followed by one other keystroke. The command character (@pxref{Command Character}) and all the key bindings (@pxref{Key Binding}) can be fully customized to be anything you like, though they are always two characters in length. @code{Screen} does not understand the prefix @kbd{C-} to mean control, although this notation is used in this manual for readability. Please use the caret notation (@kbd{^A} instead of @kbd{C-a}) as arguments to e.g. the @code{escape} command or the @code{-e} option. @code{Screen} will also print out control characters in caret notation. The standard way to create a new window is to type @kbd{C-a c}. This creates a new window running a shell and switches to that window immediately, regardless of the state of the process running in the current window. Similarly, you can create a new window with a custom command in it by first binding the command to a keystroke (in your @file{.screenrc} file or at the @kbd{C-a :} command line) and then using it just like the @kbd{C-a c} command. In addition, new windows can be created by running a command like: @example screen emacs prog.c @end example @noindent from a shell prompt within a previously created window. This will not run another copy of @code{screen}, but will instead supply the command name and its arguments to the window manager (specified in the $STY environment variable) who will use it to create the new window. The above example would start the @code{emacs} editor (editing @file{prog.c}) and switch to its window. - Note that you cannot transport environment variables from the invoking shell to the application (emacs in this case), because it is forked from the parent screen process, not from the invoking shell. If @file{/etc/utmp} is writable by @code{screen}, an appropriate record will be written to this file for each window, and removed when the window is closed. This is useful for working with @code{talk}, @code{script}, @code{shutdown}, @code{rsend}, @code{sccs} and other similar programs that use the utmp file to determine who you are. As long as @code{screen} is active on your terminal, the terminal's own record is removed from the utmp file. @xref{Login}. @c ---------------------------------------------------------------- @node Installation @chapter Installation @cindex installation @menu * Availability:: Where to find screen source code. * Socket Directory:: Where screen stores its handle. * Compiling Screen:: How to build official release. @end menu @node Availability @section Availability @cindex availability The latest official release of @code{screen} available via anonymous ftp server from @code{ftp.gnu.org/gnu/screen/} or any other @code{GNU} distribution site. The home page of @code{screen} is @center @code{https://www.gnu.org/software/screen/}. Since @code{screen} uses pseudo-ttys, the select system call, and UNIX-domain sockets/named pipes, it will not run under a system that does not include these features of 4.2 and 4.3 BSD UNIX. If you want to help, send a note to screen-devel@@gnu.org. @code{Screen} is available under the @code{GNU} copyleft. @node Socket Directory @section Socket Directory @cindex socket directory The socket directory defaults either to @file{$HOME/.screen} or simply to @file{/tmp/screens} or preferably to @file{/usr/local/screens} chosen at compile-time. If @code{screen} is installed setuid root, then the administrator should compile screen with an adequate (not NFS mounted) @code{SOCKDIR}. If @code{screen} is not running setuid-root, the user can specify any mode 700 directory in the environment variable @code{$SCREENDIR}. @node Compiling Screen @section Compiling Screen @cindex compiling screen To compile and install screen: The @code{screen} package comes with a @code{GNU Autoconf} configuration script. Before you compile the package run @center @code{sh ./configure} This will create a @file{config.h} and @file{Makefile} for your machine. If @code{configure} fails for some reason, then look at the examples and comments found in the @file{Makefile.in} and @file{config.h.in} templates. Rename @file{config.status} to @file{config.status.@var{machine}} when you want to keep configuration data for multiple architectures. Running @code{sh ./config.status.@var{machine}} recreates your configuration significantly faster than rerunning @code{configure}. @* Read through the "User Configuration" section of @file{config.h}, and verify that it suits your needs. A comment near the top of this section explains why it's best to install screen setuid to root. Check for the place for the global @file{screenrc}-file and for the socket directory. @* Check the compiler used in @file{Makefile}, the prefix path where to install @code{screen}. Then run @center @code{make} If @code{make} fails to produce one of the files @file{term.h}, @file{comm.h} or @file{tty.c}, then use @code{@var{filename.x}.dist} instead. For additional information about installation of @code{screen} refer to the file @file{INSTALL}, coming with this package. @c ---------------------------------------------------------------- @node Getting Started @chapter Getting Started @cindex introduction Before you begin to use @code{screen} you'll need to make sure you have correctly selected your terminal type, just as you would for any other termcap/terminfo program. (You can do this by using @code{tset}, @code{qterm}, or just @code{set term=mytermtype}, for example.) If you're impatient and want to get started without doing a lot more reading, you should remember this one command: @kbd{C-a ?} (@pxref{Key Binding}). Typing these two characters will display a list of the available @code{screen} commands and their bindings. Each keystroke is discussed in the section on keystrokes (@pxref{Default Key Bindings}). Another section (@pxref{Customization}) deals with the contents of your @file{.screenrc}. If your terminal is a ``true'' auto-margin terminal (it doesn't allow the last position on the screen to be updated without scrolling the screen) consider using a version of your terminal's termcap that has automatic margins turned @emph{off}. This will ensure an accurate and optimal update of the screen in all circumstances. Most terminals nowadays have ``magic'' margins (automatic margins plus usable last column). This is the VT100 style type and perfectly suited for @code{screen}. If all you've got is a ``true'' auto-margin terminal @code{screen} will be content to use it, but updating a character put into the last position on the screen may not be possible until the screen scrolls or the character is moved into a safe position in some other way. This delay can be shortened by using a terminal with insert-character capability. @xref{Special Capabilities}, for more information about telling @code{screen} what kind of terminal you have. @c ---------------------------------------------------------------- @node Invoking Screen @chapter Invoking @code{Screen} @cindex invoking @cindex options @cindex command line options Screen has the following command-line options: @table @samp @item -a Include @emph{all} capabilities (with some minor exceptions) in each window's termcap, even if @code{screen} must redraw parts of the display in order to implement a function. @item -A Adapt the sizes of all windows to the size of the display. By default, @code{screen} may try to restore its old window sizes when attaching to resizable terminals (those with @samp{WS} in their descriptions, e.g. @code{suncmd} or some varieties of @code{xterm}). @item -c @var{file} Use @var{file} as the user's configuration file instead of the default of @file{$HOME/.screenrc}. @item -d [@var{pid.sessionname}] @itemx -D [@var{pid.sessionname}] Do not start @code{screen}, but instead detach a @code{screen} session running elsewhere (@pxref{Detach}). @samp{-d} has the same effect as typing @kbd{C-a d} from the controlling terminal for the session. @samp{-D} is the equivalent to the power detach key. If no session can be detached, this option is ignored. In combination with the @code{-r}/@code{-R} option more powerful effects can be achieved: @table @code @item -d -r Reattach a session and if necessary detach it first. @item -d -R Reattach a session and if necessary detach or even create it first. @item -d -RR Reattach a session and if necessary detach or create it. Use the first session if more than one session is available. @item -D -r Reattach a session. If necessary detach and logout remotely first. @item -D -R Attach here and now. In detail this means: If a session is running, then reattach. If necessary detach and logout remotely first. If it was not running create it and notify the user. This is the author's favorite. @item -D -RR Attach here and now. Whatever that means, just do it. @end table @emph{Note}: It is a good idea to check the status of your sessions with @code{screen -list} before using this option. @item -e @var{xy} Set the command character to @var{x}, and the character generating a literal command character (when typed after the command character) to @var{y}. The defaults are @kbd{C-a} and @kbd{a}, which can be specified as @samp{-e^Aa}. When creating a @code{screen} session, this option sets the default command character. In a multiuser session all users added will start off with this command character. But when attaching to an already running session, this option only changes the command character of the attaching user. This option is equivalent to the commands @code{defescape} or @code{escape} respectively. (@pxref{Command Character}). @item -f @itemx -fn @itemx -fa Set flow-control to on, off, or automatic switching mode, respectively. This option is equivalent to the @code{defflow} command (@pxref{Flow Control}). @item -h @var{num} Set the history scrollback buffer to be @var{num} lines high. Equivalent to the @code{defscrollback} command (@pxref{Copy}). @item -i Cause the interrupt key (usually @kbd{C-c}) to interrupt the display immediately when flow control is on. This option is equivalent to the @code{interrupt} argument to the @code{defflow} command (@pxref{Flow Control}). Its use is discouraged. @item -l @itemx -ln Turn login mode on or off (for @file{/etc/utmp} updating). This option is equivalent to the @code{deflogin} command (@pxref{Login}). @item -ls [@var{match}] @itemx -list [@var{match}] Do not start @code{screen}, but instead print a list of session identification strings (usually of the form @var{pid.tty.host}; @pxref{Session Name}). Sessions marked @samp{detached} can be resumed with @code{screen -r}. Those marked @samp{attached} are running and have a controlling terminal. If the session runs in multiuser mode, it is marked @samp{multi}. Sessions marked as @samp{unreachable} either live on a different host or are dead. An unreachable session is considered dead, when its name matches either the name of the local host, or the specified parameter, if any. See the @code{-r} flag for a description how to construct matches. Sessions marked as @samp{dead} should be thoroughly checked and removed. Ask your system administrator if you are not sure. Remove sessions with the @samp{-wipe} option. @item -L Tell @code{screen} to turn on automatic output logging for the windows. @item -Logfile "file" By default logfile name is "screenlog.0". You can set new logfile name with the @code{-Logfile} option. @item -m Tell @code{screen} to ignore the @code{$STY} environment variable. When this option is used, a new session will always be created, regardless of whether @code{screen} is being called from within another @code{screen} session or not. This flag has a special meaning in connection with the @samp{-d} option: @table @code @item -d -m Start @code{screen} in @emph{detached} mode. This creates a new session but doesn't attach to it. This is useful for system startup scripts. @item -D -m This also starts @code{screen} in @emph{detached} mode, but doesn't fork a new process. The command exits if the session terminates. @end table @item -O Select a more optimal output mode for your terminal rather than true VT100 emulation (only affects auto-margin terminals without @samp{LP}). This can also be set in your @file{.screenrc} by specifying @samp{OP} in the @code{termcap} command. @item -p @var{name_or_number}|-|=|+ Preselect a window. This is useful when you want to reattach to a specific window or you want to send a command via the @samp{-X} option to a specific window. As with screen's select command, @samp{-} selects the blank window. As a special case for reattach, @samp{=} brings up the windowlist on the blank window, while a @samp{+} will create new window. The command will not be executed if the specified window could not be found. @item -P Turns authentication on. By default @code{screen} allows to attach without enter the user's password. This option changes this behavior, i.e. enables authentication. The same effect can be done by using "auth on" command. @item -q Suppress printing of error messages. In combination with @samp{-ls} the exit value is set as follows: 9 indicates a directory without sessions. 10 indicates a directory with running but not attachable sessions. 11 (or more) indicates 1 (or more) usable sessions. In combination with @samp{-r} the exit value is as follows: 10 indicates that there is no session to resume. 12 (or more) indicates that there are 2 (or more) sessions to resume and you should specify which one to choose. In all other cases @samp{-q} has no effect. @item -Q Some commands now can be queried from a remote session using this flag, e.g. 'screen -Q windows'. The commands will send the response to the stdout of the querying process. If there was an error in the command, then the querying process will exit with a non-zero status. The commands that can be queried now are: @code{echo} @code{info} @code{lastmsg} @code{number} @code{select} @code{time} @code{title} @code{windows} @item -r [@var{pid.sessionname}] @itemx -r @var{sessionowner}/[@var{pid.sessionname}] Resume a detached @code{screen} session. No other options (except combinations with @samp{-d} or @samp{-D}) may be specified, though the session name (@pxref{Session Name}) may be needed to distinguish between multiple detached @code{screen} sessions. The second form is used to connect to another user's screen session which runs in multiuser mode. This indicates that screen should look for sessions in another user's directory. This requires setuid-root. @item -R resumes screen only when it's unambiguous which one to attach, usually when only one @code{screen} is detached. Otherwise lists available sessions. @item -RR Resume the first appropriate detached @code{screen} session. If successful, all other command-line options are ignored. If no detached session exists, start a new session using the specified options, just as if @samp{-R} had not been specified. This option is set by default if screen is run as a login-shell (actually screen uses @samp{-xRR} in that case). For combinations with the @samp{-D}/@samp{-d} option see there. @item -s @var{program} Set the default shell to be @var{program}. By default, @code{screen} uses the value of the environment variable @code{$SHELL}, or @file{/bin/sh} if it is not defined. This option is equivalent to the @code{shell} command (@pxref{Shell}). See also there. @item -S @var{sessionname} Set the name of the new session to @var{sessionname}. This option can be used to specify a meaningful name for the session in place of the default @var{tty.host} suffix. This name identifies the session for the @code{screen -list} and @code{screen -r} commands. This option is equivalent to the @code{sessionname} command (@pxref{Session Name}). @item -t @var{name} Set the title (name) for the default shell or specified program. This option is equivalent to the @code{shelltitle} command (@pxref{Shell}). @item -T @var{term} Set the $TERM enviroment variable for new windows to the specified @emph{term}, overriding Screen's automatic terminal-name selection. By default, Screen first tries @code{screen.@var{term}} (where @var{term} is the current value of @code{$TERM}), then falls back to @code{screen} (or @code{screen-w} on wide terminals), and finally to @code{vt100} if no suitable entry is found. @item -U Run screen in UTF-8 mode. This option tells screen that your terminal sends and understands UTF-8 encoded characters. It also sets the default encoding for new windows to @samp{utf8}. @item -v Print the version number. @item -wipe [@var{match}] List available screens like @code{screen -ls}, but remove destroyed sessions instead of marking them as @samp{dead}. An unreachable session is considered dead, when its name matches either the name of the local host, or the explicitly given parameter, if any. See the @code{-r} flag for a description how to construct matches. @item -x Attach to a session which is already attached elsewhere (multi-display mode). @code{Screen} refuses to attach from within itself. But when cascading multiple screens, loops are not detected; take care. @item -X Send the specified command to a running screen session. You may use the @code{-S} option to specify the screen session if you have several running. You can use the @code{-d} or @code{-r} option to tell screen to look only for attached or detached screen sessions. Note that this command doesn't work if the session is password protected. @end table @c ---------------------------------------------------------------- @node Customization @chapter Customizing @code{Screen} @cindex customization You can modify the default settings for @code{screen} to fit your tastes either through a personal @file{.screenrc} file which contains commands to be executed at startup, or on the fly using the @code{colon} command. @menu * Startup Files:: The @file{.screenrc} file. * Source:: Read commands from a file. * Colon:: Entering customization commands interactively. @end menu @node Startup Files @section The @file{.screenrc} file @cindex .screenrc @cindex screenrc When @code{screen} is invoked, it executes initialization commands from the files @file{.screenrc} in the user's home directory and @file{/usr/local/etc/screenrc}. These defaults can be overridden in the following ways: For the global screenrc file @code{screen} searches for the environment variable @code{$SYSTEM_SCREENRC} (this override feature may be disabled at compile-time). The user specific screenrc file is searched for in @code{$SCREENRC}, then @file{@code{$HOME}/.screenrc}. The command line option @samp{-c} specifies which file to use (@pxref{Invoking Screen}). Commands in these files are used to set options, bind commands to keys, and to automatically establish one or more windows at the beginning of your @code{screen} session. Commands are listed one per line, with empty lines being ignored. A command's arguments are separated by tabs or spaces, and may be surrounded by single or double quotes. A @samp{#} turns the rest of the line into a comment, except in quotes. Unintelligible lines are warned about and ignored. Commands may contain references to environment variables. The syntax is the shell-like @code{$VAR} or @code{$@{VAR@}}. Note that this causes incompatibility with previous @code{screen} versions, as now the '$'-character has to be protected with '\' if no variable substitution is intended. A string in single-quotes is also protected from variable substitution. Two configuration files are shipped as examples with your screen distribution: @file{etc/screenrc} and @file{etc/etcscreenrc}. They contain a number of useful examples for various commands. @node Source @section Source @deffn Command source file (@kbd{C-a :})@* Read and execute commands from file @var{file}. Source commands may be nested to a maximum recursion level of ten. If @var{file} is not an absolute path and screen is already processing a source command, the parent directory of the running source command file is used to search for the new command file before screen's current directory. Note that termcap/terminfo/termcapinfo commands only work at startup and reattach time, so they must be reached via the default screenrc files to have an effect. @end deffn @node Colon @section Colon Customization can also be done online, with this command: @kindex : @deffn Command colon (@kbd{C-a :})@* Allows you to enter @file{.screenrc} command lines. Useful for on-the-fly modification of key bindings, specific window creation and changing settings. Note that the @code{set} keyword no longer exists, as of version 3.3. Change default settings with commands starting with @samp{def}. You might think of this as the @code{ex} command mode of @code{screen}, with @code{copy} as its @code{vi} command mode (@pxref{Copy and Paste}). @end deffn @c ---------------------------------------------------------------- @node Commands @chapter Commands A command in @code{screen} can either be bound to a key, invoked from a screenrc file, or called from the @code{colon} prompt (@pxref{Customization}). As of version 3.3, all commands can be bound to keys, although some may be less useful than others. For a number of real life working examples of the most important commands see the files @file{etc/screenrc} and @file{etc/etcscreenrc} of your screen distribution. In this manual, a command definition looks like this: @table @asis @item -- Command: command [-n] ARG1 [ARG2] @dots{} (@var{keybindings})@* This command does something, but I can't remember what. @end table An argument in square brackets (@samp{[]}) is optional. Many commands take an argument of @samp{on} or @samp{off}, which is indicated as @var{state} in the definition. @menu * Default Key Bindings:: @code{screen} keyboard commands. * Command Summary:: List of all commands. @end menu @node Default Key Bindings @section Default Key Bindings As mentioned previously, each keyboard command consists of a @kbd{C-a} followed by one other character. For your convenience, all commands that are bound to lower-case letters are also bound to their control character counterparts (with the exception of @kbd{C-a a}; see below). Thus, both @kbd{C-a c} and @kbd{C-a C-c} can be used to create a window. The following table shows the default key bindings: @table @asis @item @kbd{C-a '} (select)@* Prompt for a window identifier and switch. @xref{Selecting}. @item @kbd{C-a "} (windowlist -b)@* Present a list of all windows for selection. @xref{Selecting}. @item @kbd{C-a 0@dots{}9, -} (select 0@dots{}select 9, select -)@* Switch to window number 0@dots{}9, or the blank window. @xref{Selecting}. @item @kbd{C-a @key{Tab}} (focus)@* Switch the input focus to the next region. @xref{Regions}. @item @kbd{C-a C-a} (other)@* Toggle to the window displayed previously. If this window does no longer exist, @code{other} has the same effect as @code{next}. @xref{Selecting}. @item @kbd{C-a a} (meta)@* Send the command character (C-a) to window. See @code{escape} command. @xref{Command Character}. @item @kbd{C-a A} (title)@* Allow the user to enter a title for the current window. @xref{Naming Windows}. @item @kbd{C-a b} @itemx @kbd{C-a C-b} (break)@* Send a break to the tty. @xref{Break}. @item @kbd{C-a B} (pow_break)@* Close and reopen the tty-line. @xref{Break}. @item @kbd{C-a c} @itemx @kbd{C-a C-c} (screen)@* Create a new window with a shell and switch to that window. @xref{Screen Command}. @item @kbd{C-a C} (clear)@* Clear the screen. @xref{Clear}. @item @kbd{C-a d} @itemx @kbd{C-a C-d} (detach)@* Detach @code{screen} from this terminal. @xref{Detach}. @item @kbd{C-a D D} (pow_detach)@* Detach and logout. @xref{Power Detach}. @item @kbd{C-a f} @itemx @kbd{C-a C-f} (flow)@* Cycle flow among @samp{on}, @samp{off} or @samp{auto}. @xref{Flow}. @item @kbd{C-a F} (fit)@* Resize the window to the current region size. @xref{Fit}. @item @kbd{C-a C-g} (vbell)@* Toggle visual bell mode. @xref{Bell}. @item @kbd{C-a h} (hardcopy)@* Write a hardcopy of the current window to the file ``hardcopy.@var{n}''. @xref{Hardcopy}. @item @kbd{C-a H} (log)@* Toggle logging of the current window to the file ``screenlog.@var{n}''. @xref{Log}. @item @kbd{C-a i} @itemx @kbd{C-a C-i} (info)@* Show info about the current window. @xref{Info}. @item @kbd{C-a k} @itemx @kbd{C-a C-k} (kill)@* Destroy the current window. @xref{Kill}. @item @kbd{C-a l} @itemx @kbd{C-a C-l} (redisplay)@* Fully refresh the current window. @xref{Redisplay}. @item @kbd{C-a L} (login)@* Toggle the current window's login state. @xref{Login}. @item @kbd{C-a m} @itemx @kbd{C-a C-m} (lastmsg)@* Repeat the last message displayed in the message line. @xref{Last Message}. @item @kbd{C-a M} (monitor) Toggle monitoring of the current window. @xref{Monitor}. @item @kbd{C-a @key{SPC}} @itemx @kbd{C-a n} @itemx @kbd{C-a C-n} (next)@* Switch to the next window. @xref{Selecting}. @item @kbd{C-a N} (number)@* Show the number (and title) of the current window. @xref{Number}. @item @kbd{C-a p} @itemx @kbd{C-a C-p} @itemx @kbd{C-a C-h} @itemx @kbd{C-a @key{BackSpace}} (prev)@* Switch to the previous window (opposite of @kbd{C-a n}). @xref{Selecting}. @item @kbd{C-a q} @itemx @kbd{C-a C-q} (xon)@* Send a ^Q (ASCII XON) to the current window. @xref{XON/XOFF}. @item @kbd{C-a Q} (only)@* Delete all regions but the current one. @xref{Regions}. @item @kbd{C-a r} @itemx @kbd{C-a C-r} (wrap)@* Toggle the current window's line-wrap setting (turn the current window's automatic margins on or off). @xref{Wrap}. @item @kbd{C-a s} @itemx @kbd{C-a C-s} (xoff)@* Send a ^S (ASCII XOFF) to the current window. @xref{XON/XOFF}. @item @kbd{C-a S} (split)@* Split the current region horizontally into two new ones. @xref{Regions}. @item @kbd{C-a u} @itemx @kbd{C-a C-u} (parent)@* Switch to the parent window. @xref{Selecting}. @item @kbd{C-a v} (version)@* Display the version and compilation date. @xref{Version}. @item @kbd{C-a C-v} (digraph)@* Enter digraph. @xref{Digraph}. @item @kbd{C-a w} @itemx @kbd{C-a C-w} (windows)@* Show a list of active windows. @xref{Windows}. @item @kbd{C-a W} (width)@* Toggle between 80 and 132 columns. @xref{Window Size}. @item @kbd{C-a x} @itemx @kbd{C-a C-x} (lockscreen)@* Lock your terminal. @xref{Lock}. @item @kbd{C-a X} (remove)@* Kill the current region. @xref{Regions}. @item @kbd{C-a z} @itemx @kbd{C-a C-z} (suspend)@* Suspend @code{screen}. @xref{Suspend}. @item @kbd{C-a Z} (reset)@* Reset the virtual terminal to its ``power-on'' values. @xref{Reset}. @item @kbd{C-a .} (dumptermcap)@* Write out a @file{.termcap} file. @xref{Dump Termcap}. @item @kbd{C-a ?} (help)@* Show key bindings. @xref{Help}. @item @kbd{C-a \} (quit)@* Kill all windows and terminate @code{screen}. @xref{Quit}. @item @kbd{C-a :} (colon)@* Enter a command line. @xref{Colon}. @item @kbd{C-a [} @itemx @kbd{C-a C-[} @itemx @kbd{C-a @key{ESC}} (copy)@* Enter copy/scrollback mode. @xref{Copy}. @item @kbd{C-a ]} @itemx @kbd{C-a C-]} (paste .)@* Write the contents of the paste buffer to the stdin queue of the current window. @xref{Paste}. @item @kbd{C-a @{} @itemx @kbd{C-a @}} (history)@* Copy and paste a previous (command) line. @xref{History}. @item @kbd{C-a >} (writebuf)@* Write the paste buffer out to the screen-exchange file. @xref{Screen Exchange}. @item @kbd{C-a <} (readbuf)@* Read the screen-exchange file into the paste buffer. @xref{Screen Exchange}. @item @kbd{C-a =} (removebuf)@* Delete the screen-exchange file. @xref{Screen Exchange}. @item @kbd{C-a _} (silence)@* Start/stop monitoring the current window for inactivity. @xref{Monitor}. @item @kbd{C-a |} (split -v)@* Split the current region vertically into two new ones. @xref{Regions}. @item @kbd{C-a ,} (license)@* Show the copyright page. @xref{License}. @item @kbd{C-a *} (displays)@* Show the listing of attached displays. @xref{Displays}. @end table @node Command Summary @section Command Summary @cindex command summary @table @code @item acladd @var{usernames} Allow other users in this session. @xref{Multiuser Session}. @item aclchg @var{usernames permbits list} Change a user's permissions. @xref{Multiuser Session}. @item acldel @var{username} Disallow other user in this session. @xref{Multiuser Session}. @item aclgrp @var{usrname} [@var{groupname}] Inherit permissions granted to a group leader. @xref{Multiuser Session}. @item aclumask [@var{users}]+/-@var{bits} ... Predefine access to new windows. @xref{Umask}. @item activity @var{message} Set the activity notification message. @xref{Monitor}. @item addacl @var{usernames} Synonym to @code{acladd}. @xref{Multiuser Session}. @item allpartial @var{state} Set all windows to partial refresh. @xref{Redisplay}. @item altscreen @var{state} Enables support for the "alternate screen" terminal capability. @xref{Redisplay}. @item at [@var{ident}][@kbd{#}@var{|}@kbd{*}@var{|}@kbd{%}] @var{command} [@var{args}] Execute a command at other displays or windows. @xref{At}. @item attrcolor @var{attrib} [@var{attribute/color-modifier}] Map attributes to colors. @xref{Attrcolor}. @item auth @var{state} This command enables/disables password protection for the screen session. It is off by default (authentication is disabled). @item autodetach @var{state} Automatically detach the session on SIGHUP. @xref{Detach}. @item autonuke @var{state} Enable a clear screen to discard unwritten output. @xref{Autonuke}. @item backtick @var{id} @var{lifespan} @var{autorefresh} @var{command} [@var{args}] Define a command for the backtick string escape. @xref{Backtick}. @item bce [@var{state}] Change background color erase. @xref{Character Processing}. @item bell_msg [@var{message}] Set the bell notification message. @xref{Bell}. @item bind [-c @var{class}] @var{key} [@var{command} [@var{args}]] Bind a command to a key. @xref{Bind}. @item bindkey [@var{opts}] [@var{string} [@var{cmd args}]] Bind a string to a series of keystrokes. @xref{Bindkey}. @item blanker Blank the screen. @xref{Screen Saver}. @item blankerprg Define a blanker program. @xref{Screen Saver}. @item break [@var{duration}] Send a break signal to the current window. @xref{Break}. @item breaktype [@var{tcsendbreak} | @var{TCSBRK} | @var{TIOCSBRK}] Specify how to generate breaks. @xref{Break}. @item bufferfile [@var{exchange-file}] Select a file for screen-exchange. @xref{Screen Exchange}. @item bumpleft Swaps window with previous one on window list. @xref{Bumpleft}. @item bumpright Swaps window with previous one on window list. @xref{Bumpright}. @item c1 [@var{state}] Change c1 code processing. @xref{Character Processing}. @item caption @var{mode} [@var{string}] Change caption mode and string. @xref{Regions}. @item chacl @var{usernames permbits list} Synonym to @code{aclchg}. @xref{Multiuser Session}. @item charset @var{set} Change character set slot designation. @xref{Character Processing}. @item chdir [@var{directory}] Change the current directory for future windows. @xref{Chdir}. @item cjkwidth Treat ambiguous width characters as full/half width. @xref{Character Processing}. @item clear Clear the window screen. @xref{Clear}. @item colon Enter a @code{screen} command. @xref{Colon}. @item collapse Reorders window on window list, removing number gaps between them. @xref{Collapse}. @item command [-c @var{class}] Simulate the screen escape key. @xref{Command Character}. @item compacthist [@var{state}] Selects compaction of trailing empty lines. @xref{Scrollback}. @item console [@var{state}] Grab or ungrab console output. @xref{Console}. @item copy Enter copy mode. @xref{Copy}. @item copy_reg [@var{key}] Removed. Use @code{paste} instead. @xref{Registers}. @item crlf @var{state} Select line break behavior for copying. @xref{Line Termination}. @item defautonuke @var{state} Select default autonuke behavior. @xref{Autonuke}. @item defbce @var{state} Select background color erase. @xref{Character Processing}. @item defbreaktype [@var{tcsendbreak} | @var{TCSBRK} | @var{TIOCSBRK}] Specify the default for generating breaks. @xref{Break}. @item defc1 @var{state} Select default c1 processing behavior. @xref{Character Processing}. @item defcharset [@var{set}] Change defaul character set slot designation. @xref{Character Processing}. @item defencoding @var{enc} Select default window encoding. @xref{Character Processing}. @item defescape @var{xy} Set the default command and @code{meta} characters. @xref{Command Character}. @item defflow @var{fstate} Select default flow control behavior. @xref{Flow}. @item defgr @var{state} Select default GR processing behavior. @xref{Character Processing}. @item defhstatus [@var{status}] Select default window hardstatus line. @xref{Hardstatus}. @item deflog @var{state} Select default window logging behavior. @xref{Log}. @item deflogin @var{state} Select default utmp logging behavior. @xref{Login}. @item defmode @var{mode} Select default file mode for ptys. @xref{Mode}. @item defmonitor @var{state} Select default activity monitoring behavior. @xref{Monitor}. @item defmousetrack @var{on}|@var{off} Select the default mouse tracking behavior. @xref{Mousetrack}. @item defnonblock @var{state}|@var{numsecs} Select default nonblock mode. @xref{Nonblock}. @item defobuflimit @var{limit} Select default output buffer limit. @xref{Obuflimit}. @item defscrollback @var{num} Set default lines of scrollback. @xref{Scrollback}. @item defshell @var{command} Set the default program for new windows. @xref{Shell}. @item defsilence @var{state} Select default idle monitoring behavior. @xref{Monitor}. @item defslowpaste @var{msec} Select the default inter-character timeout when pasting. @xref{Paste}. @item defutf8 @var{state} Select default character encoding. @xref{Character Processing}. @item defwrap @var{state} Set default line-wrapping behavior. @xref{Wrap}. @item defwritelock @var{on|off|auto} Set default writelock behavior. @xref{Multiuser Session}. @item zombie_timeout [@var{seconds}] Try to reconnect dead windows after timeout. @xref{Zombie}. @item detach [-h] Disconnect @code{screen} from the terminal. @xref{Detach}. @item digraph [@var{preset} [@var{unicode-value}]] Enter a digraph sequence. @xref{Digraph}. @item dinfo Show terminal information. @xref{Info}. @item displays List currently active user interfaces. @xref{Displays}. @item dumptermcap Write the window's termcap entry to a file. @xref{Dump Termcap}. @item echo [-n] @var{message} Show a startup message. @xref{Startup}. @item encoding @var{enc} [@var{denc}] Set the encoding of a window. @xref{Character Processing}. @item escape @var{xy} Set the command and @code{meta} characters. @xref{Command Character}. @item eval @var{command1} [@var{command2} ...] Parse and execute each argument. @xref{Eval}. @item exec [[@var{fdpat}] @var{command} [@var{args} ...]] Run a subprocess (filter). @xref{Exec}. @item fit Change window size to current display size. @xref{Window Size}. @item flow [@var{fstate}] Set flow control behavior. @xref{Flow}. @item focus [@code{next}|@code{prev}|@code{up}|@code{down}|@code{left}|@code{right}|@code{top}|@code{bottom}] Move focus to next region. @xref{Regions}. @item focusminsize Force the current region to a certain size. @xref{Focusminsize}. @item gr [@var{state}] Change GR charset processing. @xref{Character Processing}. @item group [@var{grouptitle}] Change or show the group the current window belongs to. @xref{Window Groups}. @item hardcopy [-h] [@var{file}] Write out the contents of the current window. @xref{Hardcopy}. @item hardcopy_append @var{state} Append to hardcopy files. @xref{Hardcopy}. @item hardcopydir @var{directory} Place, where to dump hardcopy files. @xref{Hardcopy}. @item hardstatus [@var{state}] Use the hardware status line. @xref{Hardware Status Line}. @item height [@var{lines} [@var{cols}]] Set display height. @xref{Window Size}. @item help [-c @var{class}] Show current key bindings. @xref{Help}. @item history Find previous command beginning @dots{}. @xref{History}. @item hstatus @var{status} Change the window's hardstatus line. @xref{Hardstatus}. @item idle [@var{timeout} [@var{cmd} @var{args}]] Define a screen saver command. @xref{Screen Saver}. @item ignorecase [on|off] Ignore character case in searches. @xref{Searching}. @item info Show window settings. @xref{Info}. @item ins_reg [@var{key}] Removed, use @code{paste} instead. @xref{Registers}. @item kill Destroy the current window. @xref{Kill}. @item lastmsg Redisplay the last message. @xref{Last Message}. @item layout new [@var{title}] Create a layout. @xref{Layout}. @item layout remove [@var{n}|@var{title}] Delete a layout. @xref{Layout}. @item layout next Select the next layout. @xref{Layout}. @item layout prev Select the previous layout. @xref{Layout}. @item layout select [@var{n}|@var{title}] Jump to a layout. @xref{Layout}. @item layout show List the available layouts. @xref{Layout}. @item layout title [@var{title}] Show or set the title of a layout. @xref{Layout}. @item layout number [@var{n}] Show or set the number of a layout. @xref{Layout}. @item layout attach [@var{title}|:last] Show or set which layout to reattach to. @xref{Layout}. @item layout save [@var{n}|@var{title}] Remember the organization of a layout. @xref{Layout}. @item layout autosave [@var{on}|@var{off}] Show or set the status of layout saving. @xref{Layout}. @item layout dump [filename] Save the layout arrangement to a file. @xref{Layout}. @item license Display licensing information. @xref{Startup}. @item lockscreen Lock the controlling terminal. @xref{Lock}. @item log [@var{state}] Log all output in the current window. @xref{Log}. @item logfile @var{filename} Place where to collect logfiles. @xref{Log}. @item login [@var{state}] Log the window in @file{/etc/utmp}. @xref{Login}. @item logtstamp [@var{state}] Configure logfile time-stamps. @xref{Log}. @item mapdefault Use only the default mapping table for the next keystroke. @xref{Bindkey Control}. @item mapnotnext Don't try to do keymapping on the next keystroke. @xref{Bindkey Control}. @item maptimeout @var{n} Set the inter-character timeout used for keymapping. @xref{Bindkey Control}. @item markkeys @var{string} Rebind keys in copy mode. @xref{Copy Mode Keys}. @item meta Insert the command character. @xref{Command Character}. @item monitor [@var{state}] Monitor activity in window. @xref{Monitor}. @item mousetrack [@var{on}|@var{off}] Enable selecting split regions with mouse clicks. @xref{Mousetrack}. @item msgminwait @var{sec} Set minimum message wait. @xref{Message Wait}. @item msgwait @var{sec} Set default message wait. @xref{Message Wait}. @item multiuser @var{state} Go into single or multi user mode. @xref{Multiuser Session}. @item next Switch to the next window. @xref{Selecting}. @item nonblock [@var{state}|@var{numsecs}] Disable flow control to the current display. @xref{Nonblock}.|@var{numsecs}] @item number [@var{n}] Change/display the current window's number. @xref{Number}. @item obuflimit [@var{limit}] Select output buffer limit. @xref{Obuflimit}. @item only Kill all other regions. @xref{Regions}. @item other Switch to the window you were in last. @xref{Selecting}. @item parent Switch to the parent window. @xref{Selecting}. @item partial @var{state} Set window to partial refresh. @xref{Redisplay}. @item paste [@var{src_regs} [@var{dest_reg}]] Paste contents of paste buffer or registers somewhere. @xref{Paste}. @item pastefont [@var{state}] Include font information in the paste buffer. @xref{Paste}. @item pow_break Close and Reopen the window's terminal. @xref{Break}. @item pow_detach Detach and hang up. @xref{Power Detach}. @item pow_detach_msg [@var{message}] Set message displayed on @code{pow_detach}. @xref{Power Detach}. @item prev Switch to the previous window. @xref{Selecting}. @item printcmd [@var{cmd}] Set a command for VT100 printer port emulation. @xref{Printcmd}. @item process [@var{key}] Treat a register as input to @code{screen}. @xref{Registers}. @item quit Kill all windows and exit. @xref{Quit}. @item readbuf [-e @var{encoding}] [@var{filename}] Read the paste buffer from the screen-exchange file. @xref{Screen Exchange}. @item readreg [-e @var{encoding}] [@var{reg} [@var{file}]] Load a register from paste buffer or file. @xref{Registers}. @item redisplay Redisplay the current window. @xref{Redisplay}. @item register [-e @var{encoding}] @var{key} @var{string} Store a string to a register. @xref{Registers}. @item remove Kill current region. @xref{Regions}. @item removebuf Delete the screen-exchange file. @xref{Screen Exchange}. @item rendition bell | monitor | silence | so @var{attr} [@var{color}] Change text attributes in caption for flagged windows. @xref{Rendition}. @item reset Reset the terminal settings for the window. @xref{Reset}. @item resize [(+/-)lines] Grow or shrink a region. @xref{Resize}. @item screen [@var{opts}] [@var{n}] [@var{cmd} [@var{args}] | //group] Create a new window. @xref{Screen Command}. @item scrollback @var{num} Set size of scrollback buffer. @xref{Scrollback}. @item select [@var{n}|-|.] Switch to a specified window. @xref{Selecting}. @item sessionname [@var{name}] Name this session. @xref{Session Name}. @item setenv [@var{var} [@var{string}]] Set an environment variable for new windows. @xref{Setenv}. @item setsid @var{state} Control process group creation for windows. @xref{Setsid}. @item shell @var{command} Set the default program for new windows. @xref{Shell}. @item shelltitle @var{title} Set the default name for new windows. @xref{Shell}. @item silence [@var{state}|@var{seconds}] Monitor a window for inactivity. @xref{Monitor}. @item silencewait @var{seconds} Default timeout to trigger an inactivity notify. @xref{Monitor}. @item sleep @var{num} Pause during startup. @xref{Startup}. @item slowpaste @var{msec} Slow down pasting in windows. @xref{Paste}. @item source @var{file} Run commands from a file. @xref{Source}. @item sorendition [@var{attr} [@var{color}]] Deprecated. Use @code{rendition so} instead. @xref{Rendition}. @item split Split region into two parts. @xref{Regions}. @item startup_message @var{state} Display copyright notice on startup. @xref{Startup}. @item stuff [@var{string}] Stuff a string in the input buffer of a window. @xref{Paste}. @item su [@var{username} [@var{password} [@var{password2}]]] Identify a user. @xref{Multiuser Session}. @item suspend Put session in background. @xref{Suspend}. @item term @var{term} Set @code{$TERM} for new windows. @xref{Term}. @item termcap @var{term} @var{terminal-tweaks} [@var{window-tweaks}] Tweak termcap entries for best performance. @xref{Termcap Syntax}. @item terminfo @var{term} @var{terminal-tweaks} [@var{window-tweaks}] Ditto, for terminfo systems. @xref{Termcap Syntax}. @item termcapinfo @var{term} @var{terminal-tweaks} [@var{window-tweaks}] Ditto, for both systems. @xref{Termcap Syntax}. @item title [@var{windowtitle}] Set the name of the current window. @xref{Title Command}. @item umask [@var{users}]+/-@var{bits} ... Synonym to @code{aclumask}. @xref{Umask}. @item unbindall Unset all keybindings. @xref{Bind}. @item unsetenv @var{var} Unset environment variable for new windows. @xref{Setenv}. @item utf8 [@var{state} [@var{dstate}]] Select character encoding of the current window. @xref{Character Processing}. @item vbell [@var{state}] Use visual bell. @xref{Bell}. @item vbell_msg [@var{message}] Set vbell message. @xref{Bell}. @item vbellwait @var{sec} Set delay for vbell message. @xref{Bell}. @item version Print @code{screen} version. @xref{Version}. @item wall @var{message} Write a message to all displays. @xref{Multiuser Session}. @item width [@var{cols} [@var{lines}]] Set the width of the window. @xref{Window Size}. @item windowlist [[-b] [-m] [-g]] | string [@var{string}] | title [@var{title}] Present a list of all windows for selection. @xref{Windowlist}. @item windows List active windows. @xref{Windows}. @item wrap [ on | off ] Control line-wrap behavior. @xref{Wrap}. @item writebuf [-e @var{encoding}] [@var{filename}] Write paste buffer to screen-exchange file. @xref{Screen Exchange}. @item writelock @var{on}|@var{off}|@var{auto} Grant exclusive write permission. @xref{Multiuser Session}. @item xoff Send an XOFF character. @xref{XON/XOFF}. @item xon Send an XON character. @xref{XON/XOFF}. @item zmodem [off|auto|catch|pass] Define how screen treats zmodem requests. @xref{Zmodem}. @item zombie [@var{keys} [onerror] ] Keep dead windows. @xref{Zombie}. @end table @c ---------------------------------------------------------------- @node New Window @chapter New Window This section describes the commands for creating a new window for running programs. When a new window is created, the first available number is assigned to it. The number of windows is limited at compile-time by the MAXWIN configuration parameter (which defaults to 40). @menu * Chdir:: Change the working directory for new windows. * Screen Command:: Create a new window. * Setenv:: Set environment variables for new windows. * Shell:: Parameters for shell windows. * Term:: Set the terminal type for new windows. * Window Types:: Creating different types of windows. * Window Groups:: Grouping windows together @end menu @node Chdir @section Chdir @deffn Command chdir [directory] (none)@* Change the current directory of @code{screen} to the specified directory or, if called without an argument, to your home directory (the value of the environment variable @code{$HOME}). All windows that are created by means of the @code{screen} command from within @file{.screenrc} or by means of @kbd{C-a : screen @dots{}} or @kbd{C-a c} use this as their default directory. Without a @code{chdir} command, this would be the directory from which @code{screen} was invoked. Hardcopy and log files are always written to the @emph{window's} default directory, @emph{not} the current directory of the process running in the window. You can use this command multiple times in your @file{.screenrc} to start various windows in different default directories, but the last @code{chdir} value will affect all the windows you create interactively. @end deffn @node Screen Command @section Screen Command @kindex c @kindex C-c @deffn Command screen [opts] [n] [cmd [args] @var{| //group}] (@kbd{C-a c}, @kbd{C-a C-c})@* Establish a new window. The flow-control options (@samp{-f}, @samp{-fn} and @samp{-fa}), title option (@samp{-t}), login options (@samp{-l} and @samp{-ln}) , terminal type option (@samp{-T @var{term}}), the all-capability-flag (@samp{-a}) and scrollback option (@samp{-h @var{num}}) may be specified with each command. The option (@samp{-M}) turns monitoring on for this window. The option (@samp{-L}) turns output logging on for this window. If an optional number @var{n} in the range 0@dots{}MAXWIN-1 is given, the window number @var{n} is assigned to the newly created window (or, if this number is already in-use, the next available number). If a command is specified after @code{screen}, this command (with the given arguments) is started in the window; otherwise, a shell is created. If @samp{//group} is supplied, a container-type window is created in which other windows may be created inside it. @xref{Window Groups}. Screen has built in some functionality of @samp{cu} and @samp{telnet}. @xref{Window Types}. @end deffn Thus, if your @file{.screenrc} contains the lines @example # example for .screenrc: screen 1 screen -fn -t foobar 2 -L telnet foobar @end example @noindent @code{screen} creates a shell window (in window #1) and a window with a TELNET connection to the machine foobar (with no flow-control using the title @samp{foobar} in window #2) and will write a logfile @samp{screenlog.2} of the telnet session. If you do not include any @code{screen} commands in your @file{.screenrc} file, then @code{screen} defaults to creating a single shell window, number zero. When the initialization is completed, @code{screen} switches to the last window specified in your .screenrc file or, if none, it opens default window #0. @node Setenv @section Setenv @deffn Command setenv var string (none)@* Set the environment variable @var{var} to value @var{string}. If only @var{var} is specified, the user will be prompted to enter a value. If no parameters are specified, the user will be prompted for both variable and value. The environment is inherited by all subsequently forked shells. @end deffn @deffn Command unsetenv var (none)@* Unset an environment variable. @end deffn @node Shell @section Shell @deffn Command shell command @deffnx Command defshell command (none)@* Set the command to be used to create a new shell. This overrides the value of the environment variable @code{$SHELL}. This is useful if you'd like to run a tty-enhancer which is expecting to execute the program specified in @code{$SHELL}. If the command begins with a @samp{-} character, the shell will be started as a login-shell. Typical shells do only minimal initialization when not started as a login-shell. E.g. Bash will not read your @file{~/.bashrc} unless it is a login-shell. @code{defshell} is currently a synonym to the @code{shell} .screenrc command. @end deffn @deffn Command shelltitle title (none)@* Set the title for all shells created during startup or by the C-a C-c command. @xref{Naming Windows}, for details about what titles are. @end deffn @node Term @section Term @deffn Command term term (none)@* In each window @code{screen} opens, it sets the @code{$TERM} variable to @code{screen} by default, unless no description for @code{screen} is installed in the local termcap or terminfo data base. In that case it pretends that the terminal emulator is @samp{vt100}. This won't do much harm, as @code{screen} is VT100/ANSI compatible. The use of the @code{term} command is discouraged for non-default purpose. That is, one may want to specify special @code{$TERM} settings (e.g. vt100) for the next @code{screen rlogin othermachine} command. Use the command @code{screen -T vt100 rlogin othermachine} rather than setting and resetting the default. @end deffn @node Window Types @section Window Types @cindex window types Screen provides three different window types. New windows are created with @code{screen}'s @samp{screen} command (@pxref{Screen Command}). The first parameter to the @samp{screen} command defines which type of window is created. The different window types are all special cases of the normal type. They have been added in order to allow @code{screen} to be used efficiently as a console with 100 or more windows. @itemize @bullet @item The normal window contains a shell (default, if no parameter is given) or any other system command that could be executed from a shell. (e.g. @samp{slogin}, etc...). @item If a tty (character special device) name (e.g. @samp{/dev/ttya}) is specified as the first parameter, then the window is directly connected to this device. This window type is similar to @samp{screen cu -l /dev/ttya}. Read and write access is required on the device node, an exclusive open is attempted on the node to mark the connection line as busy. An optional parameter is allowed consisting of a comma separated list of flags in the notation used by @samp{stty(1)}: @table @code @item Usually 300, 1200, 9600 or 19200. This affects transmission as well as receive speed. @item cs8 or cs7 Specify the transmission of eight (or seven) bits per byte. @item ixon or -ixon Enables (or disables) software flow-control (CTRL-S/CTRL-Q) for sending data. @item ixoff or -ixoff Enables (or disables) software flow-control for receiving data. @item istrip or -istrip Clear (or keep) the eight bit in each received byte. @end table You may want to specify as many of these options as applicable. Unspecified options cause the terminal driver to make up the parameter values of the connection. These values are system-dependent and may be in defaults or values saved from a previous connection. For tty windows, the @code{info} command shows some of the modem control lines in the status line. These may include @samp{RTS}, @samp{CTS}, @samp{DTR}, @samp{CD} and more. This depends rather on on the available @code{ioctl()}'s and system header files than on the physical capabilities of the serial board. The name of a logical low (inactive) signal is preceded by an exclamation mark (@samp{!}), otherwise the signal is logical high (active). Unsupported but shown signals are usually shown low. When the @code{CLOCAL} status bit is true, the whole set of modem signals is placed inside curly braces (@samp{@{} and @samp{@}}). When the @code{CRTSCTS} or @code{TIOCSOFTCAR} bit is true, the signals @samp{CTS} or @samp{CD} are shown in parenthesis, respectively. For tty windows, the command @code{break} causes the Data transmission line (TxD) to go low for a specified period of time. This is expected to be interpreted as break signal on the other side. No data is sent and no modem control line is changed when a @code{break} is issued. @item If the first parameter is @code{//telnet}, the second parameter is expected to be a host name, and an optional third parameter may specify a TCP port number (default decimal 23). Screen will connect to a server listening on the remote host and use the telnet protocol to communicate with that server. For telnet windows, the command @code{info} shows details about the connection in square brackets (@samp{[} and @samp{]}) at the end of the status line. @table @code @item b BINARY. The connection is in binary mode. @item e ECHO. Local echo is disabled. @item c SGA. The connection is in `character mode' (default: `line mode'). @item t TTYPE. The terminal type has been requested by the remote host. Screen sends the name @code{screen} unless instructed otherwise (see also the command @samp{term}). @item w NAWS. The remote site is notified about window size changes. @item f LFLOW. The remote host will send flow control information. (Ignored at the moment.) @end table Additional flags for debugging are @samp{x}, @samp{t} and @samp{n} (XDISPLOC, TSPEED and NEWENV). For telnet windows, the command @code{break} sends the telnet code @code{IAC BREAK} (decimal 243) to the remote host. @end itemize @node Window Groups @section Window Groups @cindex window groups Screen provides a method for grouping windows together. Windows can be organized in a hierarchical fashion, resembling a tree structure. New screens are created using the @code{screen} command while new groups are created using @code{screen //group}. @xref{Screen Command}. Once a new group is created, it will act as a container for windows and even other groups. When a group is selected, you will see the output of the @code{windowlist} command, allowing you to select a window inside. If there are no windows inside a group, use the @code{screen} command to create one. Once inside a group, using the commands @code{next} and @code{prev} will switch between windows only in that group. Using the @code{windowlist} command will give you the opportunity to leave the group you are in. @xref{Windowlist}. @deffn Command group [grouptitle] (none)@* Change or show the group the current window belongs to. Windows can be moved around between different groups by specifying the name of the destination group. Without specifying a group, the title of the current group is displayed. @end deffn Using groups in combination with layouts will help create a multi-desktop experience. One group can be assigned for each layout made. Windows can be made, split, and organized within each group as desired, after which switching between groups can be as easy as switching layouts. @c ---------------------------------------------------------------- @node Selecting @chapter Selecting a Window This section describes the commands for switching between windows in an @code{screen} session. The windows are numbered from 0 to 9, and are created in that order by default (@pxref{New Window}). @menu * Next and Previous:: Forward or back one window. * Other Window:: Switch back and forth between two windows. * Select:: Switch to a window (and to one after @code{kill}). * Windowlist:: Present a list of all windows for selection. @end menu @node Next and Previous @section Moving Back and Forth @kindex SPC @kindex n @kindex C-n @deffn Command next (@kbd{C-a @key{SPC}}, @kbd{C-a n}, @kbd{C-a C-n})@* Switch to the next window. This command can be used repeatedly to cycle through the list of windows. (On some terminals, C-@key{SPC} generates a NUL character, so you must release the control key before pressing space.) @end deffn @kindex p @kindex C-p @kindex C-h @kindex Backspace @deffn Command prev (@kbd{C-a p}, @kbd{C-a C-p}, @kbd{C-a C-h}, @kbd{C-a @key{Backspace}})@* Switch to the previous window (the opposite of @kbd{C-a n}). @end deffn @kindex u @kindex C-u @deffn Command parent (@kbd{C-a u}, @kbd{C-a C-u})@* Switch to the parent window. @end deffn @node Other Window @section Other Window @kindex C-a @deffn Command other (@kbd{C-a C-a})@* Switch to the last window displayed. Note that this command defaults to the command character typed twice, unless overridden. For instance, if you use the option @samp{-e]x}, this command becomes @kbd{]]} (@pxref{Command Character}). @end deffn @node Select @section Select @kindex 0@dots{}9 @kindex ' @deffn Command select [n @var{|-|.}] (@kbd{C-a @var{n}}, @kbd{C-a '})@* Switch to the window with the number @var{n}. If no window number is specified, you get prompted for an identifier. This can be a window name (title) or a number. When a new window is established, the lowest available number is assigned to this window. Thus, the first window can be activated by @code{select 0}; there can be no more than 10 windows present simultaneously (unless screen is compiled with a higher MAXWIN setting). There are two special arguments, @code{select -} switches to the internal blank window and @code{select .} switches to the current window. The latter is useful if used with screen's @code{-X} option. @end deffn @node Windowlist @section Windowlist @kindex " @deffn Command windowlist [-b] [-m] [-g] @deffnx Command windowlist string [@var{string}] @deffnx Command windowlist title [@var{title}] (@kbd{C-a "})@* Display all windows in a table for visual window selection. If screen was in a window group, screen will back out of the group and then display the windows in that group. If the @code{-b} option is given, screen will switch to the blank window before presenting the list, so that the current window is also selectable. The @code{-m} option changes the order of the windows, instead of sorting by window numbers screen uses its internal most-recently-used list. The @code{-g} option will show the windows inside any groups in that level and downwards. The following keys are used to navigate in @code{windowlist}: @noindent @kbd{k}, @kbd{C-p}, or @kbd{up} Move up one line. @noindent @kbd{j}, @kbd{C-n}, or @kbd{down} Move down one line. @noindent @kbd{C-g} or @kbd{escape} Exit windowlist. @noindent @kbd{C-a} or @kbd{home} Move to the first line. @noindent @kbd{C-e} or @kbd{end} Move to the last line. @noindent @kbd{C-u} or @kbd{C-d} Move one half page up or down. @noindent @kbd{C-b} or @kbd{C-f} Move one full page up or down. @indent @kbd{0..9} Using the number keys, move to the selected line. @noindent @kbd{mouseclick} Move to the selected line. Available when @code{mousetrack} is set to @code{on}. @noindent @kbd{/} Search. @noindent @kbd{n} Repeat search in the forward direction. @noindent @kbd{N} Repeat search in the backward direction. @noindent @kbd{m} Toggle MRU. @noindent @kbd{g} Toggle group nesting. @noindent @kbd{a} All window view. @noindent @kbd{C-h} or @kbd{backspace} Back out the group. @noindent @kbd{,} Switch numbers with the previous window. @noindent @kbd{.} Switch numbers with the next window. @noindent @kbd{K} Kill that window. @noindent @kbd{space} or @kbd{enter} Select that window. The table format can be changed with the string and title option, the title is displayed as table heading, while the lines are made by using the string setting. The default setting is @samp{Num Name%=Flags} for the title and @samp{%3n %t%=%f} for the lines. See the string escapes chapter (@pxref{String Escapes}) for more codes (e.g. color settings). @code{Windowlist} needs a region size of at least 10 characters wide and 6 characters high in order to display. @end deffn @c ---------------------------------------------------------------- @node Session Management @chapter Session Management Perhaps the most useful feature of @code{screen} is the way it allows the user to move a session between terminals, by detaching and reattaching. This also makes life easier for modem users who have to deal with unexpected loss of carrier. @menu * Detach:: Disconnect @code{screen} from your terminal. * Power Detach:: Detach and log out. * Lock:: Lock your terminal temporarily. * Multiuser Session:: Changing number of allowed users. * Session Name:: Rename your session for later reattachment. * Suspend:: Suspend your session. * Quit:: Terminate your session. @end menu @node Detach @section Detach @deffn Command autodetach state (none)@* Sets whether @code{screen} will automatically detach upon hangup, which saves all your running programs until they are resumed with a @code{screen -r} command. When turned off, a hangup signal will terminate @code{screen} and all the processes it contains. Autodetach is on by default. @end deffn @kindex d @kindex C-d @deffn Command detach (@kbd{C-a d}, @kbd{C-a C-d})@* Detach the @code{screen} session (disconnect it from the terminal and put it into the background). A detached @code{screen} can be resumed by invoking @code{screen} with the @code{-r} option (@pxref{Invoking Screen}). The @code{-h} option tells screen to immediately close the connection to the terminal (@samp{hangup}). @end deffn @deffn Command password [crypted_pw] (none)@* Present a crypted password in your @file{.screenrc} file and screen will ask for it, whenever someone attempts to resume a detached session. This is useful, if you have privileged programs running under @code{screen} and you want to protect your session from reattach attempts by users that managed to assume your uid. (I.e. any superuser.) If no crypted password is specified, screen prompts twice a password and places its encryption in the paste buffer. Default is `none', which disables password checking. @end deffn @node Power Detach @section Power Detach @kindex D @deffn Command pow_detach (@kbd{C-a D D})@* Mainly the same as @code{detach}, but also sends a HANGUP signal to the parent process of @code{screen}.@* @emph{Caution}: This will result in a logout if @code{screen} was started from your login-shell. @end deffn @deffn Command pow_detach_msg [message] (none)@* The @var{message} specified here is output whenever a power detach is performed. It may be used as a replacement for a logout message or to reset baud rate, etc. Without a parameter, the current message is shown. @end deffn @node Lock @section Lock @kindex x @kindex C-x @deffn Command lockscreen (@kbd{C-a x}, @kbd{C-a C-x})@* Call a screenlock program (@file{/local/bin/lck} or @file{/usr/bin/lock} or a builtin, if no other is available). Screen does not accept any command keys until this program terminates. Meanwhile processes in the windows may continue, as the windows are in the detached state. The screenlock program may be changed through the environment variable @code{$LOCKPRG} (which must be set in the shell from which @code{screen} is started) and is executed with the user's uid and gid. Warning: When you leave other shells unlocked and have no password set on @code{screen}, the lock is void: One could easily re-attach from an unlocked shell. This feature should rather be called @code{lockterminal}. @end deffn @node Multiuser Session @section Multiuser Session @cindex multiuser session These commands allow other users to gain access to one single @code{screen} session. When attaching to a multiuser @code{screen} the sessionname is specified as @code{username/sessionname} to the @code{-S} command line option. @code{Screen} must be compiled with multiuser support to enable features described here. @menu * Multiuser:: Enable / Disable multiuser mode. * Acladd:: Enable a specific user. * Aclchg:: Change a users permissions. * Acldel:: Disable a specific user. * Aclgrp:: Grant a user permissions to other users. * Displays:: List all active users at their displays. * Umask:: Predefine access to new windows. * Wall:: Write a message to all users. * Writelock:: Grant exclusive window access. * Su:: Substitute user. @end menu @node Multiuser @subsection Multiuser @deffn Command multiuser @var{state} (none)@* Switch between single-user and multi-user mode. Standard screen operation is single-user. In multi-user mode the commands @code{acladd}, @code{aclchg} and @code{acldel} can be used to enable (and disable) other users accessing this @code{screen}. @end deffn @node Acladd @subsection Acladd @deffn Command acladd @var{usernames} @deffnx Command addacl @var{usernames} (none)@* Enable users to fully access this screen session. @var{Usernames} can be one user or a comma separated list of users. This command enables to attach to the @code{screen} session and performs the equivalent of @code{aclchg @var{usernames} +rwx "#?"}. To add a user with restricted access, use the @code{aclchg} command below. @code{Addacl} is a synonym to @code{acladd}. Multi-user mode only. @end deffn @node Aclchg @subsection Aclchg @deffn Command aclchg @var{usernames permbits list} @deffnx Command chacl @var{usernames permbits list} (none)@* Change permissions for a comma separated list of users. Permission bits are represented as @samp{r}, @samp{w} and @samp{x}. Prefixing @samp{+} grants the permission, @samp{-} removes it. The third parameter is a comma separated list of commands or windows (specified either by number or title). The special list @samp{#} refers to all windows, @samp{?} to all commands. If @var{usernames} consists of a single @samp{*}, all known users are affected. A command can be executed when the user has the @samp{x} bit for it. The user can type input to a window when he has its @samp{w} bit set and no other user obtains a writelock for this window. Other bits are currently ignored. To withdraw the writelock from another user in e.g. window 2: @samp{aclchg @var{username} -w+w 2}. To allow read-only access to the session: @samp{aclchg @var{username} -w "#"}. As soon as a user's name is known to screen, he can attach to the session and (per default) has full permissions for all command and windows. Execution permission for the acl commands, @code{at} and others should also be removed or the user may be able to regain write permission. @code{Chacl} is a synonym to @code{aclchg}. Multi-user mode only. @end deffn @node Acldel @subsection Acldel @deffn Command acldel @var{username} (none)@* Remove a user from screen's access control list. If currently attached, all the user's displays are detached from the session. He cannot attach again. Multi-user mode only. @end deffn @node Aclgrp @subsection Aclgrp @deffn Command aclgrp @var{username} [@var{groupname}] (none)@* Creates groups of users that share common access rights. The name of the group is the username of the group leader. Each member of the group inherits the permissions that are granted to the group leader. That means, if a user fails an access check, another check is made for the group leader. A user is removed from all groups the special value @samp{none} is used for @var{groupname}. If the second parameter is omitted all groups the user is in are listed. @end deffn @node Displays @subsection Displays @kindex * @deffn Command displays (@kbd{C-a *})@* Shows a tabular listing of all currently connected user front-ends (displays). This is most useful for multiuser sessions. The following keys can be used in @code{displays} list: @noindent @kbd{k}, @kbd{C-p}, or @kbd{up} Move up one line. @noindent @kbd{j}, @kbd{C-n}, or @kbd{down} Move down one line. @noindent @kbd{C-a} or @kbd{home} Move to the first line. @noindent @kbd{C-e} or @kbd{end} Move to the last line. @noindent @kbd{C-u} or @kbd{C-d} Move one half page up or down. @noindent @kbd{C-b} or @kbd{C-f} Move one full page up or down. @noindent @kbd{mouseclick} Move to the selected line. Available when @code{mousetrack} is set to @code{on}. @noindent @kbd{space} Refresh the list. @noindent @kbd{d} Detach the selected display. @noindent @kbd{D} Power detach the selected display. @noindent @kbd{C-g}, @kbd{enter}, or @kbd{escape} Exit the list. The following is an example of what @code{displays} could look like: @example xterm 80x42 jnweiger@@/dev/ttyp4 0(m11) &rWx facit 80x24 mlschroe@@/dev/ttyhf nb 11(tcsh) rwx xterm 80x42 jnhollma@@/dev/ttyp5 0(m11) &R.x (A) (B) (C) (D) (E) (F)(G) (H)(I) @end example The legend is as follows: @*(A) The terminal type known by @code{screen} for this display. @*(B) Displays geometry as width x height. @*(C) Username who is logged in at the display. @*(D) Device name of the display or the attached device @*(E) Display is in blocking or nonblocking mode. The available modes are "nb", "NB", "Z<", "Z>", and "BL". @*(F) Number of the window @*(G) Name/title of window @*(H) Whether the window is shared @*(I) Window permissions. Made up of three characters: @display (1st character) @samp{-} : no read @samp{r} : read @samp{R} : read only due to foreign wlock (2nd character) @samp{-} : no write @samp{.} : write suppressed by foreign wlock @samp{w} : write @samp{W} : own wlock (3rd character) @samp{-} : no execute @samp{x} : execute @end display @code{Displays} needs a region size of at least 10 characters wide and 5 characters high in order to display. @end deffn @node Umask @subsection aclumask @deffn Command aclumask [@var{users}]+/-@var{bits} ... @deffnx Command umask [@var{users}]+/-@var{bits} ... (none)@* This specifies the access other users have to windows that will be created by the caller of the command. @var{Users} may be no, one or a comma separated list of known usernames. If no users are specified, a list of all currently known users is assumed. @var{Bits} is any combination of access control bits allowed defined with the @code{aclchg} command. The special username @samp{?} predefines the access that not yet known users will be granted to any window initially. The special username @samp{??} predefines the access that not yet known users are granted to any command. Rights of the special username nobody cannot be changed (see the @code{su} command). @code{Umask} is a synonym to @code{aclumask}. @end deffn @node Wall @subsection Wall @deffn Command wall @var{message} (none)@* Write a message to all displays. The message will appear in the terminal's status line. @end deffn @node Writelock @subsection Writelock @deffn Command writelock @var{on|off|auto} (none)@* In addition to access control lists, not all users may be able to write to the same window at once. Per default, writelock is in @samp{auto} mode and grants exclusive input permission to the user who is the first to switch to the particular window. When he leaves the window, other users may obtain the writelock (automatically). The writelock of the current window is disabled by the command @code{writelock off}. If the user issues the command @code{writelock on} he keeps the exclusive write permission while switching to other windows. @end deffn @deffn Command defwritelock @var{on|off|auto} (none)@* Sets the default writelock behavior for new windows. Initially all windows will be created with no writelocks. @end deffn @node Su @subsection Su @deffn Command su [@var{username} [@var{password} [@var{password2}]]] (none)@* Substitute the user of a display. The command prompts for all parameters that are omitted. If passwords are specified as parameters, they have to be specified un-crypted. The first password is matched against the systems passwd database, the second password is matched against the @code{screen} password as set with the commands @code{acladd} or @code{password}. @code{Su} may be useful for the @code{screen} administrator to test multiuser setups. When the identification fails, the user has access to the commands available for user @samp{nobody}. These are @code{detach}, @code{license}, @code{version}, @code{help} and @code{displays}. @end deffn @node Session Name @section Session Name @deffn Command sessionname [@var{name}] (none)@* Rename the current session. Note that for @code{screen -list} the name shows up with the process-id prepended. If the argument @var{name} is omitted, the name of this session is displayed.@* @emph{Caution}: The @code{$STY} environment variable will still reflect the old name in pre-existing shells. This may result in confusion. Use of this command is generally discouraged. Use the @code{-S} command-line option if you want to name a new session.The default is constructed from the tty and host names. @end deffn @node Suspend @section Suspend @kindex z @kindex C-z @deffn Command suspend (@kbd{C-a z}, @kbd{C-a C-z})@* Suspend @code{screen}. The windows are in the detached state while @code{screen} is suspended. This feature relies on the parent shell being able to do job control. @end deffn @node Quit @section Quit @kindex \ @deffn Command quit (@kbd{C-a \})@* Kill all windows and terminate @code{screen}. (@pxref{Key Binding}). @end deffn @c ---------------------------------------------------------------- @node Regions @chapter Regions @cindex regions Screen has the ability to display more than one window on the user's display. This is done by splitting the screen in regions, which can contain different windows. @menu * Split:: Split a region into two * Focus:: Change to the next region * Only:: Delete all other regions * Remove:: Delete the current region * Resize:: Grow or shrink a region * Caption:: Control the window's caption * Fit:: Resize a window to fit the region * Focusminsize:: Force a minimum size on a current region * Layout:: Manage groups of regions @end menu @node Split @section Split @kindex S @kindex | @deffn Command split [-v] (@kbd{C-a S}, @kbd{C-a |})@* Split the current region into two new ones. All regions on the display are resized to make room for the new region. The blank window is displayed in the new region. The default is to create a horizontal split, putting the new regions on the top and bottom of each other. Using @samp{-v} will create a vertical split, causing the new regions to appear side by side of each other. Use the @code{remove} or the @code{only} command to delete regions. Use @code{focus} to toggle between regions. When a region is split opposite of how it was previously split (that is, vertical then horizontal or horizontal then vertical), a new layer is created. The layer is used to group together the regions that are split the same. Normally, as a user, you should not see nor have to worry about layers, but they will affect how some commands (@code{focus} and @code{resize}) behave. With this current implementation of @code{screen}, scrolling data will appear much slower in a vertically split region than one that is not. This should be taken into consideration if you need to use system commands such as @code{cat} or @code{tail -f}. @end deffn @node Focus @section Focus @kindex TAB @deffn Command focus [ @code{next|prev|up|down|left|right|top|bottom} ] (@kbd{C-a @key{Tab}})@* Move the input focus to the next region. This is done in a cyclic way so that the top left region is selected after the bottom right one. If no option is given it defaults to @code{next}. The next region to be selected is determined by how the regions are layered. Normally, the next region in the same layer would be selected. However, if that next region contains one or more layers, the first region in the highest layer is selected first. If you are at the last region of the current layer, @code{next} will move the focus to the next region in the lower layer (if there is a lower layer). @code{Prev} cycles in the opposite order. For more information about layers, see @xref{Split}. The rest of the options (@code{up}, @code{down}, @code{left}, @code{right}, @code{top}, and @code{bottom}) are more indifferent to layers. The option @code{up} will move the focus upward to the region that is touching the upper left corner of the current region. @code{Down} will move downward to the region that is touching the lower left corner of the current region. The option @code{left} will move the focus leftward to the region that is touching the upper left corner of the current region, while @code{right} will move rightward to the region that is touching the upper right corner of the current region. Moving left from a left most region or moving right from a right most region will result in no action. The option @code{top} will move the focus to the very first region in the upper list corner of the screen, and @code{bottom} will move to the region in the bottom right corner of the screen. Moving up from a top most region or moving down from a bottom most region will result in no action. Useful bindings are (h, j, k, and l as in vi): @example bind h focus left bind j focus down bind k focus up bind l focus right bind t focus top bind b focus bottom @end example Note that @samp{k} is traditionally bound to the @code{kill} command. @end deffn @node Only @section Only @kindex Q @deffn Command only (@kbd{C-a Q})@* Kill all regions but the current one. @end deffn @node Remove @section Remove @kindex X @deffn Command remove (@kbd{C-a X})@* Kill the current region. This is a no-op if there is only one region. @end deffn @node Resize @section Resize @deffn Command resize [@code{-h|-v|-b|-l|-p}] [ [+|-]@var{n}[@code{%}] | @code{=} | @code{max} | @code{min} | @code{_} | @code{0} ] (none)@* Resize the current region. The space will be removed from or added to the surrounding regions depending on the order of the splits. The available options for resizing are @samp{-h}(horizontal), @samp{-v}(vertical), @samp{-b}(both), @samp{-l}(local to layer), and @samp{-p}(perpendicular). Horizontal resizes will add or remove width to a region, vertical will add or remove height, and both will add or remove size from both dimensions. Local and perpendicular are similar to horizontal and vertical, but they take in account of how a region was split. If a region's last split was horizontal, a local resize will work like a vertical resize. If a region's last split was vertical, a local resize will work like a horizontal resize. Perpendicular resizes work in opposite of local resizes. If no option is specified, local is the default. The amount of lines to add or remove can be expressed a couple of different ways. By specifying a number @var{n} by itself will resize the region by that absolute amount. You can specify a relative amount by prefixing a plus @samp{+} or minus @samp{-} to the amount, such as adding @code{+n} lines or removing @code{-n} lines. Resizing can also be expressed as an absolute or relative percentage by postfixing a percent sign @samp{%}. Using zero @samp{0} is a synonym for @code{min} and using an underscore @samp{_} is a synonym for @code{max}. Some examples are: @example resize +N increase current region by N resize -N decrease current region by N resize N set current region to N resize 20% set current region to 20% of original size resize +20% increase current region by 20% resize -b = make all windows equally resize max maximize current region resize min minimize current region @end example Without any arguments, @code{screen} will prompt for how you would like to resize the current region. See @code{focusminsize} if you want to restrict the minimun size a region can have. @end deffn @node Caption @section Caption @deffn Command caption @code{always}|@code{splitonly} [string] @deffnx Command caption @code{string} [string] (none)@* This command controls the display of the window captions. Normally a caption is only used if more than one window is shown on the display (split screen mode). But if the type is set to @code{always}, @code{screen} shows a caption even if only one window is displayed. The default is @samp{splitonly}. The second form changes the text used for the caption. You can use all string escapes (@pxref{String Escapes}). @code{Screen} uses a default of @samp{%3n %t}. You can mix both forms by providing the string as an additional argument. @end deffn @node Fit @section Fit @kindex F @deffn Command fit (@kbd{C-a F})@* Change the window size to the size of the current region. This command is needed because screen doesn't adapt the window size automatically if the window is displayed more than once. @end deffn @node Focusminsize @section Focusminsize @deffn Command focusminsize [ (width|@code{max}|@code{_}) (height|@code{max}|@code{_}) ] (none)@* This forces any currently selected region to be automatically resized at least a certain @var{width} and @var{height}. All other surrounding regions will be resized in order to accommodate. This constraint follows every time the @code{focus} command is used. The @code{resize} command can be used to increase either dimension of a region, but never below what is set with @code{focusminsize}. The underscore @samp{_} is a synonym for @code{max}. Setting a @var{width} and @var{height} of @code{0 0} (zero zero) will undo any constraints and allow for manual resizing. Without any parameters, the minimum width and height is shown. @end deffn @node Layout @section Layout @cindex layout Using regions, and perhaps a large enough terminal, you can give @code{screen} more of a desktop feel. By being able to split regions horizontally or vertically, you can take advantage of the lesser used spaces of your terminal. The catch to these splits has been that they're not kept between screen detachments and reattachments. Layouts will help organize your regions. You can create one layout of four horizontal regions and then create a separate layout of regions in a two by two array. The regions could contain the same windows, but they don't have to. You can easily switch between layouts and keep them between detachments and reattachments. Note that there are several subcommands to @code{layout}. @deffn Command layout @code{new} [title] (none)@* Create a new layout. The screen will change to one whole region and be switched to the blank window. From here, you build the regions and the windows they show as you desire. The new layout will be numbered with the smallest available integer, starting with zero. You can optionally give a title to your new layout. Otherwise, it will have a default title of @code{layout}. You can always change the title later by using the command @code{layout title}. @end deffn @deffn Command layout @code{remove} [n|title] (none)@* Remove, or in other words, delete the specified layout. Either the number or the title can be specified. Without either specification, @code{screen} will remove the current layout. Removing a layout does not affect your set windows or regions. @end deffn @deffn Command layout @code{next} (none)@* Switch to the next layout available @end deffn @deffn Command layout @code{prev} (none)@* Switch to the previous layout available @end deffn @deffn Command layout @code{select} [n|title] (none)@* Select the desired layout. Either the number or the title can be specified. Without either specification, @code{screen} will prompt and ask which screen is desired. To see which layouts are available, use the @code{layout show} command. @end deffn @deffn Command layout @code{show} (none)@* List on the message line the number(s) and title(s) of the available layout(s). The current layout is flagged. @end deffn @deffn Command layout @code{title} [title] (none)@* Change or display the title of the current layout. A string given will be used to name the layout. Without any options, the current title and number is displayed on the message line. @end deffn @deffn Command layout @code{number} [n] (none)@* Change or display the number of the current layout. An integer given will be used to number the layout. Without any options, the current number and title is displayed on the message line. @end deffn @deffn Command layout @code{attach} [title|@code{:last}] (none)@* Change or display which layout to reattach back to. The default is @code{:last}, which tells @code{screen} to reattach back to the last used layout just before detachment. By supplying a title, You can instruct @code{screen} to reattach to a particular layout regardless which one was used at the time of detachment. Without any options, the layout to reattach to will be shown in the message line. @end deffn @deffn Command layout @code{save} [n|title] (none)@* Remember the current arrangement of regions. When used, @code{screen} will remember the arrangement of vertically and horizontally split regions. This arrangement is restored when a @code{screen} session is reattached or switched back from a different layout. If the session ends or the @code{screen} process dies, the layout arrangements are lost. The @code{layout dump} command should help in this situation. If a number or title is supplied, @code{screen} will remember the arrangement of that particular layout. Without any options, @code{screen} will remember the current layout. Saving your regions can be done automatically by using the @code{layout autosave} command. @end deffn @deffn Command layout @code{autosave} [@code{on}|@code{off}] (none)@* Change or display the status of automatically saving layouts. The default is @code{on}, meaning when @code{screen} is detached or changed to a different layout, the arrangement of regions and windows will be remembered at the time of change and restored upon return. If autosave is set to @code{off}, that arrangement will only be restored to either to the last manual save, using @code{layout save}, or to when the layout was first created, to a single region with a single window. Without either an @code{on} or an @code{off}, the current status is displayed on the message line. @end deffn @deffn Command layout @code{dump} [filename] (none)@* Write to a file the order of splits made in the current layout. This is useful to recreate the order of your regions used in your current layout. Only the current layout is recorded. While the order of the regions are recorded, the sizes of those regions and which windows correspond to which regions are not. If no filename is specified, the default is @file{layout-dump}, saved in the directory that the @code{screen} process was started in. If the file already exists, @code{layout dump} will append to that file. As an example: @example layout dump /home/user/.screenrc @end example will save or append the layout to the user's @file{.screenrc} file. @end deffn @c ---------------------------------------------------------------- @node Window Settings @chapter Window Settings These commands control the way @code{screen} treats individual windows in a session. @xref{Virtual Terminal}, for commands to control the terminal emulation itself. @menu * Naming Windows:: Control the name of the window * Console:: See the host's console messages * Kill:: Destroy an unwanted window * Login:: Control @file{/etc/utmp} logging * Mode:: Control the file mode of the pty * Monitor:: Watch for activity or inactivity in a window * Windows:: List the active windows * Hardstatus:: Set a window's hardstatus line * Mousetrack:: Set whether screen should track mouse events. @end menu @node Naming Windows @section Naming Windows (Titles) @cindex title You can customize each window's name in the window display (viewed with the @code{windows} command (@pxref{Windows}) by setting it with one of the title commands. Normally the name displayed is the actual command name of the program created in the window. However, it is sometimes useful to distinguish various programs of the same name or to change the name on-the-fly to reflect the current state of the window. The default name for all shell windows can be set with the @code{shelltitle} command (@pxref{Shell}). You can specify the name you want for a window with the @samp{-t} option to the @code{screen} command when the window is created (@pxref{Screen Command}). To change the name after the window has been created you can use the title-string escape-sequence (@kbd{@key{ESC} k @var{name} @key{ESC} \}) and the @code{title} command (C-a A). The former can be output from an application to control the window's name under software control, and the latter will prompt for a name when typed. You can also bind predefined names to keys with the @code{title} command to set things quickly without prompting. @menu * Title Command:: The @code{title} command. * Dynamic Titles:: Make shell windows change titles dynamically. * Title Prompts:: Set up your shell prompt for dynamic Titles. * Title Screenrc:: Set up Titles in your @file{.screenrc}. @end menu @node Title Command @subsection Title Command @kindex A @deffn Command title [windowtitle] (@kbd{C-a A})@* Set the name of the current window to @var{windowtitle}. If no name is specified, screen prompts for one. @end deffn @node Dynamic Titles @subsection Dynamic Titles @code{screen} has a shell-specific heuristic that is enabled by setting the window's name to @var{search|name} and arranging to have a null title escape-sequence output as a part of your prompt. The @var{search} portion specifies an end-of-prompt search string, while the @var{name} portion specifies the default shell name for the window. If the @var{name} ends in a @samp{:} @code{screen} will add what it believes to be the current command running in the window to the end of the specified name (e.g. @var{name:cmd}). Otherwise the current command name supersedes the shell name while it is running. Here's how it works: you must modify your shell prompt to output a null title-escape-sequence (@key{ESC} k @key{ESC} \) as a part of your prompt. The last part of your prompt must be the same as the string you specified for the @var{search} portion of the title. Once this is set up, @code{screen} will use the title-escape-sequence to clear the previous command name and get ready for the next command. Then, when a newline is received from the shell, a search is made for the end of the prompt. If found, it will grab the first word after the matched string and use it as the command name. If the command name begins with @samp{!}, @samp{%}, or @samp{^}, @code{screen} will use the first word on the following line (if found) in preference to the just-found name. This helps csh users get more accurate titles when using job control or history recall commands. @node Title Prompts @subsection Setting up your prompt for shell titles One thing to keep in mind when adding a null title-escape-sequence to your prompt is that some shells (like the csh) count all the non-control characters as part of the prompt's length. If these invisible characters aren't a multiple of 8 then backspacing over a tab will result in an incorrect display. One way to get around this is to use a prompt like this: @example set prompt='@value{esc}[0000m@value{esc}k@value{esc}\% ' @end example The escape-sequence @samp{@value{esc}[0000m} not only normalizes the character attributes, but all the zeros round the length of the invisible characters up to 8. Tcsh handles escape codes in the prompt more intelligently, so you can specify your prompt like this: @example set prompt="%@{\ek\e\\%@}\% " @end example Bash users will probably want to echo the escape sequence in the PROMPT_COMMAND: @example PROMPT_COMMAND='printf "\033k\033\134"' @end example (I used @samp{\134} to output a @samp{\} because of a bug in v1.04). @node Title Screenrc @subsection Setting up shell titles in your @file{.screenrc} Here are some .screenrc examples: @example screen -t top 2 nice top @end example Adding this line to your .screenrc would start a niced version of the @code{top} command in window 2 named @samp{top} rather than @samp{nice}. @example shelltitle '> |csh' screen 1 @end example This file would start a shell using the given shelltitle. The title specified is an auto-title that would expect the prompt and the typed command to look something like the following: @example /usr/joe/src/dir> trn @end example (it looks after the '> ' for the command name). The window status would show the name @samp{trn} while the command was running, and revert to @samp{csh} upon completion. @example bind R screen -t '% |root:' su @end example Having this command in your .screenrc would bind the key sequence @kbd{C-a R} to the @code{su} command and give it an auto-title name of @samp{root:}. For this auto-title to work, the screen could look something like this: @example % !em emacs file.c @end example Here the user typed the csh history command @code{!em} which ran the previously entered @code{emacs} command. The window status would show @samp{root:emacs} during the execution of the command, and revert to simply @samp{root:} at its completion. @example bind o title bind E title "" bind u title (unknown) @end example The first binding doesn't have any arguments, so it would prompt you for a title when you type @kbd{C-a o}. The second binding would clear an auto-titles current setting (C-a E). The third binding would set the current window's title to @samp{(unknown)} (C-a u). @node Console @section Console @deffn Command console [@var{state}] (none)@* Grabs or un-grabs the machines console output to a window. When the argument is omitted the current state is displayed. @emph{Note}: Only the owner of @file{/dev/console} can grab the console output. This command is only available if the host supports the ioctl @code{TIOCCONS}. @end deffn @node Kill @section Kill @kindex k @kindex C-k @deffn Command kill (@kbd{C-a k}, @kbd{C-a C-k})@* Kill the current window.@* If there is an @code{exec} command running (@pxref{Exec}) then it is killed. Otherwise the process (e.g. shell) running in the window receives a @code{HANGUP} condition, the window structure is removed and screen (your display) switches to another window. When the last window is destroyed, @code{screen} exits. After a kill screen switches to the previously displayed window. @* @emph{Caution}: @code{emacs} users may find themselves killing their @code{emacs} session when trying to delete the current line. For this reason, it is probably wise to use a different command character (@pxref{Command Character}) or rebind @code{kill} to another key sequence, such as @kbd{C-a K} (@pxref{Key Binding}). @end deffn @node Login @section Login @deffn Command deflogin state (none)@* Same as the @code{login} command except that the default setting for new windows is changed. This defaults to `on' unless otherwise specified at compile time (@pxref{Installation}). Both commands are only present when @code{screen} has been compiled with utmp support. @end deffn @kindex L @deffn Command login [state] (@kbd{C-a L})@* Adds or removes the entry in @file{/etc/utmp} for the current window. This controls whether or not the window is @dfn{logged in}. In addition to this toggle, it is convenient to have ``log in'' and ``log out'' keys. For instance, @code{bind I login on} and @code{bind O login off} will map these keys to be @kbd{C-a I} and @kbd{C-a O} (@pxref{Key Binding}). @end deffn @node Mode @section Mode @deffn Command defmode mode (none)@* The mode of each newly allocated pseudo-tty is set to @var{mode}. @var{mode} is an octal number as used by chmod(1). Defaults to 0622 for windows which are logged in, 0600 for others (e.g. when @code{-ln} was specified for creation, @pxref{Screen Command}). @end deffn @node Monitor @section Monitoring @deffn Command activity message (none)@* When any activity occurs in a background window that is being monitored, @code{screen} displays a notification in the message line. The notification message can be redefined by means of the @code{activity} command. Each occurrence of @samp{%} in @var{message} is replaced by the number of the window in which activity has occurred, and each occurrence of @samp{^G} is replaced by the definition for bell in your termcap (usually an audible bell). The default message is @example 'Activity in window %n' @end example Note that monitoring is off for all windows by default, but can be altered by use of the @code{monitor} command (@kbd{C-a M}). @end deffn @deffn Command defmonitor state (none)@* Same as the @code{monitor} command except that the default setting for new windows is changed. Initial setting is `off'. @end deffn @kindex M @deffn Command monitor [state] (@kbd{C-a M})@* Toggles monitoring of the current window. When monitoring is turned on and the affected window is switched into the background, the activity notification message will be displayed in the status line at the first sign of output, and the window will also be marked with an @samp{@@} in the window-status display (@pxref{Windows}). Monitoring defaults to @samp{off} for all windows. @end deffn @kindex _ @deffn Command silence [@var{state}|@var{sec}] (@kbd{C-a _})@* Toggles silence monitoring of windows. When silence is turned on and an affected window is switched into the background, you will receive the silence notification message in the status line after a specified period of inactivity (silence). The default timeout can be changed with the @code{silencewait} command or by specifying a number of seconds instead of @code{on} or @code{off}. Silence is initially off for all windows. @end deffn @deffn Command defsilence state (none)@* Same as the @code{silence} command except that the default setting for new windows is changed. Initial setting is `off'. @end deffn @deffn Command silencewait @var{seconds} (none)@* Define the time that all windows monitored for silence should wait before displaying a message. Default is 30 seconds. @end deffn @node Windows @section Windows @kindex w @kindex C-w @deffn Command windows [ string ] (@kbd{C-a w}, @kbd{C-a C-w})@* Uses the message line to display a list of all the windows. Each window is listed by number with the name of the program running in the window (or its title). The current window is marked with a @samp{*}; the previous window is marked with a @samp{-}; all the windows that are logged in are marked with a @samp{$} (@pxref{Login}); a background window that has received a bell is marked with a @samp{!}; a background window that is being monitored and has had activity occur is marked with an @samp{@@} (@pxref{Monitor}); a window which has output logging turned on is marked with @samp{(L)}; windows occupied by other users are marked with @samp{&} or @samp{&&} if the window is shared by other users; windows in the zombie state are marked with @samp{Z}. If this list is too long to fit on the terminal's status line only the portion around the current window is displayed. You can customize the output format to any string you like including string escapes (@pxref{String Escapes}). In this case, if the string parameter is passed, the maximum output size is unlimited (instead of 1024 bytes if no parameter is passed). @end deffn @node Hardstatus @section Hardstatus @code{Screen} maintains a hardstatus line for every window. If a window gets selected, the display's hardstatus will be updated to match the window's hardstatus line. The hardstatus line can be changed with the ANSI Application Program Command (APC): @samp{ESC_ESC\}. As a convenience for xterm users the sequence @samp{ESC]0..2;^G} is also accepted. @deffn Command defhstatus [status] (none)@* The hardstatus line that all new windows will get is set to @var{status}. This command is useful to make the hardstatus of every window display the window number or title or the like. @var{status} may contain the same directives as in the window messages, but the directive escape character is @samp{^E} (octal 005) instead of @samp{%}. This was done to make a misinterpretation of program generated hardstatus lines impossible. If the parameter @var{status} is omitted, the current default string is displayed. Per default the hardstatus line of new windows is empty. @end deffn @deffn Command hstatus status (none)@* Changes the current window's hardstatus line to @var{status}. @end deffn @node Mousetrack @section Mousetrack @deffn Command mousetrack [ @code{on|off} ] (none)@* This command determines whether @code{screen} will watch for mouse clicks. When this command is enabled, regions that have been split in various ways can be selected by pointing to them with a mouse and left-clicking them. Without specifying @var{on} or @var{off}, the current state is displayed. The default state is determined by the @code{defmousetrack} command. @end deffn @deffn Command defmousetrack @code{on|off} (none)@* This command determines the default state of the @code{mousetrack} command, currently defaulting of @var{off}. @end deffn @c ---------------------------------------------------------------- @node Virtual Terminal @chapter Virtual Terminal Each window in a @code{screen} session emulates a VT100 terminal, with some extra functions added. The VT100 emulator is hard-coded, no other terminal types can be emulated. The commands described here modify the terminal emulation. @menu * Control Sequences:: Details of the internal VT100 emulation. * Input Translation:: How keystrokes are remapped. * Digraph:: Entering digraph sequences. * Bell:: Getting your attention. * Clear:: Clear the window display. * Info:: Terminal emulation statistics. * Redisplay:: When the display gets confusing. * Wrap:: Automatic margins. * Reset:: Recovering from ill-behaved applications. * Window Size:: Changing the size of your terminal. * Character Processing:: Change the effect of special characters. @end menu @node Control Sequences @section Control Sequences @cindex control sequences The following is a list of control sequences recognized by @code{screen}. @samp{(V)} and @samp{(A)} indicate VT100-specific and ANSI- or ISO-specific functions, respectively. @example ESC E Next Line ESC D Index ESC M Reverse Index ESC H Horizontal Tab Set ESC Z Send VT100 Identification String ESC 7 (V) Save Cursor and Attributes ESC 8 (V) Restore Cursor and Attributes ESC [s (A) Save Cursor and Attributes ESC [u (A) Restore Cursor and Attributes ESC c Reset to Initial State ESC g Visual Bell ESC Pn p Cursor Visibility (97801) Pn = 6 Invisible 7 Visible ESC = (V) Application Keypad Mode ESC > (V) Numeric Keypad Mode ESC # 8 (V) Fill Screen with E's ESC \ (A) String Terminator ESC ^ (A) Privacy Message String (Message Line) ESC ! Global Message String (Message Line) ESC k Title Definition String ESC P (A) Device Control String Outputs a string directly to the host terminal without interpretation. ESC _ (A) Application Program Command (Hardstatus) ESC ] 0 ; string ^G (A) Operating System Command (Hardstatus, xterm title hack) ESC ] 83 ; cmd ^G (A) Execute screen command. This only works if multi-user support is compiled into screen. The pseudo-user ":window:" is used to check the access control list. Use "addacl :window: -rwx #?" to create a user with no rights and allow only the needed commands. Control-N (A) Lock Shift G1 (SO) Control-O (A) Lock Shift G0 (SI) ESC n (A) Lock Shift G2 ESC o (A) Lock Shift G3 ESC N (A) Single Shift G2 ESC O (A) Single Shift G3 ESC ( Pcs (A) Designate character set as G0 ESC ) Pcs (A) Designate character set as G1 ESC * Pcs (A) Designate character set as G2 ESC + Pcs (A) Designate character set as G3 ESC [ Pn ; Pn H Direct Cursor Addressing ESC [ Pn ; Pn f same as above ESC [ Pn J Erase in Display Pn = None or 0 From Cursor to End of Screen 1 From Beginning of Screen to Cursor 2 Entire Screen ESC [ Pn K Erase in Line Pn = None or 0 From Cursor to End of Line 1 From Beginning of Line to Cursor 2 Entire Line ESC [ Pn X Erase character ESC [ Pn A Cursor Up ESC [ Pn B Cursor Down ESC [ Pn C Cursor Right ESC [ Pn D Cursor Left ESC [ Pn E Cursor next line ESC [ Pn F Cursor previous line ESC [ Pn G Cursor horizontal position ESC [ Pn ` same as above ESC [ Pn d Cursor vertical position ESC [ Ps ;...; Ps m Select Graphic Rendition Ps = None or 0 Default Rendition 1 Bold 2 (A) Faint 3 (A) @i{Standout} Mode (ANSI: Italicized) 4 Underlined 5 Blinking 7 Negative Image 22 (A) Normal Intensity 23 (A) @i{Standout} Mode off (ANSI: Italicized off) 24 (A) Not Underlined 25 (A) Not Blinking 27 (A) Positive Image 30 (A) Foreground Black 31 (A) Foreground Red 32 (A) Foreground Green 33 (A) Foreground Yellow 34 (A) Foreground Blue 35 (A) Foreground Magenta 36 (A) Foreground Cyan 37 (A) Foreground White 39 (A) Foreground Default 40 (A) Background Black ... ... 49 (A) Background Default ESC [ Pn g Tab Clear Pn = None or 0 Clear Tab at Current Position 3 Clear All Tabs ESC [ Pn ; Pn r (V) Set Scrolling Region ESC [ Pn I (A) Horizontal Tab ESC [ Pn Z (A) Backward Tab ESC [ Pn L (A) Insert Line ESC [ Pn M (A) Delete Line ESC [ Pn @@ (A) Insert Character ESC [ Pn P (A) Delete Character ESC [ Pn S Scroll Scrolling Region Up ESC [ Pn T Scroll Scrolling Region Down ESC [ Pn ^ same as above ESC [ Ps ;...; Ps h Set Mode ESC [ Ps ;...; Ps l Reset Mode Ps = 4 (A) Insert Mode 20 (A) @samp{Automatic Linefeed} Mode. 34 Normal Cursor Visibility ?1 (V) Application Cursor Keys ?3 (V) Change Terminal Width to 132 columns ?5 (V) Reverse Video ?6 (V) @samp{Origin} Mode ?7 (V) @samp{Wrap} Mode ?9 X10 mouse tracking ?25 (V) Visible Cursor ?47 Alternate Screen (old xterm code) ?1000 (V) VT200 mouse tracking ?1047 Alternate Screen (new xterm code) ?1049 Alternate Screen (new xterm code) ESC [ 5 i (A) Start relay to printer (ANSI Media Copy) ESC [ 4 i (A) Stop relay to printer (ANSI Media Copy) ESC [ 8 ; Ph ; Pw t Resize the window to @samp{Ph} lines and @samp{Pw} columns (SunView special) ESC [ c Send VT100 Identification String ESC [ x (V) Send Terminal Parameter Report ESC [ > c Send Secondary Device Attributes String ESC [ 6 n Send Cursor Position Report @end example @node Input Translation @section Input Translation @cindex input translation In order to do a full VT100 emulation @code{screen} has to detect that a sequence of characters in the input stream was generated by a keypress on the user's keyboard and insert the VT100 style escape sequence. @code{Screen} has a very flexible way of doing this by making it possible to map arbitrary commands on arbitrary sequences of characters. For standard VT100 emulation the command will always insert a string in the input buffer of the window (see also command @code{stuff}, @pxref{Paste}). Because the sequences generated by a keypress can change after a reattach from a different terminal type, it is possible to bind commands to the termcap name of the keys. @code{Screen} will insert the correct binding after each reattach. See @ref{Bindkey} for further details on the syntax and examples. Here is the table of the default key bindings. (A) means that the command is executed if the keyboard is switched into application mode. @example Key name Termcap name Command ----------------------------------------------------- Cursor up ku stuff \033[A stuff \033OA (A) Cursor down kd stuff \033[B stuff \033OB (A) Cursor right kr stuff \033[C stuff \033OC (A) Cursor left kl stuff \033[D stuff \033OD (A) Function key 0 k0 stuff \033[10~ Function key 1 k1 stuff \033OP Function key 2 k2 stuff \033OQ Function key 3 k3 stuff \033OR Function key 4 k4 stuff \033OS Function key 5 k5 stuff \033[15~ Function key 6 k6 stuff \033[17~ Function key 7 k7 stuff \033[18~ Function key 8 k8 stuff \033[19~ Function key 9 k9 stuff \033[20~ Function key 10 k; stuff \033[21~ Function key 11 F1 stuff \033[23~ Function key 12 F2 stuff \033[24~ Home kh stuff \033[1~ End kH stuff \033[4~ Insert kI stuff \033[2~ Delete kD stuff \033[3~ Page up kP stuff \033[5~ Page down kN stuff \033[6~ Keypad 0 f0 stuff 0 stuff \033Op (A) Keypad 1 f1 stuff 1 stuff \033Oq (A) Keypad 2 f2 stuff 2 stuff \033Or (A) Keypad 3 f3 stuff 3 stuff \033Os (A) Keypad 4 f4 stuff 4 stuff \033Ot (A) Keypad 5 f5 stuff 5 stuff \033Ou (A) Keypad 6 f6 stuff 6 stuff \033Ov (A) Keypad 7 f7 stuff 7 stuff \033Ow (A) Keypad 8 f8 stuff 8 stuff \033Ox (A) Keypad 9 f9 stuff 9 stuff \033Oy (A) Keypad + f+ stuff + stuff \033Ok (A) Keypad - f- stuff - stuff \033Om (A) Keypad * f* stuff * stuff \033Oj (A) Keypad / f/ stuff / stuff \033Oo (A) Keypad = fq stuff = stuff \033OX (A) Keypad . f. stuff . stuff \033On (A) Keypad , f, stuff , stuff \033Ol (A) Keypad enter fe stuff \015 stuff \033OM (A) @end example @node Digraph @section Digraph @kindex C-v @deffn Command digraph [preset [unicode-value]] (@kbd{C-a C-v})@* This command prompts the user for a digraph sequence. The next two characters typed are looked up in a builtin table and the resulting character is inserted in the input stream. For example, if the user enters @samp{a"}, an a-umlaut will be inserted. If the first character entered is a 0 (zero), @code{screen} will treat the following characters (up to three) as an octal number instead. The optional argument @var{preset} is treated as user input, thus one can create an "umlaut" key. For example the command @samp{bindkey ^K digraph '"'} enables the user to generate an a-umlaut by typing @samp{CTRL-K a}. When a non-zero @var{unicode-value} is specified, a new digraph is created with the specified preset. The digraph is unset if a zero value is provided for the @var{unicode-value}. The following table is the builtin sequences. @example Sequence Octal Digraph Unicode Equivalent ----------------------------------------------- ' ', ' ' 160 (space) U+00A0 'N', 'S' 160 (space) U+00A0 '~', '!' 161 ¡ U+00A1 '!', '!' 161 ¡ U+00A1 '!', 'I' 161 ¡ U+00A1 'c', '|' 162 ¢ U+00A2 'c', 't' 162 ¢ U+00A2 '$', '$' 163 £ U+00A3 'P', 'd' 163 £ U+00A3 'o', 'x' 164 ¤ U+00A4 'C', 'u' 164 ¤ U+00A4 'C', 'u' 164 ¤ U+00A4 'E', 'u' 164 ¤ U+00A4 'Y', '-' 165 ¥ U+00A5 'Y', 'e' 165 ¥ U+00A5 '|', '|' 166 ¦ U+00A6 'B', 'B' 166 ¦ U+00A6 'p', 'a' 167 § U+00A7 'S', 'E' 167 § U+00A7 '"', '"' 168 ¨ U+00A8 ''', ':' 168 ¨ U+00A8 'c', 'O' 169 © U+00A9 'C', 'o' 169 © U+00A9 'a', '-' 170 ª U+00AA '<', '<' 171 « U+00AB '-', ',' 172 ¬ U+00AC 'N', 'O' 172 ¬ U+00AC '-', '-' 173 ­ U+00AD 'r', 'O' 174 ® U+00AE 'R', 'g' 174 ® U+00AE '-', '=' 175 ¯ U+00AF ''', 'm' 175 ¯ U+00AF '~', 'o' 176 ° U+00B0 'D', 'G' 176 ° U+00B0 '+', '-' 177 ± U+00B1 '2', '2' 178 ² U+00B2 '2', 'S' 178 ² U+00B2 '3', '3' 179 ³ U+00B3 '3', 'S' 179 ³ U+00B3 ''', ''' 180 ´ U+00B4 'j', 'u' 181 µ U+00B5 'M', 'y' 181 µ U+00B5 'p', 'p' 182 ¶ U+00B6 'P', 'I' 182 ¶ U+00B6 '~', '.' 183 · U+00B7 '.', 'M' 183 · U+00B7 ',', ',' 184 ¸ U+00B8 ''', ',' 184 ¸ U+00B8 '1', '1' 185 ¹ U+00B9 '1', 'S' 185 ¹ U+00B9 'o', '-' 186 º U+00BA '>', '>' 187 » U+00BB '1', '4' 188 ¼ U+00BC '1', '2' 189 ½ U+00BD '3', '4' 190 ¾ U+00BE '~', '?' 191 ¿ U+00BF '?', '?' 191 ¿ U+00BF '?', 'I' 191 ¿ U+00BF 'A', '`' 192 À U+00C0 'A', '!' 192 À U+00C0 'A', ''' 193 Á U+00C1 'A', '^' 194  U+00C2 'A', '>' 194  U+00C2 'A', '~' 195 à U+00C3 'A', '?' 195 à U+00C3 'A', '"' 196 Ä U+00C4 'A', ':' 196 Ä U+00C4 'A', '@@' 197 Å U+00C5 'A', 'A' 197 Å U+00C5 'A', 'E' 198 Æ U+00C6 'C', ',' 199 Ç U+00C7 'E', '`' 200 È U+00C8 'E', '!' 200 È U+00C8 'E', ''' 201 É U+00C9 'E', '^' 202 Ê U+00CA 'E', '>' 202 Ê U+00CA 'E', '"' 203 Ë U+00CB 'E', ':' 203 Ë U+00CB 'I', '`' 204 Ì U+00CC 'I', '!' 204 Ì U+00CC 'I', ''' 205 Í U+00CD 'I', '^' 206 Î U+00CE 'I', '>' 206 Î U+00CE 'I', '"' 207 Ï U+00CF 'I', ':' 207 Ï U+00CF 'D', '-' 208 Ð U+00D0 'N', '~' 209 Ñ U+00D1 'N', '?' 209 Ñ U+00D1 'O', '`' 210 Ò U+00D2 'O', '!' 210 Ò U+00D2 'O', ''' 211 Ó U+00D3 'O', '^' 212 Ô U+00D4 'O', '>' 212 Ô U+00D4 'O', '~' 213 Õ U+00D5 'O', '?' 213 Õ U+00D5 'O', '"' 214 Ö U+00D6 'O', ':' 214 Ö U+00D6 '/', '\' 215 × U+00D7 '*', 'x' 215 × U+00D7 'O', '/' 216 Ø U+00D8 'U', '`' 217 Ù U+00D9 'U', '!' 217 Ù U+00D9 'U', ''' 218 Ú U+00DA 'U', '^' 219 Û U+00DB 'U', '>' 219 Û U+00DB 'U', '"' 220 Ü U+00DC 'U', ':' 220 Ü U+00DC 'Y', ''' 221 Ý U+00DD 'I', 'p' 222 Þ U+00DE 'T', 'H' 222 Þ U+00DE 's', 's' 223 ß U+00DF 's', '"' 223 ß U+00DF 'a', '`' 224 à U+00E0 'a', '!' 224 à U+00E0 'a', ''' 225 á U+00E1 'a', '^' 226 â U+00E2 'a', '>' 226 â U+00E2 'a', '~' 227 ã U+00E3 'a', '?' 227 ã U+00E3 'a', '"' 228 ä U+00E4 'a', ':' 228 ä U+00E4 'a', 'a' 229 å U+00E5 'a', 'e' 230 æ U+00E6 'c', ',' 231 ç U+00E7 'e', '`' 232 è U+00E8 'e', '!' 232 è U+00E8 'e', ''' 233 é U+00E9 'e', '^' 234 ê U+00EA 'e', '>' 234 ê U+00EA 'e', '"' 235 ë U+00EB 'e', ':' 235 ë U+00EB 'i', '`' 236 ì U+00EC 'i', '!' 236 ì U+00EC 'i', ''' 237 í U+00ED 'i', '^' 238 î U+00EE 'i', '>' 238 î U+00EE 'i', '"' 239 ï U+00EF 'i', ':' 239 ï U+00EF 'd', '-' 240 ð U+00F0 'n', '~' 241 ñ U+00F1 'n', '?' 241 ñ U+00F1 'o', '`' 242 ò U+00F2 'o', '!' 242 ò U+00F2 'o', ''' 243 ó U+00F3 'o', '^' 244 ô U+00F4 'o', '>' 244 ô U+00F4 'o', '~' 245 õ U+00F5 'o', '?' 245 õ U+00F5 'o', '"' 246 ö U+00F6 'o', ':' 246 ö U+00F6 ':', '-' 247 ÷ U+00F7 'o', '/' 248 ø U+00F8 'u', '`' 249 ù U+00F9 'u', '!' 249 ù U+00F9 'u', ''' 250 ú U+00FA 'u', '^' 251 û U+00FB 'u', '>' 251 û U+00FB 'u', '"' 252 ü U+00FC 'u', ':' 252 ü U+00FC 'y', ''' 253 ý U+00FD 'i', 'p' 254 þ U+00FE 't', 'h' 254 þ U+00FE 'y', '"' 255 ÿ U+00FF 'y', ':' 255 ÿ U+00FF '"', '[' 196 Ä U+00C4 '"', '\' 214 Ö U+00D6 '"', ']' 220 Ü U+00DC '"', '@{' 228 ä U+00E4 '"', '|' 246 ö U+00F6 '"', '@}' 252 ü U+00FC '"', '~' 223 ß U+00DF @end example @end deffn @node Bell @section Bell @deffn Command bell_msg [message] (none)@* When a bell character is sent to a background window, @code{screen} displays a notification in the message line. The notification message can be re-defined by this command. Each occurrence of @samp{%} in @var{message} is replaced by the number of the window to which a bell has been sent, and each occurrence of @samp{^G} is replaced by the definition for bell in your termcap (usually an audible bell). The default message is @example 'Bell in window %n' @end example An empty message can be supplied to the @code{bell_msg} command to suppress output of a message line (@code{bell_msg ""}). Without a parameter, the current message is shown. @end deffn @kindex C-g @deffn Command vbell [state] (@kbd{C-a C-g})@* Sets or toggles the visual bell setting for the current window. If @code{vbell} is switched to @samp{on}, but your terminal does not support a visual bell, the visual bell message is displayed in the status line when the bell character is received. Visual bell support of a terminal is defined by the termcap variable @code{vb}. @xref{Bell}, for more information on visual bells. The equivalent terminfo capability is @code{flash}. Per default, @code{vbell} is @samp{off}, thus the audible bell is used. @end deffn @deffn Command vbell_msg [message] (none)@* Sets the visual bell message. @var{Message} is printed to the status line if the window receives a bell character (^G), @code{vbell} is set to @samp{on} and the terminal does not support a visual bell. The default message is @samp{Wuff, Wuff!!}. Without a parameter, the current message is shown. @end deffn @deffn Command vbellwait sec (none)@* Define a delay in seconds after each display of @code{screen} 's visual bell message. The default is 1 second. @end deffn @node Clear @section Clear @kindex C @deffn Command clear (@kbd{C-a C})@* Clears the screen and saves its contents to the scrollback buffer. @end deffn @node Info @section Info @kindex i @kindex C-i @deffn Command info (@kbd{C-a i}, @kbd{C-a C-i})@* Uses the message line to display some information about the current window: the cursor position in the form @samp{(@var{column},@var{row})} starting with @samp{(1,1)}, the terminal width and height plus the size of the scrollback buffer in lines, like in @samp{(80,24)+50}, the current state of window XON/XOFF flow control is shown like this (@pxref{Flow Control}): @example +flow automatic flow control, currently on. -flow automatic flow control, currently off. +(+)flow flow control enabled. Agrees with automatic control. -(+)flow flow control disabled. Disagrees with automatic control. +(-)flow flow control enabled. Disagrees with automatic control. -(-)flow flow control disabled. Agrees with automatic control. @end example The current line wrap setting (@samp{+wrap} indicates enabled, @samp{-wrap} not) is also shown. The flags @samp{ins}, @samp{org}, @samp{app}, @samp{log}, @samp{mon} and @samp{nored} are displayed when the window is in insert mode, origin mode, application-keypad mode, has output logging, activity monitoring or partial redraw enabled. The currently active character set (@samp{G0}, @samp{G1}, @samp{G2}, or @samp{G3}), and in square brackets the terminal character sets that are currently designated as @samp{G0} through @samp{G3}. If the window is in UTF-8 mode, the string @samp{UTF-8} is shown instead. Additional modes depending on the type of the window are displayed at the end of the status line (@pxref{Window Types}). If the state machine of the terminal emulator is in a non-default state, the info line is started with a string identifying the current state. For system information use @code{time}. @end deffn @deffn Command dinfo (none)@* Show what @code{screen} thinks about your terminal. Useful if you want to know why features like color or the alternate charset don't work. @end deffn @node Redisplay @section Redisplay @deffn Command allpartial state (none)@* If set to on, only the current cursor line is refreshed on window change. This affects all windows and is useful for slow terminal lines. The previous setting of full/partial refresh for each window is restored with @code{allpartial off}. This is a global flag that immediately takes effect on all windows overriding the @code{partial} settings. It does not change the default redraw behavior of newly created windows. @end deffn @deffn Command altscreen state (none)@* If set to on, "alternate screen" support is enabled in virtual terminals, just like in xterm. Initial setting is @samp{off}. @end deffn @deffn Command partial state (none)@* Defines whether the display should be refreshed (as with @code{redisplay}) after switching to the current window. This command only affects the current window. To immediately affect all windows use the @code{allpartial} command. Default is @samp{off}, of course. This default is fixed, as there is currently no @code{defpartial} command. @end deffn @kindex l @kindex C-l @deffn Command redisplay (@kbd{C-a l}, @kbd{C-a C-l})@* Redisplay the current window. Needed to get a full redisplay in partial redraw mode. @end deffn @node Wrap @section Wrap @kindex r @kindex C-r @deffn Command wrap [ on | off ] (@kbd{C-a r}, @kbd{C-a C-r}) @* Sets the line-wrap setting for the current window. When line-wrap is on, the second consecutive printable character output at the last column of a line will wrap to the start of the following line. As an added feature, backspace (^H) will also wrap through the left margin to the previous line. Default is @samp{on}. Without any options, the state of @code{wrap} is toggled. @end deffn @deffn Command defwrap state (none) @* Same as the @code{wrap} command except that the default setting for new windows is changed. Initially line-wrap is on and can be toggled with the @code{wrap} command (@kbd{C-a r}) or by means of "C-a : wrap on|off". @end deffn @node Reset @section Reset @kindex Z @deffn Command reset (@kbd{C-a Z})@* Reset the virtual terminal to its ``power-on'' values. Useful when strange settings (like scroll regions or graphics character set) are left over from an application. @end deffn @node Window Size @section Window Size @kindex W @deffn Command width [@code{-w}|@code{-d}] [cols [lines]] (@kbd{C-a W})@* Toggle the window width between 80 and 132 columns, or set it to @var{cols} columns if an argument is specified. This requires a capable terminal and the termcap entries @samp{Z0} and @samp{Z1}. See the @code{termcap} command (@pxref{Termcap}), for more information. You can also specify a height if you want to change both values. The @code{-w} option tells screen to leave the display size unchanged and just set the window size, @code{-d} vice versa. @end deffn @deffn Command height [@code{-w}|@code{-d}] [lines [cols]] (none)@* Set the display height to a specified number of lines. When no argument is given it toggles between 24 and 42 lines display. @end deffn @node Character Processing @section Character Processing @deffn Command c1 [state] (none)@* Change c1 code processing. @samp{c1 on} tells screen to treat the input characters between 128 and 159 as control functions. Such an 8-bit code is normally the same as ESC followed by the corresponding 7-bit code. The default setting is to process c1 codes and can be changed with the @samp{defc1} command. Users with fonts that have usable characters in the c1 positions may want to turn this off. @end deffn @deffn Command gr [state] (none)@* Turn GR charset switching on/off. Whenever screen sees an input char with an 8th bit set, it will use the charset stored in the GR slot and print the character with the 8th bit stripped. The default (see also @samp{defgr}) is not to process GR switching because otherwise the ISO88591 charset would not work. @end deffn @deffn Command bce [state] (none)@* Change background-color-erase setting. If @samp{bce} is set to on, all characters cleared by an erase/insert/scroll/clear operation will be displayed in the current background color. Otherwise the default background color is used. @end deffn @deffn Command encoding enc [denc] (none)@* Tell screen how to interpret the input/output. The first argument sets the encoding of the current window. Each window can emulate a different encoding. The optional second parameter overwrites the encoding of the connected terminal. It should never be needed as screen uses the locale setting to detect the encoding. There is also a way to select a terminal encoding depending on the terminal type by using the @samp{KJ} termcap entry. @xref{Special Capabilities}. Supported encodings are @code{eucJP}, @code{SJIS}, @code{eucKR}, @code{eucCN}, @code{Big5}, @code{GBK}, @code{KOI8-R}, @code{CP1251}, @code{UTF-8}, @code{ISO8859-2}, @code{ISO8859-3}, @code{ISO8859-4}, @code{ISO8859-5}, @code{ISO8859-6}, @code{ISO8859-7}, @code{ISO8859-8}, @code{ISO8859-9}, @code{ISO8859-10}, @code{ISO8859-15}, @code{jis}. See also @samp{defencoding}, which changes the default setting of a new window. @end deffn @deffn Command charset set (none)@* Change the current character set slot designation and charset mapping. The first four character of @var{set} are treated as charset designators while the fifth and sixth character must be in range @samp{0} to @samp{3} and set the GL/GR charset mapping. On every position a @samp{.} may be used to indicate that the corresponding charset/mapping should not be changed (@var{set} is padded to six characters internally by appending @samp{.} chars). New windows have @samp{BBBB02} as default charset, unless a @samp{encoding} command is active. The current setting can be viewed with the @ref{Info} command. @end deffn @deffn Command utf8 [state [dstate]] (none)@* Change the encoding used in the current window. If utf8 is enabled, the strings sent to the window will be UTF-8 encoded and vice versa. Omitting the parameter toggles the setting. If a second parameter is given, the display's encoding is also changed (this should rather be done with screen's @samp{-U} option). See also @samp{defutf8}, which changes the default setting of a new window. @end deffn @deffn Command defc1 state (none)@* Same as the @samp{c1} command except that the default setting for new windows is changed. Initial setting is @samp{on}. @end deffn @deffn Command defgr state (none)@* Same as the @samp{gr} command except that the default setting for new windows is changed. Initial setting is @samp{off}. @end deffn @deffn Command defbce state (none)@* Same as the @samp{bce} command except that the default setting for new windows is changed. Initial setting is @samp{off}. @end deffn @deffn Command defencoding enc (none)@* Same as the @samp{encoding} command except that the default setting for new windows is changed. Initial setting is the encoding taken from the terminal. @end deffn @deffn Command defcharset [set] (none)@* Like the @samp{charset} command except that the default setting for new windows is changed. Shows current default if called without argument. @end deffn @deffn Command defutf8 state (none)@* Same as the @samp{utf8} command except that the default setting for new windows is changed. Initial setting is @code{on} if screen was started with @samp{-U}, otherwise @code{off}. @end deffn @deffn Command cjkwidth [state] (none)@* Toggle how ambiguous characters are treated. If cjkwidth is on screen interprets them as double (full) width characters. If off then they are seen as one cell (half) width characters. @end deffn @c ---------------------------------------------------------------- @node Copy and Paste @chapter Copy and Paste @cindex copy and paste For those confined to a hardware terminal, these commands provide a cut and paste facility more powerful than those provided by most windowing systems. @menu * Copy:: Copy from scrollback to buffer * Paste:: Paste from buffer into window * Registers:: Longer-term storage * Screen Exchange:: Sharing data between screen users * History:: Recalling previous input @end menu @node Copy @section Copying @cindex marking @cindex scrollback @kindex [ @kindex C-[ @kindex ESC @deffn Command copy (@kbd{C-a [}, @kbd{C-a C-[}, @kbd{C-a @key{ESC}})@* Enter copy/scrollback mode. This allows you to copy text from the current window and its history into the paste buffer. In this mode a @code{vi}-like full screen editor is active, with controls as outlined below. @end deffn @menu * Line Termination:: End copied lines with CR/LF * Scrollback:: Set the size of the scrollback buffer * Copy Mode Keys:: Remap keys in copy mode * Movement:: Move around in the scrollback buffer * Marking:: Select the text you want * Repeat count:: Repeat a command * Searching:: Find the text you want * Specials:: Other random keys @end menu @node Line Termination @subsection CR/LF @deffn Command crlf [state] (none)@* This affects the copying of text regions with the @code{copy} command. If it is set to @samp{on}, lines will be separated by the two character sequence @samp{CR}/@samp{LF}. Otherwise only @samp{LF} is used. @code{crlf} is off by default. When no parameter is given, the state is toggled. @end deffn @node Scrollback @subsection Scrollback To access and use the contents in the scrollback buffer, use the @code{copy} command. @xref{Copy}. @deffn Command defscrollback num (none)@* Same as the @code{scrollback} command except that the default setting for new windows is changed. Defaults to 100. @end deffn @deffn Command scrollback num (none)@* Set the size of the scrollback buffer for the current window to @var{num} lines. The default scrollback is 100 lines. Use @code{info} to view the current setting. @end deffn @deffn Command compacthist [state] (none)@* This tells screen whether to suppress trailing blank lines when scrolling up text into the history buffer. Turn compacting @samp{on} to hold more useful lines in your scrollback buffer. @end deffn @node Copy Mode Keys @subsection Markkeys @deffn Command markkeys string (none)@* This is a method of changing the keymap used for copy/history mode. The string is made up of @var{oldchar}=@var{newchar} pairs which are separated by @samp{:}. Example: The command @code{markkeys h=^B:l=^F:$=^E} would set some keys to be more familiar to @code{emacs} users. If your terminal sends characters, that cause you to abort copy mode, then this command may help by binding these characters to do nothing. The no-op character is `@@' and is used like this: @code{markkeys @@=L=H} if you do not want to use the `H' or `L' commands any longer. As shown in this example, multiple keys can be assigned to one function in a single statement. @end deffn @node Movement @subsection Movement Keys @noindent @kbd{h}, @kbd{C-h}, or @kbd{left arrow} move the cursor left. @noindent @kbd{j}, @kbd{C-n}, or @kbd{down arrow} move the cursor down. @noindent @kbd{k}, @kbd{C-p}, or @kbd{up arrow} move the cursor up. @noindent @kbd{l} ('el'), or @kbd{right arrow} move the cursor right. @noindent @kbd{0} (zero) or @kbd{C-a} move to the leftmost column. @noindent @kbd{+} and @kbd{-} move the cursor to the leftmost column of the next or previous line. @noindent @kbd{H}, @kbd{M} and @kbd{L} move the cursor to the leftmost column of the top, center or bottom line of the window. @noindent @kbd{|} moves to the specified absolute column. @noindent @kbd{g} or @kbd{home} moves to the beginning of the buffer. @noindent @kbd{G} or @kbd{end} moves to the specified absolute line (default: end of buffer). @noindent @kbd{%} jumps to the specified percentage of the buffer. @noindent @kbd{^} or @kbd{$} move to the first or last non-whitespace character on the line. @noindent @kbd{w}, @kbd{b}, and @kbd{e} move the cursor word by word. @noindent @kbd{B}, @kbd{E} move the cursor WORD by WORD (as in vi). @noindent @kbd{f}/@kbd{F}, @kbd{t}/@kbd{T} move the cursor forward/backward to the next occurrence of the target. (eg, '3fy' will move the cursor to the 3rd 'y' to the right.) @noindent @kbd{;} and @kbd{,} Repeat the last f/F/t/T command in the same/opposite direction. @noindent @kbd{C-e} and @kbd{C-y} scroll the display up/down by one line while preserving the cursor position. @noindent @kbd{C-u} and @kbd{C-d} scroll the display up/down by the specified amount of lines while preserving the cursor position. (Default: half screenful). @noindent @kbd{C-b} and @kbd{C-f} move the cursor up/down a full screen. Note that Emacs-style movement keys can be specified by a .screenrc command. (@code{markkeys "h=^B:l=^F:$=^E"}) There is no simple method for a full emacs-style keymap, however, as this involves multi-character codes. @node Marking @subsection Marking The copy range is specified by setting two marks. The text between these marks will be highlighted. Press: @noindent @kbd{space} or @kbd{enter} to set the first or second mark respectively. If @code{mousetrack} is set to @code{on}, marks can also be set using @kbd{left mouse click}. @noindent @kbd{Y} and @kbd{y} can be used to mark one whole line or to mark from start of line. @noindent @kbd{W} marks exactly one word. @node Repeat count @subsection Repeat Count Any command in copy mode can be prefixed with a number (by pressing digits @kbd{0@dots{}9}) which is taken as a repeat count. Example: @example @kbd{C-a C-[ H 10 j 5 Y} @end example @noindent will copy lines 11 to 15 into the paste buffer. @node Searching @subsection Searching @noindent @kbd{/} @code{vi}-like search forward. @noindent @kbd{?} @code{vi}-like search backward. @noindent @kbd{C-a s} @code{emacs} style incremental search forward. @noindent @kbd{C-r} @code{emacs} style reverse i-search. @deffn Command ignorecase [on|off] (none)@* Tell screen to ignore the case of characters in searches. Default is @code{off}. Without any options, the state of @code{ignorecase} is toggled. @end deffn @noindent @kbd{n} Repeat search in forward direction. @noindent @kbd{N} Repeat search in backward direction. @node Specials @subsection Specials There are, however, some keys that act differently here from in @code{vi}. @code{Vi} does not allow to yank rectangular blocks of text, but @code{screen} does. Press: @noindent @kbd{c} or @kbd{C} to set the left or right margin respectively. If no repeat count is given, both default to the current cursor position.@* Example: Try this on a rather full text screen: @example @kbd{C-a [ M 20 l SPACE c 10 l 5 j C SPACE}. @end example @noindent This moves one to the middle line of the screen, moves in 20 columns left, marks the beginning of the paste buffer, sets the left column, moves 5 columns down, sets the right column, and then marks the end of the paste buffer. Now try: @example @kbd{C-a [ M 20 l SPACE 10 l 5 j SPACE} @end example @noindent and notice the difference in the amount of text copied. @noindent @kbd{J} joins lines. It toggles between 4 modes: lines separated by a newline character (012), lines glued seamless, lines separated by a single space or comma separated lines. Note that you can prepend the newline character with a carriage return character, by issuing a @code{set crlf on}. @noindent @kbd{v} or @kbd{V} is for all the @code{vi} users who use @code{:set numbers} - it toggles the left margin between column 9 and 1. @noindent @kbd{a} before the final @kbd{space} key turns on append mode. Thus the contents of the paste buffer will not be overwritten, but appended to. @noindent @kbd{A} turns on append mode and sets a (second) mark. @noindent @kbd{>} sets the (second) mark and writes the contents of the paste buffer to the screen-exchange file (@file{/tmp/screen-exchange} per default) once copy-mode is finished. @xref{Screen Exchange}.@* This example demonstrates how to dump the whole scrollback buffer to that file: @example @kbd{C-a [ g SPACE G $ >}. @end example @noindent @kbd{C-g} gives information about the current line and column. @noindent @kbd{x} or @kbd{o} ('oh') exchanges the first mark and the current cursor position. You can use this to adjust an already placed mark. @noindent @kbd{C-l} ('el') will redraw the screen. @noindent @kbd{@@} does nothing. Absolutely nothing. Does not even exit copy mode. @noindent All keys not described here exit copy mode. @node Paste @section Paste @kindex ] @kindex C-] @deffn Command paste [registers [destination]] (@kbd{C-a ]}, @kbd{C-a C-]})@* Write the (concatenated) contents of the specified registers to the stdin stream of the current window. The register @samp{.} is treated as the paste buffer. If no parameter is specified the user is prompted to enter a single register. The paste buffer can be filled with the @code{copy}, @code{history} and @code{readbuf} commands. Other registers can be filled with the @code{register}, @code{readreg} and @code{paste} commands. If @code{paste} is called with a second argument, the contents of the specified registers is pasted into the named destination register rather than the window. If @samp{.} is used as the second argument, the display's paste buffer is the destination. Note, that @code{paste} uses a wide variety of resources: Usually both, a current window and a current display are required. But whenever a second argument is specified no current window is needed. When the source specification only contains registers (not the paste buffer) then there need not be a current display (terminal attached), as the registers are a global resource. The paste buffer exists once for every user. @end deffn @deffn Command stuff [string] (none)@* Stuff the string @var{string} in the input buffer of the current window. This is like the @code{paste} command, but with much less overhead. Without a parameter, @code{screen} will prompt for a string to stuff. You cannot paste large buffers with the @code{stuff} command. It is most useful for key bindings. @xref{Bindkey}. @end deffn @deffn Command pastefont [state] Tell screen to include font information in the paste buffer. The default is not to do so. This command is especially useful for multi character fonts like kanji. @end deffn @deffn Command slowpaste msec @deffnx Command defslowpaste msec (none)@* Define the speed text is inserted in the current window by the @code{paste} command. If the slowpaste value is nonzero text is written character by character. @code{screen} will pause for @var{msec} milliseconds after each write to allow the application to process the input. only use @code{slowpaste} if your underlying system exposes flow control problems while pasting large amounts of text. @code{defslowpaste} specifies the default for new windows. @end deffn @deffn Command readreg [-e encoding] [register [filename]] (none)@* Does one of two things, dependent on number of arguments: with zero or one arguments it duplicates the paste buffer contents into the register specified or entered at the prompt. With two arguments it reads the contents of the named file into the register, just as @code{readbuf} reads the screen-exchange file into the paste buffer. You can tell screen the encoding of the file via the @code{-e} option. The following example will paste the system's password file into the screen window (using register p, where a copy remains): @example C-a : readreg p /etc/passwd C-a : paste p @end example @end deffn @node Registers @section Registers @deffn Command copy_reg [key] (none)@* Removed. Use @code{readreg} instead. @end deffn @deffn Command ins_reg [key] (none)@* Removed. Use @code{paste} instead. @end deffn @deffn Command process [key] (none)@* Stuff the contents of the specified register into the @code{screen} input queue. If no argument is given you are prompted for a register name. The text is parsed as if it had been typed in from the user's keyboard. This command can be used to bind multiple actions to a single key. @end deffn @deffn Command register [-e encoding] key string (none)@* Save the specified @var{string} to the register @var{key}. The encoding of the string can be specified via the @code{-e} option. @end deffn @node Screen Exchange @section Screen Exchange @deffn Command bufferfile [@var{exchange-file}] (none)@* Change the filename used for reading and writing with the paste buffer. If the @var{exchange-file} parameter is omitted, @code{screen} reverts to the default of @file{/tmp/screen-exchange}. The following example will paste the system's password file into the screen window (using the paste buffer, where a copy remains): @example C-a : bufferfile /etc/passwd C-a < C-a ] C-a : bufferfile @end example @end deffn @kindex < @deffn Command readbuf [-e @var{encoding}] [@var{filename}] (@kbd{C-a <})@* Reads the contents of the specified file into the paste buffer. You can tell screen the encoding of the file via the @code{-e} option. If no file is specified, the screen-exchange filename is used. @end deffn @kindex = @deffn Command removebuf (@kbd{C-a =})@* Unlinks the screen-exchange file. @end deffn @kindex > @deffn Command writebuf [-e @var{encoding}] [@var{filename}] (@kbd{C-a >})@* Writes the contents of the paste buffer to the specified file, or the public accessible screen-exchange file if no filename is given. This is thought of as a primitive means of communication between @code{screen} users on the same host. If an encoding is specified the paste buffer is recoded on the fly to match the encoding. See also @kbd{C-a @key{ESC}} (@pxref{Copy}). @end deffn @node History @section History @kindex @{ @kindex @} @deffn Command history (@kbd{C-a @{}, @kbd{C-a @}})@* Usually users work with a shell that allows easy access to previous commands. For example, @code{csh} has the command @code{!!} to repeat the last command executed. @code{screen} provides a primitive way of recalling ``the command that started @dots{}'': You just type the first letter of that command, then hit @kbd{C-a @{} and @code{screen} tries to find a previous line that matches with the prompt character to the left of the cursor. This line is pasted into this window's input queue. Thus you have a crude command history (made up by the visible window and its scrollback buffer). @end deffn @c ---------------------------------------------------------------- @node Subprocess Execution @chapter Subprocess Execution Control Input or Output of a window by another filter process. Use with care! @menu * Exec:: The @code{exec} command syntax. * Using Exec:: Weird things that filters can do. @end menu @node Exec @section Exec @deffn Command exec [[@var{fdpat}] @var{newcommand} [@var{args} ... ]] (none)@* Run a unix subprocess (specified by an executable path @var{newcommand} and its optional arguments) in the current window. The flow of data between newcommands stdin/stdout/stderr, the process originally started (let us call it "application-process") and screen itself (window) is controlled by the file descriptor pattern @var{fdpat}. This pattern is basically a three character sequence representing stdin, stdout and stderr of newcommand. A dot (@code{.}) connects the file descriptor to screen. An exclamation mark (@code{!}) causes the file descriptor to be connected to the application-process. A colon (@code{:}) combines both. @* User input will go to newcommand unless newcommand receives the application-process' output (@var{fdpat}s first character is @samp{!} or @samp{:}) or a pipe symbol (@samp{|}) is added to the end of @var{fdpat}. @* Invoking @code{exec} without arguments shows name and arguments of the currently running subprocess in this window. Only one subprocess can be running per window. @* When a subprocess is running the @code{kill} command will affect it instead of the windows process. Only one subprocess a time can be running in each window. @* Refer to the postscript file @file{doc/fdpat.ps} for a confusing illustration of all 21 possible combinations. Each drawing shows the digits 2, 1, 0 representing the three file descriptors of newcommand. The box marked `W' is usual pty that has the application-process on its slave side. The box marked `P' is the secondary pty that now has screen at its master side. @end deffn @node Using Exec @section Using Exec @noindent Abbreviations: @itemize @bullet @item Whitespace between the word @samp{exec} and @var{fdpat} and the command name can be omitted. @item Trailing dots and a @var{fdpat} consisting only of dots can be omitted. @item A simple @samp{|} is synonymous for the @samp{!..|} pattern. @item The word @samp{exec} can be omitted when the @samp{|} abbreviation is used. @item The word @samp{exec} can always be replaced by leading @samp{!}. @end itemize @noindent Examples: @table @code @item !/bin/sh @itemx exec /bin/sh @itemx exec ... /bin/sh All of the above are equivalent. Creates another shell in the same window, while the original shell is still running. Output of both shells is displayed and user input is sent to the new @file{/bin/sh}. @item !!stty 19200 @itemx exec!stty 19200 @itemx exec !.. stty 19200 All of the above are equivalent. Set the speed of the window's tty. If your stty command operates on stdout, then add another @samp{!}. This is a useful command, when a screen window is directly connected to a serial line that needs to be configured. @item |less @itemx exec !..| less Both are equivalent. This adds a pager to the window output. The special character @samp{|} is needed to give the user control over the pager although it gets its input from the window's process. This works, because @samp{less} listens on stderr (a behavior that @code{screen} would not expect without the @samp{|}) when its stdin is not a tty. @code{Less} versions newer than 177 fail miserably here; good old @code{pg} still works. @item !:sed -n s/.*Error.*/\007/p Sends window output to both, the user and the sed command. The sed inserts an additional bell character (oct. 007) to the window output seen by screen. This will cause 'Bell in window x' messages, whenever the string @samp{Error} appears in the window. @end table @c ---------------------------------------------------------------- @node Key Binding @chapter Key Binding @cindex key binding @cindex binding You may disagree with some of the default bindings (I know I do). The @code{bind} command allows you to redefine them to suit your preferences. @menu * Bind:: @code{bind} syntax. * Bind Examples:: Using @code{bind}. * Command Character:: The character used to start keyboard commands. * Help:: Show current key bindings. * Bindkey:: @code{bindkey} syntax. * Bindkey Examples:: Some easy examples. * Bindkey Control:: How to control the bindkey mechanism. @end menu @node Bind @section The @code{bind} command @deffn Command bind [-c class] key [command [args]] (none)@* Bind a command to a key. The @var{key} argument is either a single character, a two-character sequence of the form @samp{^x} (meaning @kbd{C-x}), a backslash followed by an octal number (specifying the ASCII code of the character), or a backslash followed by a second character, such as @samp{\^} or @samp{\\}. The argument can also be quoted, if you like. If no further argument is given, any previously established binding for this key is removed. The @var{command} argument can be any command (@pxref{Command Index}). If a command class is specified via the @code{-c} option, the key is bound for the specified class. Use the @code{command} command to activate a class. Command classes can be used to create multiple command keys or multi-character bindings. By default, most suitable commands are bound to one or more keys (@pxref{Default Key Bindings}); for instance, the command to create a new window is bound to @kbd{C-c} and @kbd{c}. The @code{bind} command can be used to redefine the key bindings and to define new bindings. @end deffn @deffn Command unbindall (none)@* Unbind all the bindings. This can be useful when screen is used solely for its detaching abilities, such as when letting a console application run as a daemon. If, for some reason, it is necessary to bind commands after this, use 'screen -X'. @end deffn @node Bind Examples @section Examples of the @code{bind} command @noindent Some examples: @example bind ' ' windows bind ^f screen telnet foobar bind \033 screen -ln -t root -h 1000 9 su @end example @noindent would bind the space key to the command that displays a list of windows (so that the command usually invoked by @kbd{C-a C-w} would also be available as @kbd{C-a space}), bind @kbd{C-f} to the command ``create a window with a TELNET connection to foobar'', and bind @key{ESC} to the command that creates an non-login window with title @samp{root} in slot #9, with a superuser shell and a scrollback buffer of 1000 lines. @example bind -c demo1 0 select 10 bind -c demo1 1 select 11 bind -c demo1 2 select 12 bindkey "^B" command -c demo1 @end example makes @kbd{C-b 0} select window 10, @kbd{C-b 1} window 11, etc. @example bind -c demo2 0 select 10 bind -c demo2 1 select 11 bind -c demo2 2 select 12 bind - command -c demo2 @end example makes @kbd{C-a - 0} select window 10, @kbd{C-a - 1} window 11, etc. @c ---------------------------------------------------------------- @node Command Character @cindex escape character @cindex command character @section Command Character @deffn Command escape xy (none)@* Set the command character to @var{x} and the character generating a literal command character (by triggering the @code{meta} command) to @var{y} (similar to the @samp{-e} option). Each argument is either a single character, a two-character sequence of the form @samp{^x} (meaning @kbd{C-x}), a backslash followed by an octal number (specifying the ASCII code of the character), or a backslash followed by a second character, such as @samp{\^} or @samp{\\}. The default is @samp{^Aa}, but @samp{``} is recommended by one of the authors. @end deffn @deffn Command defescape xy (none)@* Set the default command characters. This is equivalent to the command @code{escape} except that it is useful for multiuser sessions only. In a multiuser session @code{escape} changes the command character of the calling user, where @code{defescape} changes the default command characters for users that will be added later. @end deffn @kindex a @deffn Command meta (@kbd{C-a a})@* Send the command character (@kbd{C-a}) to the process in the current window. The keystroke for this command is the second parameter to the @samp{-e} command line switch (@pxref{Invoking Screen}), or the @code{escape} .screenrc directive. @end deffn @deffn Command command [-c @var{class}] (none)@* This command has the same effect as typing the screen escape character (@kbd{C-a}). It is probably only useful for key bindings. If the @samp{-c} option is given, select the specified command class. @xref{Bind}, @xref{Bindkey}. @end deffn @node Help @section Help @kindex ? @deffn Command help (@kbd{C-a ?})@* Displays a help screen showing you all the key bindings. The first pages list all the internal commands followed by their bindings. Subsequent pages will display the custom commands, one command per key. Press space when you're done reading each page, or return to exit early. All other characters are ignored. If the @samp{-c} option is given, display all bound commands for the specified command class. @xref{Default Key Bindings}. @end deffn @node Bindkey @section Bindkey @deffn Command bindkey [@var{opts}] [@var{string} [@var{cmd} @var{args}]] (none)@* This command manages screen's input translation tables. Every entry in one of the tables tells screen how to react if a certain sequence of characters is encountered. There are three tables: one that should contain actions programmed by the user, one for the default actions used for terminal emulation and one for screen's copy mode to do cursor movement. See @ref{Input Translation} for a list of default key bindings. If the @samp{-d} option is given, bindkey modifies the default table, @samp{-m} changes the copy mode table and with neither option the user table is selected. The argument @samp{string} is the sequence of characters to which an action is bound. This can either be a fixed string or a termcap keyboard capability name (selectable with the @samp{-k} option). Some keys on a VT100 terminal can send a different string if application mode is turned on (e.g. the cursor keys). Such keys have two entries in the translation table. You can select the application mode entry by specifying the @samp{-a} option. The @samp{-t} option tells screen not to do inter-character timing. One cannot turn off the timing if a termcap capability is used. @samp{cmd} can be any of screen's commands with an arbitrary number of @samp{args}. If @samp{cmd} is omitted the key-binding is removed from the table. @end deffn @node Bindkey Examples @section Bindkey Examples @noindent Here are some examples of keyboard bindings: @example bindkey -d @end example @noindent Show all of the default key bindings. The application mode entries are marked with [A]. @example bindkey -k k1 select 1 @end example @noindent Make the "F1" key switch to window one. @example bindkey -t foo stuff barfoo @end example @noindent Make @samp{foo} an abbreviation of the word @samp{barfoo}. Timeout is disabled so that users can type slowly. @example bindkey "\024" mapdefault @end example @noindent This key-binding makes @samp{C-t} an escape character for key-bindings. If you did the above @samp{stuff barfoo} binding, you can enter the word @samp{foo} by typing @samp{C-t foo}. If you want to insert a @samp{C-t} you have to press the key twice (i.e., escape the escape binding). @example bindkey -k F1 command @end example @noindent Make the F11 (not F1!) key an alternative screen escape (besides @samp{C-a}). @node Bindkey Control @section Bindkey Control @deffn Command mapdefault (none)@* Tell screen that the next input character should only be looked up in the default bindkey table. @end deffn @deffn Command mapnotnext (none)@* Like mapdefault, but don't even look in the default bindkey table. @end deffn @deffn Command maptimeout n (none)@* Set the inter-character timer for input sequence detection to a timeout of @var{n} ms. The default timeout is 300ms. Maptimeout with no arguments shows the current setting. @end deffn @c ---------------------------------------------------------------- @node Flow Control @chapter Flow Control @cindex flow control @code{screen} can trap flow control characters or pass them to the program, as you see fit. This is useful when your terminal wants to use XON/XOFF flow control and you are running a program which wants to use ^S/^Q for other purposes (i.e. @code{emacs}). @menu * Flow Control Summary:: The effect of @code{screen} flow control * Flow:: Setting the flow control behavior * XON/XOFF:: Sending XON or XOFF to the window @end menu @node Flow Control Summary @section About @code{screen} flow control settings Each window has a flow-control setting that determines how screen deals with the XON and XOFF characters (and perhaps the interrupt character). When flow-control is turned off, screen ignores the XON and XOFF characters, which allows the user to send them to the current program by simply typing them (useful for the @code{emacs} editor, for instance). The trade-off is that it will take longer for output from a ``normal'' program to pause in response to an XOFF. With flow-control turned on, XON and XOFF characters are used to immediately pause the output of the current window. You can still send these characters to the current program, but you must use the appropriate two-character screen commands (typically @kbd{C-a q} (xon) and @kbd{C-a s} (xoff)). The xon/xoff commands are also useful for typing C-s and C-q past a terminal that intercepts these characters. Each window has an initial flow-control value set with either the @samp{-f} option or the @code{defflow} command. By default the windows are set to automatic flow-switching. It can then be toggled between the three states 'fixed on', 'fixed off' and 'automatic' interactively with the @code{flow} command bound to @kbd{C-a f}. The automatic flow-switching mode deals with flow control using the TIOCPKT mode (like @code{rlogin} does). If the tty driver does not support TIOCPKT, screen tries to determine the right mode based on the current setting of the application keypad --- when it is enabled, flow-control is turned off and visa versa. Of course, you can still manipulate flow-control manually when needed. If you're running with flow-control enabled and find that pressing the interrupt key (usually C-c) does not interrupt the display until another 6-8 lines have scrolled by, try running screen with the @samp{interrupt} option (add the @samp{interrupt} flag to the @code{flow} command in your .screenrc, or use the @samp{-i} command-line option). This causes the output that @code{screen} has accumulated from the interrupted program to be flushed. One disadvantage is that the virtual terminal's memory contains the non-flushed version of the output, which in rare cases can cause minor inaccuracies in the output. For example, if you switch screens and return, or update the screen with @kbd{C-a l} you would see the version of the output you would have gotten without @samp{interrupt} being on. Also, you might need to turn off flow-control (or use auto-flow mode to turn it off automatically) when running a program that expects you to type the interrupt character as input, as the @samp{interrupt} parameter only takes effect when flow-control is enabled. If your program's output is interrupted by mistake, a simple refresh of the screen with @kbd{C-a l} will restore it. Give each mode a try, and use whichever mode you find more comfortable. @node Flow @section Flow @deffn Command defflow fstate [interrupt] (none)@* Same as the @code{flow} command except that the default setting for new windows is changed. Initial setting is `auto'. Specifying @code{flow auto interrupt} has the same effect as the command-line options @samp{-fa} and @samp{-i}. Note that if @samp{interrupt} is enabled, all existing displays are changed immediately to forward interrupt signals. @end deffn @kindex f @kindex C-f @deffn Command flow [fstate] (@kbd{C-a f}, @kbd{C-a C-f})@* Sets the flow-control mode for this window to @var{fstate}, which can be @samp{on}, @samp{off} or @samp{auto}. Without parameters it cycles the current window's flow-control setting. Default is set by `defflow'. @end deffn @node XON/XOFF @section XON and XOFF @kindex q @kindex C-q @deffn Command xon (@kbd{C-a q}, @kbd{C-a C-q})@* Send a ^Q (ASCII XON) to the program in the current window. Redundant if flow control is set to @samp{off} or @samp{auto}. @end deffn @kindex s @kindex C-s @deffn Command xoff (@kbd{C-a s}, @kbd{C-a C-s})@* Send a ^S (ASCII XOFF) to the program in the current window. @end deffn @c ---------------------------------------------------------------- @node Termcap @chapter Termcap @code{Screen} demands the most out of your terminal so that it can perform its VT100 emulation most efficiently. These functions provide means for tweaking the termcap entries for both your physical terminal and the one simulated by @code{screen}. @menu * Window Termcap:: Choosing a termcap entry for the window. * Dump Termcap:: Write out a termcap entry for the window. * Termcap Syntax:: The @code{termcap} and @code{terminfo} commands. * Termcap Examples:: Uses for @code{termcap}. * Special Capabilities:: Non-standard capabilities used by @code{screen}. * Autonuke:: Flush unseen output * Obuflimit:: Allow pending output when reading more * Character Translation:: Emulating fonts and charsets. @end menu @node Window Termcap @section Choosing the termcap entry for a window Usually @code{screen} tries to emulate as much of the VT100/ANSI standard as possible. But if your terminal lacks certain capabilities the emulation may not be complete. In these cases @code{screen} has to tell the applications that some of the features are missing. This is no problem on machines using termcap, because @code{screen} can use the @code{$TERMCAP} variable to customize the standard screen termcap. But if you do a rlogin on another machine or your machine supports only terminfo this method fails. Because of this @code{screen} offers a way to deal with these cases. Here is how it works: When @code{screen} tries to figure out a terminal name for itself, it first looks for an entry named @code{screen.@var{term}}, where @var{term} is the contents of your @code{$TERM} variable. If no such entry exists, @code{screen} tries @samp{screen} (or @samp{screen-w}, if the terminal is wide (132 cols or more)). If even this entry cannot be found, @samp{vt100} is used as a substitute. The idea is that if you have a terminal which doesn't support an important feature (e.g. delete char or clear to EOS) you can build a new termcap/terminfo entry for @code{screen} (named @samp{screen.@var{dumbterm}}) in which this capability has been disabled. If this entry is installed on your machines you are able to do a rlogin and still keep the correct termcap/terminfo entry. The terminal name is put in the @code{$TERM} variable of all new windows. @code{screen} also sets the @code{$TERMCAP} variable reflecting the capabilities of the virtual terminal emulated. Furthermore, the variable @code{$WINDOW} is set to the window number of each window. The actual set of capabilities supported by the virtual terminal depends on the capabilities supported by the physical terminal. If, for instance, the physical terminal does not support underscore mode, @code{screen} does not put the @samp{us} and @samp{ue} capabilities into the window's @code{$TERMCAP} variable, accordingly. However, a minimum number of capabilities must be supported by a terminal in order to run @code{screen}; namely scrolling, clear screen, and direct cursor addressing (in addition, @code{screen} does not run on hardcopy terminals or on terminals that over-strike). Also, you can customize the @code{$TERMCAP} value used by @code{screen} by using the @code{termcap} command, or by defining the variable @code{$SCREENCAP} prior to startup. When the latter defined, its value will be copied verbatim into each window's @code{$TERMCAP} variable. This can either be the full terminal definition, or a filename where the terminal @samp{screen} (and/or @samp{screen-w}) is defined. Note that @code{screen} honors the @code{terminfo} command if the system uses the terminfo database rather than termcap. On such machines the @code{$TERMCAP} variable has no effect and you must use the @code{dumptermcap} command (@pxref{Dump Termcap}) and the @code{tic} program to generate terminfo entries for @code{screen} windows. When the boolean @samp{G0} capability is present in the termcap entry for the terminal on which @code{screen} has been called, the terminal emulation of @code{screen} supports multiple character sets. This allows an application to make use of, for instance, the VT100 graphics character set or national character sets. The following control functions from ISO 2022 are supported: @samp{lock shift G0} (@samp{SI}), @samp{lock shift G1} (@samp{SO}), @samp{lock shift G2}, @samp{lock shift G3}, @samp{single shift G2}, and @samp{single shift G3}. When a virtual terminal is created or reset, the ASCII character set is designated as @samp{G0} through @samp{G3}. When the @samp{G0} capability is present, screen evaluates the capabilities @samp{S0}, @samp{E0}, and @samp{C0} if present. @samp{S0} is the sequence the terminal uses to enable and start the graphics character set rather than @samp{SI}. @samp{E0} is the corresponding replacement for @samp{SO}. @samp{C0} gives a character by character translation string that is used during semi-graphics mode. This string is built like the @samp{acsc} terminfo capability. When the @samp{po} and @samp{pf} capabilities are present in the terminal's termcap entry, applications running in a @code{screen} window can send output to the printer port of the terminal. This allows a user to have an application in one window sending output to a printer connected to the terminal, while all other windows are still active (the printer port is enabled and disabled again for each chunk of output). As a side-effect, programs running in different windows can send output to the printer simultaneously. Data sent to the printer is not displayed in the window. The @code{info} command displays a line starting with @samp{PRIN} while the printer is active. Some capabilities are only put into the @code{$TERMCAP} variable of the virtual terminal if they can be efficiently implemented by the physical terminal. For instance, @samp{dl} (delete line) is only put into the @code{$TERMCAP} variable if the terminal supports either delete line itself or scrolling regions. Note that this may provoke confusion, when the session is reattached on a different terminal, as the value of @code{$TERMCAP} cannot be modified by parent processes. You can force @code{screen} to include all capabilities in @code{$TERMCAP} with the @samp{-a} command-line option (@pxref{Invoking Screen}). The "alternate screen" capability is not enabled by default. Set the @code{altscreen} @file{.screenrc} command to enable it. @node Dump Termcap @section Write out the window's termcap entry @kindex . @deffn Command dumptermcap (@kbd{C-a .})@* Write the termcap entry for the virtual terminal optimized for the currently active window to the file @file{.termcap} in the user's @file{$HOME/.screen} directory (or wherever @code{screen} stores its sockets. @pxref{Files}). This termcap entry is identical to the value of the environment variable @code{$TERMCAP} that is set up by @code{screen} for each window. For terminfo based systems you will need to run a converter like @code{captoinfo} and then compile the entry with @code{tic}. @end deffn @node Termcap Syntax @section The @code{termcap} command @deffn Command termcap term terminal-tweaks [window-tweaks] @deffnx Command terminfo term terminal-tweaks [window-tweaks] @deffnx Command termcapinfo term terminal-tweaks [window-tweaks] (none)@* Use this command to modify your terminal's termcap entry without going through all the hassles involved in creating a custom termcap entry. Plus, you can optionally customize the termcap generated for the windows. You have to place these commands in one of the screenrc startup files, as they are meaningless once the terminal emulator is booted. If your system uses the terminfo database rather than termcap, @code{screen} will understand the @code{terminfo} command, which has the same effects as the @code{termcap} command. Two separate commands are provided, as there are subtle syntactic differences, e.g. when parameter interpolation (using @samp{%}) is required. Note that the termcap names of the capabilities should also be used with the @code{terminfo} command. In many cases, where the arguments are valid in both terminfo and termcap syntax, you can use the command @code{termcapinfo}, which is just a shorthand for a pair of @code{termcap} and @code{terminfo} commands with identical arguments. @end deffn The first argument specifies which terminal(s) should be affected by this definition. You can specify multiple terminal names by separating them with @samp{|}s. Use @samp{*} to match all terminals and @samp{vt*} to match all terminals that begin with @samp{vt}. Each @var{tweak} argument contains one or more termcap defines (separated by @samp{:}s) to be inserted at the start of the appropriate termcap entry, enhancing it or overriding existing values. The first tweak modifies your terminal's termcap, and contains definitions that your terminal uses to perform certain functions. Specify a null string to leave this unchanged (e.g. ""). The second (optional) tweak modifies all the window termcaps, and should contain definitions that screen understands (@pxref{Virtual Terminal}). @node Termcap Examples @section Termcap Examples Some examples: @example termcap xterm* xn:hs@@ @end example @noindent Informs @code{screen} that all terminals that begin with @samp{xterm} have firm auto-margins that allow the last position on the screen to be updated (xn), but they don't really have a status line (no 'hs' -- append @samp{@@} to turn entries off). Note that we assume @samp{xn} for all terminal names that start with @samp{vt}, but only if you don't specify a termcap command for that terminal. @example termcap vt* xn termcap vt102|vt220 Z0=\E[?3h:Z1=\E[?3l @end example @noindent Specifies the firm-margined @samp{xn} capability for all terminals that begin with @samp{vt}, and the second line will also add the escape-sequences to switch into (Z0) and back out of (Z1) 132-character-per-line mode if this is a VT102 or VT220. (You must specify Z0 and Z1 in your termcap to use the width-changing commands.) @example termcap vt100 "" l0=PF1:l1=PF2:l2=PF3:l3=PF4 @end example @noindent This leaves your vt100 termcap alone and adds the function key labels to each window's termcap entry. @example termcap h19|z19 am@@:im=\E@@:ei=\EO dc=\E[P @end example @noindent Takes a h19 or z19 termcap and turns off auto-margins (am@@) and enables the insert mode (im) and end-insert (ei) capabilities (the @samp{@@} in the @samp{im} string is after the @samp{=}, so it is part of the string). Having the @samp{im} and @samp{ei} definitions put into your terminal's termcap will cause screen to automatically advertise the character-insert capability in each window's termcap. Each window will also get the delete-character capability (dc) added to its termcap, which screen will translate into a line-update for the terminal (we're pretending it doesn't support character deletion). If you would like to fully specify each window's termcap entry, you should instead set the @code{$SCREENCAP} variable prior to running @code{screen}. @xref{Virtual Terminal}, for the details of the @code{screen} terminal emulation. @xref{Termcap}, for more information on termcap definitions. @node Special Capabilities @section Special Terminal Capabilities @cindex terminal capabilities @cindex capabilities The following table describes all terminal capabilities that are recognized by @code{screen} and are not in the termcap manual (@pxref{Termcap}). You can place these capabilities in your termcap entries (in @file{/etc/termcap}) or use them with the commands @code{termcap}, @code{terminfo} and @code{termcapinfo} in your @code{screenrc} files. It is often not possible to place these capabilities in the terminfo database. @table @samp @item LP (bool)@* Terminal has VT100 style margins (`magic margins'). Note that this capability is obsolete --- @code{screen} now uses the standard @samp{xn} instead. @item Z0 (str)@* Change width to 132 columns. @item Z1 (str)@* Change width to 80 columns. @item WS (str)@* Resize display. This capability has the desired width and height as arguments. SunView(tm) example: @samp{\E[8;%d;%dt}. @item NF (bool)@* Terminal doesn't need flow control. Send ^S and ^Q direct to the application. Same as @code{flow off}. The opposite of this capability is @samp{nx}. @item G0 (bool)@* Terminal can deal with ISO 2022 font selection sequences. @item S0 (str)@* Switch charset @samp{G0} to the specified charset. Default is @samp{\E(%.}. @item E0 (str)@* Switch charset @samp{G0} back to standard charset. Default is @samp{\E(B}. @item C0 (str)@* Use the string as a conversion table for font 0. See the @samp{ac} capability for more details. @item CS (str)@* Switch cursor-keys to application mode. @item CE (str)@* Switch cursor-keys to cursor mode. @item AN (bool)@* Enable autonuke for displays of this terminal type. (@pxref{Autonuke}). @item OL (num)@* Set the output buffer limit. See the @samp{obuflimit} command (@pxref{Obuflimit}) for more details. @item KJ (str)@* Set the encoding of the terminal. See the @samp{encoding} command (@pxref{Character Processing}) for valid encodings. @item AF (str)@* Change character foreground color in an ANSI conform way. This capability will almost always be set to @samp{\E[3%dm} (@samp{\E[3%p1%dm} on terminfo machines). @item AB (str)@* Same as @samp{AF}, but change background color. @item AX (bool)@* Does understand ANSI set default fg/bg color (@samp{\E[39m / \E[49m}). @item XC (str)@* Describe a translation of characters to strings depending on the current font. (@pxref{Character Translation}). @item XT (bool)@* Terminal understands special xterm sequences (OSC, mouse tracking). @item C8 (bool)@* Terminal needs bold to display high-intensity colors (e.g. Eterm). @item TF (bool)@* Add missing capabilities to the termcap/info entry. (Set by default). @end table @node Autonuke @section Autonuke @deffn Command autonuke @var{state} (none)@* Sets whether a clear screen sequence should nuke all the output that has not been written to the terminal. @xref{Obuflimit}. This property is set per display, not per window. @end deffn @deffn Command defautonuke @var{state} (none)@* Same as the @code{autonuke} command except that the default setting for new displays is also changed. Initial setting is @code{off}. Note that you can use the special @code{AN} terminal capability if you want to have a terminal type dependent setting. @end deffn @node Obuflimit @section Obuflimit @deffn Command obuflimit [@var{limit}] (none)@* If the output buffer contains more bytes than the specified limit, no more data will be read from the windows. The default value is 256. If you have a fast display (like @code{xterm}), you can set it to some higher value. If no argument is specified, the current setting is displayed. This property is set per display, not per window. @end deffn @deffn Command defobuflimit @var{limit} (none)@* Same as the @code{obuflimit} command except that the default setting for new displays is also changed. Initial setting is 256 bytes. Note that you can use the special @code{OL} terminal capability if you want to have a terminal type dependent limit. @end deffn @node Character Translation @section Character Translation @code{Screen} has a powerful mechanism to translate characters to arbitrary strings depending on the current font and terminal type. Use this feature if you want to work with a common standard character set (say ISO8851-latin1) even on terminals that scatter the more unusual characters over several national language font pages. Syntax: @example XC=@var{}@{,,@var{}@} @var{} := @var{}@var{