screen-5.0.1/0000775000175000017500000000000015011405544011441 5ustar alexalexscreen-5.0.1/encoding.h0000664000175000017500000000176415011404317013405 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.1/os.h0000664000175000017500000001044515011404317012234 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.1/winmsgbuf.c0000664000175000017500000002171215011404317013606 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 accomodate this character, but bail out silenty 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 * accomodate 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 accomodate */ 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 * accomodate the length of the string sans its terminating null byte. The * context pointer is adjusted to the the terminiating 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 accomodate 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 accomodate 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.1/termcap.h0000664000175000017500000000070415011404317013243 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.1/winmsg.h0000664000175000017500000000700515011405274013120 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 = '>', } 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.1/etc/0000775000175000017500000000000015011404317012211 5ustar alexalexscreen-5.0.1/etc/newsyntax0000775000175000017500000000360315011404317014201 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.1/etc/etcscreenrc0000664000175000017500000000635615011404317014446 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 corected 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.1/etc/toolcheck0000775000175000017500000000223215011404317014111 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.1/etc/mkinstalldirs0000775000175000017500000000115315011404317015017 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.1/etc/countmail0000775000175000017500000000255215011404317014136 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.1/etc/ccdefs0000775000175000017500000000143715011404317013373 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.1/etc/screenrc0000664000175000017500000000716115011404317013745 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.1/etc/newsyntax380000775000175000017500000000373615011404317014363 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 savely 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 featureism. # 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.1/etc/completer.zsh0000664000175000017500000000721715011404317014740 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\ conrol\ off a\:Flow\ conrol\ 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.1/layout.c0000664000175000017500000001672615011404317013133 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.1/NEWS.3.90000664000175000017500000001512315011404317012447 0ustar alexalex ------------------------------- What's new in screen-3.9.15 ? ------------------------------- * unicode combining character support * new encoding: Chinese GBK * new 'backtick' command and string escape to embed command output into e.g. the hardstatus line ------------------------------- What's new in screen-3.9.13 ? ------------------------------- * altscreen support from Gurusamy Sarathy * new command "maxwin" to set a limit on the number of windows * new keys in copy&paste mode: 'B' and 'E' ------------------------------- What's new in screen-3.9.11 ? ------------------------------- * windowlist, bound to ^A" * support for other encodings, e.g. big5, koi8r, cp1251 new commands 'encoding', 'defencoding' 'register', 'readreg', 'readbuf', 'writebuf' now understand an extra encoding parameter * support for double UTF-8 characters * lots of new string escapes and extensions to existing ones: %LD, %LM, %Lw, %W, %-w, %+w, %H, %f, %F, %l, %=, %<, %> * new commands: 'source', 'eval', 'deflog', 'ignorecase', 'setsid' * command key classes: 'bind', 'command' and 'help' understand a '-c ' parameter. See the man page for examples * new login state: always - don't remove slot even if screen gets detached * 256 color support (experimental) * configurable time format string (for ^At) * config option to use localized month/week names * new option '-h' for hardcopy: also dump the scrollback buffer ------------------------------ What's new in screen-3.9.9 ? ------------------------------ * new '-X' option to send commands to screen sessions. screen -X echo Hi... * added a possibility to change the attributes/color in caption or hardstatus strings: caption always "%3n %{r}%t%{-}%? @%u%?%? %{g}[%h]%{-}%?" * new 'dinfo' command to show what screen thinks about your terminal. * new 'attrcolor' command to map attributes to color codes: attrcolor u "-u b" attrcolor b "r" * support for UTF-8: new commands 'utf8', 'defutf8' to change the encoding of a window, plus a '-U' option to tell screen that your terminal sends/receives UTF-8 codes. * support for 16 colors. ------------------------------ What's new in screen-3.9.8 ? ------------------------------ * new command 'resize' to resize regions (aka split windows), try: bind = resize = bind + resize +1 bind - resize -1 bind _ resize max * new argument for 'focus': up, down, top, bottom * X11 mouse tracking support * Support for the "new color model", aka "background color erase": the bce/defbce commands change the color model of the current window/new windows. * experimental rxvt OSC sequence support (used to set a background picture or to change the default colors), disabled by default. ---------------------------- What's new in screen-3.9 ? ---------------------------- * real multiuser support A window can now be displayed on more than one attached displays. Screen does all the necessary clipping if the window size doesn't fit the display. New command: ^AF - fit the window size into the display size. * split screen support A display may now host multiple windows. New commands: ^AS - split horizontally. This add another region to the display ^A - move the focus to the next region ^AX - kill the current region ^AQ - kill all other regions * hardstatus emulation support The last line of the display may now be used as a hardstatus line if the terminal doesn't have the 'hs' capability. New commands: hardstatus [always]lastline hardstatus [always]message hardstatus [always]ignore * configurable window separator and hardstatus strings The window (region) separator and the hardstatus can be set to an arbitrary string containing screen's % escape sequences. The window's hardstatus is just another escape sequence, '%h'. New commands: hardstatus string [string] caption string [string] The default strings are "%h" (hardstatus) and "%3n %t" (caption). * permanent window separator The window separator can be set to stay on screen even if the display contains only one region New commands: caption always caption splitonly * many new escapes %c - current time HH:MM (*CHANGE*: this was %w in screen-3.7) %C - current time HH:MM in 24h format %l - the load of the system %h - hardstatus of the window %w - all window names %W - all window names except the current window %u - all other users on this window %? - the part to the next %? is displayed only if an escape expands to an nonempty string. %: - "else" part of %? Some escapes like %c may be qualified with a '0' (like %0c) to make screen use '0' instead of space as a filler. Others understand a length qualifier, like %3n. If escapes like the current time are used as hardstatus/caption string screen will update them so that you can always have the current time onscreen. *CHANGE* ~ is no longer used as bell character, use ^G instead! * logfile timestamps and flush timeout New commands: logfile flush logtstamp [on|off] logtstamp string [string] logtstamp after [secs] * configurable breaktype You can now choose one of TIOCSBRK, TCSBRK, tcsendbreak. New commands: breaktype defbreaktype * other new commands: hstatus - set the window's hardstatus defslowpaste defsilence * optional builtin telnet. This is useful if screen is used as frontend to a terminal multiplexor. Use //telnet to access the builtin telnet program, as in: 'screen //telnet host [port]' * remote detach and reattach change: '-d' is now ignored if the screen is already detached and you want to reattach. You can also use '-RR' to make screen use the first session found if more than one session is available. Thus '-d -RR' or '-x -RR' always gets you a screen. * support for history compaction You can tell screen to suppress trailing blank lines when scrolling up text into the history buffer. (Wayne Davison) New command: compacthist * optional Braille support. If you can read Braille and have one of the devices listed in README.DOTSCREEN, please compile with -DHAVE_BRAILLE and let us know if this feature is useful. screen-5.0.1/tests/0000775000175000017500000000000015011404317012600 5ustar alexalexscreen-5.0.1/tests/test-winmsgbuf.c0000664000175000017500000003334615011404317015733 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 accomodate 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.1/tests/mallocmock.c0000664000175000017500000000310515011404317015064 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 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.1/tests/macros.h0000664000175000017500000001120115011404317014230 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.1/tests/test-winmsgcond.c0000664000175000017500000001210215011404317016065 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 *, char *)); 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, char *, (WinMsgCond *, char *, bool *)); SIGNATURE_CHECK(wmc_end, char *, (const WinMsgCond *, char *, bool *)); SIGNATURE_CHECK(wmc_deinit, void, (WinMsgCond *)); int main(void) { /* simple test with no "else" */ { WinMsgCond wmc; char *pos = "test"; 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) == NULL); ASSERT(chg); wmc_set(&wmc); ASSERT(wmc_is_set(&wmc) == false); ASSERT(wmc_end(&wmc, pos + 1, &chg) == NULL); ASSERT(chg); wmc_clear(&wmc); ASSERT(wmc_end(&wmc, pos + 1, &chg) == NULL); 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) == NULL); ASSERT(chg); } /* "else" condition */ { WinMsgCond wmc; char *pos = "test"; char *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) == NULL); 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) == NULL); 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; char *pos = "test"; 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); /* similarily, 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.1/tests/.gitignore0000664000175000017500000000002015011404317014560 0ustar alexalex* !.* !*.c !*.h screen-5.0.1/tests/signature.h0000664000175000017500000000371315011404317014756 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.1/winmsgcond.h0000664000175000017500000000275215011404317013765 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.1/image.h0000664000175000017500000001035615011404317012676 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.1/ansi.c0000664000175000017500000016407215011404317012546 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 "ansi.h" #include #include #include #include "screen.h" #include "encoding.h" #include "fileio.h" #include "help.h" #include "logfile.h" #include "mark.h" #include "misc.h" #include "process.h" #include "resize.h" #include "winmsg.h" /* widths for Z0/Z1 switching */ const int Z0width = 132; const int Z1width = 80; bool use_altscreen = false; /* enable alternate screen support? */ bool use_hardstatus = true; /* display status line in hs */ bool visual_bell = 0; char *printcmd = NULL; uint32_t *blank; /* line filled with spaces */ uint32_t *null; /* line filled with '\0' */ struct mline mline_old; struct mline mline_blank; struct mline mline_null; struct mchar mchar_null; struct mchar mchar_blank = { ' ', 0, 0, 0, 0, 0 }; struct mchar mchar_so = { ' ', A_RV, 0, 0, 0, 0}; uint64_t renditions[NUM_RENDS] = { 65529 /* =ub */ , 65531 /* =b */ , 65533 /* =u */ }; /* keep string_t and string_t_string in sync! */ static char *string_t_string[] = { "NONE", "DCS", /* Device control string */ "OSC", /* Operating system command */ "APC", /* Application program command */ /* - used for status change */ "PM", /* Privacy message */ "AKA", /* title for current screen */ "GM", /* Global message to every display */ "STATUS" /* User hardstatus line */ }; /* keep state_t and state_t_string in sync! */ static char *state_t_string[] = { "LIT", /* Literal input */ "ESC", /* Start of escape sequence */ "ASTR", /* Start of control string */ "STRESC", /* ESC seen in control string */ "CSI", /* Reading arguments in "CSI Pn ;... */ "PRIN", /* Printer mode */ "PRINESC", /* ESC seen in printer mode */ "PRINCSI", /* CSI seen in printer mode */ "PRIN4" /* CSI 4 seen in printer mode */ }; static int Special(Window *,int); static void DoESC(Window *, int, int); static void DoCSI(Window *, int, int); static void StringStart(Window *, enum string_t); static void StringChar(Window *, int); static int StringEnd(Window *); static void PrintStart(Window *); static void PrintChar(Window *, int); static void PrintFlush(Window *); static void DesignateCharset(Window *, int, int); static void MapCharset(Window *, int); static void MapCharsetR(Window *, int); static void SaveCursor(Window *, struct cursor *); static void RestoreCursor(Window *, struct cursor *); static void BackSpace(Window *); static void Return(Window *); static void LineFeed(Window *, int); static void ReverseLineFeed(Window *); static void InsertChar(Window *, int); static void DeleteChar(Window *, int); static void DeleteLine(Window *, int); static void InsertLine(Window *, int); static void Scroll(char *, int, int, char *); static void ForwardTab(Window *win); static void BackwardTab(Window *win); static void ClearScreen(Window *win); static void ClearFromBOS(Window *win); static void ClearToEOS(Window *win); static void ClearLineRegion(Window *, int, int); static void CursorRight(Window *, int); static void CursorUp(Window *, int); static void CursorDown(Window *, int); static void CursorLeft(Window *, int); static void ASetMode(Window *win, bool); static void SelectRendition(Window *win); static void RestorePosRendition(Window *); static void FillWithEs(Window *); static void FindAKA(Window *); static void Report(Window *, char *, int, int); static void ScrollRegion(Window *win, int); static void WAddLineToHist(Window *, struct mline *); static void WLogString(Window *, char *, size_t); static void WReverseVideo(Window *, bool); static void MFixLine(Window *, int, struct mchar *); static void MScrollH(Window *, int, int, int, int, int); static void MScrollV(Window *, int, int, int, int); static void MClearArea(Window *, int, int, int, int, int); static void MInsChar(Window *, struct mchar *, int, int); static void MPutChar(Window *, struct mchar *, int, int); static void MWrapChar(Window *, struct mchar *, int, int, int, bool); static void MBceLine(Window *, int, int, int, int); static void WChangeSize(Window *, int, int); void ResetAnsiState(Window *win) { win->w_state = LIT; win->w_StringType = NONE; } /* adds max 22 bytes */ int GetAnsiStatus(Window *win, char *buf) { char *p = buf; if (win->w_state == LIT) return 0; strcpy(p, state_t_string[win->w_state]); p += strlen(p); if (win->w_intermediate) { *p++ = '-'; if (win->w_intermediate > 0xff) p += AddXChar(p, win->w_intermediate >> 8); p += AddXChar(p, win->w_intermediate & 0xff); *p = 0; } if (win->w_state == ASTR || win->w_state == STRESC) sprintf(p, "-%s", string_t_string[win->w_StringType]); p += strlen(p); return p - buf; } void ResetCharsets(Window *win) { win->w_gr = nwin_default.gr; win->w_c1 = nwin_default.c1; SetCharsets(win, "BBBB02"); if (nwin_default.charset) SetCharsets(win, nwin_default.charset); ResetEncoding(win); } void SetCharsets(Window *win, char *s) { for (int i = 0; i < 4 && *s; i++, s++) if (*s != '.') win->w_charsets[i] = ((*s == 'B') ? ASCII : *s); if (*s && *s++ != '.') win->w_Charset = s[-1] - '0'; if (*s && *s != '.') win->w_CharsetR = *s - '0'; win->w_ss = 0; win->w_FontL = win->w_charsets[win->w_Charset]; win->w_FontR = win->w_charsets[win->w_CharsetR]; } /*****************************************************************/ /* * Here comes the vt100 emulator * - writes logfiles, * - sets timestamp and flags activity in window. * - record program output in window scrollback * - translate program output for the display and put it into the obuf. * */ void WriteString(Window *win, char *buf, size_t len) { int c; int font; Canvas *cv; if (len == 0) return; if (win->w_log) WLogString(win, buf, len); if (win->w_silence) SetTimeout(&win->w_silenceev, win->w_silencewait * 1000); if (win->w_monitor == MON_ON) { win->w_monitor = MON_FOUND; } if (win->w_width > 0 && win->w_height > 0) { do { c = (unsigned char)*buf++; if (!win->w_mbcs) win->w_rend.font = win->w_FontL; /* Default: GL */ if (win->w_encoding == UTF8) { c = FromUtf8(c, &win->w_decodestate); if (c == -1) continue; if (c == -2) { c = UCS_REPL; /* try char again */ buf--; len++; } } tryagain: switch (win->w_state) { case PRIN: switch (c) { case '\033': win->w_state = PRINESC; break; default: PrintChar(win, c); } break; case PRINESC: switch (c) { case '[': win->w_state = PRINCSI; break; default: PrintChar(win, '\033'); PrintChar(win, c); win->w_state = PRIN; } break; case PRINCSI: switch (c) { case '4': win->w_state = PRIN4; break; default: PrintChar(win, '\033'); PrintChar(win, '['); PrintChar(win, c); win->w_state = PRIN; } break; case PRIN4: switch (c) { case 'i': win->w_state = LIT; PrintFlush(win); if (win->w_pdisplay && win->w_pdisplay->d_printfd >= 0) { close(win->w_pdisplay->d_printfd); win->w_pdisplay->d_printfd = -1; } win->w_pdisplay = NULL; break; default: PrintChar(win, '\033'); PrintChar(win, '['); PrintChar(win, '4'); PrintChar(win, c); win->w_state = PRIN; } break; case ASTR: if (c == 0) break; if (c == '\033') { win->w_state = STRESC; break; } /* special xterm hack: accept SetStatus sequence. Yucc! */ /* allow ^E for title escapes */ if (!(win->w_StringType == OSC && c < ' ' && c != '\005')) if (!win->w_c1 || c != ('\\' ^ 0xc0)) { StringChar(win, c); break; } c = '\\'; /* FALLTHROUGH */ case STRESC: switch (c) { case '\\': if (StringEnd(win) == 0 || len <= 1) break; /* check if somewhere a status is displayed */ for (cv = win->w_layer.l_cvlist; cv; cv = cv->c_lnext) { display = cv->c_display; if (D_status == STATUS_ON_WIN) break; } if (cv) { if (len > IOSIZE + 1) len = IOSIZE + 1; win->w_outlen = len - 1; memmove(win->w_outbuf, buf, len - 1); return; /* wait till status is gone */ } break; case '\033': StringChar(win, '\033'); break; default: win->w_state = ASTR; StringChar(win, '\033'); StringChar(win, c); break; } break; case ESC: switch (c) { case '[': win->w_NumArgs = 0; win->w_intermediate = 0; memset((char *)win->w_args, 0, MAXARGS * sizeof(int)); win->w_state = CSI; break; case ']': StringStart(win, OSC); break; case '_': StringStart(win, APC); break; case 'P': StringStart(win, DCS); break; case '^': StringStart(win, PM); break; case '!': StringStart(win, GM); break; case '"': case 'k': StringStart(win, AKA); break; default: if (Special(win, c)) { win->w_state = LIT; break; } if (c >= ' ' && c <= '/') { if (win->w_intermediate) { if (win->w_intermediate == '$') c |= '$' << 8; else c = -1; } win->w_intermediate = c; } else if (c >= '0' && c <= '~') { DoESC(win, c, win->w_intermediate); win->w_state = LIT; } else { win->w_state = LIT; goto tryagain; } } break; case CSI: switch (c) { case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': if (win->w_NumArgs >= 0 && win->w_NumArgs < MAXARGS) { if (win->w_args[win->w_NumArgs] < 100000000) win->w_args[win->w_NumArgs] = 10 * win->w_args[win->w_NumArgs] + (c - '0'); } break; case ';': case ':': if (win->w_NumArgs < MAXARGS) win->w_NumArgs++; break; default: if (Special(win, c)) break; if (c >= '@' && c <= '~') { if (win->w_NumArgs < MAXARGS) win->w_NumArgs++; DoCSI(win, c, win->w_intermediate); if (win->w_state != PRIN) win->w_state = LIT; } else if ((c >= ' ' && c <= '/') || (c >= '<' && c <= '?')) win->w_intermediate = win->w_intermediate ? -1 : c; else { win->w_state = LIT; goto tryagain; } } break; case LIT: default: if (win->w_mbcs) if (c <= ' ' || c == 0x7f || (c >= 0x80 && c < 0xa0 && win->w_c1)) win->w_mbcs = 0; if (c < ' ') { if (c == '\033') { win->w_intermediate = 0; win->w_state = ESC; if (win->w_autoaka < 0) win->w_autoaka = 0; } else Special(win, c); break; } if (c >= 0x80 && c < 0xa0 && win->w_c1) if ((win->w_FontR & 0xf0) != 0x20 || win->w_encoding == UTF8) { switch (c) { case 0xc0 ^ 'D': case 0xc0 ^ 'E': case 0xc0 ^ 'H': case 0xc0 ^ 'M': case 0xc0 ^ 'N': /* SS2 */ case 0xc0 ^ 'O': /* SS3 */ DoESC(win, c ^ 0xc0, 0); break; case 0xc0 ^ '[': if (win->w_autoaka < 0) win->w_autoaka = 0; win->w_NumArgs = 0; win->w_intermediate = 0; memset((char *)win->w_args, 0, MAXARGS * sizeof(int)); win->w_state = CSI; break; case 0xc0 ^ 'P': StringStart(win, DCS); break; default: break; } break; } if (!win->w_mbcs) { if (c < 0x80 || win->w_gr == 0) win->w_rend.font = win->w_FontL; else if (win->w_gr == 2 && !win->w_ss) win->w_rend.font = win->w_FontE; else win->w_rend.font = win->w_FontR; } if (win->w_encoding == UTF8) { if (win->w_rend.font == '0') { struct mchar mc, *mcp; mc.image = c; mc.mbcs = 0; mc.font = '0'; mcp = recode_mchar(&mc, 0, UTF8); c = mcp->image | mcp->font << 8; } win->w_rend.font = 0; } if (win->w_encoding == UTF8 && c >= 0x0300 && utf8_iscomb(c)) { int ox, oy; struct mchar omc; ox = win->w_x - 1; oy = win->w_y; if (ox < 0) { ox = win->w_width - 1; oy--; } if (oy < 0) oy = 0; copy_mline2mchar(&omc, &win->w_mlines[oy], ox); if (omc.image == 0xff && omc.font == 0xff) { ox--; if (ox >= 0) { copy_mline2mchar(&omc, &win->w_mlines[oy], ox); omc.mbcs = 0xff; } } if (ox >= 0) { utf8_handle_comb(c, &omc); MFixLine(win, oy, &omc); copy_mchar2mline(&omc, &win->w_mlines[oy], ox); LPutChar(&win->w_layer, &omc, ox, oy); LGotoPos(&win->w_layer, win->w_x, win->w_y); } break; } if (win->w_encoding == UTF8 && utf8_isdouble(c)) win->w_mbcs = 0xff; font = win->w_rend.font; if (font == KANA && win->w_encoding == SJIS && win->w_mbcs == 0) { /* Lets see if it is the first byte of a kanji */ if ((0x81 <= c && c <= 0x9f) || (0xe0 <= c && c <= 0xef)) { win->w_mbcs = c; break; } } if (font == 031 && c == 0x80 && !win->w_mbcs) font = win->w_rend.font = 0; if (is_dw_font(font) && c == ' ') font = win->w_rend.font = 0; if (is_dw_font(font) || win->w_mbcs) { int t = c; if (win->w_mbcs == 0) { win->w_mbcs = c; break; } if (win->w_x == win->w_width - 1) { win->w_x += win->w_wrap ? true : false; } if (win->w_encoding != UTF8) { c = win->w_mbcs; if (font == KANA && win->w_encoding == SJIS) { /* * SJIS -> EUC mapping: * First byte: * 81,82...9f -> 21,23...5d * e0,e1...ef -> 5f,61...7d * Second byte: * 40-7e -> 21-5f * 80-9e -> 60-7e * 9f-fc -> 21-7e (increment first byte!) */ 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++; win->w_rend.font = KANJI; } else { /* Incomplete shift-jis - skip first byte */ c = t; t = 0; } } if (t && win->w_gr && font != 030 && font != 031) { t &= 0x7f; if (t < ' ') goto tryagain; } if (t == '\177') break; win->w_mbcs = t; } } if (font == '<' && c >= ' ') { win->w_rend.font = 0; c |= 0x80; } else if (win->w_gr && win->w_encoding != UTF8) { if (c == 0x80 && font == 0 && win->w_encoding == GBK) c = 0xa4; else c &= 0x7f; if (c < ' ' && font != 031) goto tryagain; } if (c == '\177') break; win->w_rend.image = c; if (win->w_encoding == UTF8) { win->w_rend.font = c >> 8; } win->w_rend.mbcs = win->w_mbcs; if (win->w_x < win->w_width - 1) { if (win->w_insert) { save_mline(&win->w_mlines[win->w_y], win->w_width); MInsChar(win, &win->w_rend, win->w_x, win->w_y); LInsChar(&win->w_layer, &win->w_rend, win->w_x, win->w_y, &mline_old); win->w_x++; } else { MPutChar(win, &win->w_rend, win->w_x, win->w_y); LPutChar(&win->w_layer, &win->w_rend, win->w_x, win->w_y); win->w_x++; } } else if (win->w_x == win->w_width - 1) { MPutChar(win, &win->w_rend, win->w_x, win->w_y); LPutChar(&win->w_layer, &win->w_rend, win->w_x, win->w_y); if (win->w_wrap) win->w_x++; } else { MWrapChar(win, &win->w_rend, win->w_y, win->w_top, win->w_bot, win->w_insert); LWrapChar(&win->w_layer, &win->w_rend, win->w_y, win->w_top, win->w_bot, win->w_insert); if (win->w_y != win->w_bot && win->w_y != win->w_height - 1) win->w_y++; win->w_x = 1; } if (win->w_mbcs) { win->w_rend.mbcs = win->w_mbcs = 0; win->w_x++; } if (win->w_ss) { win->w_FontL = win->w_charsets[win->w_Charset]; win->w_FontR = win->w_charsets[win->w_CharsetR]; win->w_rend.font = win->w_FontL; LSetRendition(&win->w_layer, &win->w_rend); win->w_ss = 0; } break; } } while (--len); } if (!printcmd && win->w_state == PRIN) PrintFlush(win); } static void WLogString(Window *win, char *buf, size_t len) { if (!win->w_log) return; if (logtstamp_on && win->w_logsilence >= logtstamp_after * 2) { char *t = MakeWinMsg(logtstamp_string, win, '%'); logfwrite(win->w_log, t, strlen(t)); /* long time no write */ } win->w_logsilence = 0; if (logfwrite(win->w_log, buf, len) < 1) { WMsg(win, errno, "Error writing logfile"); logfclose(win->w_log); win->w_log = NULL; } if (!log_flush) logfflush(win->w_log); } static int Special(Window *win, int c) { switch (c) { case '\b': BackSpace(win); return 1; case '\r': Return(win); return 1; case '\n': if (win->w_autoaka) FindAKA(win); /* fall through */ case '\013': /* Vertical tab is the same as Line Feed */ LineFeed(win, 0); return 1; case '\007': WBell(win, visual_bell); return 1; case '\t': ForwardTab(win); return 1; case '\017': /* SI */ MapCharset(win, G0); return 1; case '\016': /* SO */ MapCharset(win, G1); return 1; } return 0; } static void DoESC(Window *win, int c, int intermediate) { switch (intermediate) { case 0: switch (c) { case 'E': LineFeed(win, 1); break; case 'D': LineFeed(win, 0); break; case 'M': ReverseLineFeed(win); break; case 'H': win->w_tabs[win->w_x] = 1; break; case 'Z': /* jph: Identify as VT100 */ Report(win, "\033[?%d;%dc", 1, 2); break; case '7': SaveCursor(win, &win->w_saved); break; case '8': RestoreCursor(win, &win->w_saved); break; case 'c': ClearScreen(win); ResetWindow(win); LKeypadMode(&win->w_layer, 0); LCursorkeysMode(&win->w_layer, 0); #ifndef TIOCPKT WNewAutoFlow(win, 1); #endif /* XXX SetRendition(&mchar_null); InsertMode(false); ChangeScrollRegion(0, win->w_height - 1); */ LGotoPos(&win->w_layer, win->w_x, win->w_y); break; case '=': LKeypadMode(&win->w_layer, win->w_keypad = 1); #ifndef TIOCPKT WNewAutoFlow(win, 0); #endif /* !TIOCPKT */ break; case '>': LKeypadMode(&win->w_layer, win->w_keypad = 0); #ifndef TIOCPKT WNewAutoFlow(win, 1); #endif /* !TIOCPKT */ break; case 'n': /* LS2 */ MapCharset(win, G2); break; case 'o': /* LS3 */ MapCharset(win, G3); break; case '~': MapCharsetR(win, G1); /* LS1R */ break; /* { */ case '}': MapCharsetR(win, G2); /* LS2R */ break; case '|': MapCharsetR(win, G3); /* LS3R */ break; case 'N': /* SS2 */ if (win->w_charsets[win->w_Charset] != win->w_charsets[G2] || win->w_charsets[win->w_CharsetR] != win->w_charsets[G2]) win->w_FontR = win->w_FontL = win->w_charsets[win->w_ss = G2]; else win->w_ss = 0; break; case 'O': /* SS3 */ if (win->w_charsets[win->w_Charset] != win->w_charsets[G3] || win->w_charsets[win->w_CharsetR] != win->w_charsets[G3]) win->w_FontR = win->w_FontL = win->w_charsets[win->w_ss = G3]; else win->w_ss = 0; break; case 'g': /* VBELL, private screen sequence */ WBell(win, true); break; } break; case '#': switch (c) { case '8': FillWithEs(win); break; } break; case '(': DesignateCharset(win, c, G0); break; case ')': DesignateCharset(win, c, G1); break; case '*': DesignateCharset(win, c, G2); break; case '+': DesignateCharset(win, c, G3); break; /* * ESC $ ( Fn: invoke multi-byte charset, Fn, to G0 * ESC $ Fn: same as above. (old sequence) * ESC $ ) Fn: invoke multi-byte charset, Fn, to G1 * ESC $ * Fn: invoke multi-byte charset, Fn, to G2 * ESC $ + Fn: invoke multi-byte charset, Fn, to G3 */ case '$': case '$' << 8 | '(': DesignateCharset(win, c & 037, G0); break; case '$' << 8 | ')': DesignateCharset(win, c & 037, G1); break; case '$' << 8 | '*': DesignateCharset(win, c & 037, G2); break; case '$' << 8 | '+': DesignateCharset(win, c & 037, G3); break; } } static void DoCSI(Window *win, int c, int intermediate) { int i, a1 = win->w_args[0], a2 = win->w_args[1]; if (win->w_NumArgs > MAXARGS) win->w_NumArgs = MAXARGS; switch (intermediate) { case 0: switch (c) { case 'H': case 'f': if (a1 < 1) a1 = 1; if (win->w_origin) a1 += win->w_top; if (a1 > win->w_height) a1 = win->w_height; if (a2 < 1) a2 = 1; if (a2 > win->w_width) a2 = win->w_width; LGotoPos(&win->w_layer, --a2, --a1); win->w_x = a2; win->w_y = a1; if (win->w_autoaka) win->w_autoaka = a1 + 1; break; case 'J': if (a1 < 0 || a1 > 2) a1 = 0; switch (a1) { case 0: ClearToEOS(win); break; case 1: ClearFromBOS(win); break; case 2: ClearScreen(win); LGotoPos(&win->w_layer, win->w_x, win->w_y); break; } break; case 'K': if (a1 < 0 || a1 > 2) a1 %= 3; switch (a1) { case 0: ClearLineRegion(win, win->w_x, win->w_width - 1); break; case 1: ClearLineRegion(win, 0, win->w_x); break; case 2: ClearLineRegion(win, 0, win->w_width - 1); break; } break; case 'X': a1 = win->w_x + (a1 ? a1 - 1 : 0); ClearLineRegion(win, win->w_x, a1 < win->w_width ? a1 : win->w_width - 1); break; case 'A': CursorUp(win, a1 ? a1 : 1); break; case 'B': CursorDown(win, a1 ? a1 : 1); break; case 'C': CursorRight(win, a1 ? a1 : 1); break; case 'D': CursorLeft(win, a1 ? a1 : 1); break; case 'E': win->w_x = 0; CursorDown(win, a1 ? a1 : 1); /* positions cursor */ break; case 'F': win->w_x = 0; CursorUp(win, a1 ? a1 : 1); /* positions cursor */ break; case 'G': case '`': /* HPA */ win->w_x = a1 ? a1 - 1 : 0; if (win->w_x >= win->w_width) win->w_x = win->w_width - 1; LGotoPos(&win->w_layer, win->w_x, win->w_y); break; case 'd': /* VPA */ win->w_y = a1 ? a1 - 1 : 0; if (win->w_y >= win->w_height) win->w_y = win->w_height - 1; LGotoPos(&win->w_layer, win->w_x, win->w_y); break; case 'm': SelectRendition(win); break; case 'g': if (a1 == 0) win->w_tabs[win->w_x] = 0; else if (a1 == 3) memset(win->w_tabs, 0, win->w_width); break; case 'r': if (!a1) a1 = 1; if (!a2) a2 = win->w_height; if (a1 < 1 || a2 > win->w_height || a1 >= a2) break; win->w_top = a1 - 1; win->w_bot = a2 - 1; /* ChangeScrollRegion(win->w_top, win->w_bot); */ if (win->w_origin) { win->w_y = win->w_top; win->w_x = 0; } else win->w_y = win->w_x = 0; LGotoPos(&win->w_layer, win->w_x, win->w_y); break; case 's': SaveCursor(win, &win->w_saved); break; case 't': switch (a1) { case 7: LRefreshAll(&win->w_layer, 0); break; case 8: a1 = win->w_args[2]; if (a1 < 1) a1 = win->w_width; if (a2 < 1) a2 = win->w_height; if (a1 > 10000 || a2 > 10000) break; WChangeSize(win, a1, a2); break; case 11: if (win->w_layer.l_cvlist) Report(win, "\033[1t", 0, 0); else Report(win, "\033[2t", 0, 0); break; case 18: Report(win, "\033[8;%d;%dt", win->w_height, win->w_width); break; case 21: a1 = strlen(win->w_title); if ((unsigned)(win->w_inlen + 5 + a1) <= ARRAY_SIZE(win->w_inbuf)) { memmove(win->w_inbuf + win->w_inlen, "\033]l", 3); memmove(win->w_inbuf + win->w_inlen + 3, win->w_title, a1); memmove(win->w_inbuf + win->w_inlen + 3 + a1, "\033\\", 2); win->w_inlen += 5 + a1; } break; default: break; } break; case 'u': RestoreCursor(win, &win->w_saved); break; case 'I': if (!a1) a1 = 1; while (a1--) ForwardTab(win); break; case 'Z': if (!a1) a1 = 1; while (a1--) BackwardTab(win); break; case 'L': InsertLine(win, a1 ? a1 : 1); break; case 'M': DeleteLine(win, a1 ? a1 : 1); break; case 'P': DeleteChar(win, a1 ? a1 : 1); break; case '@': InsertChar(win, a1 ? a1 : 1); break; case 'h': ASetMode(win, true); break; case 'l': ASetMode(win, false); break; case 'i': /* MC Media Control */ if (a1 == 5) PrintStart(win); break; case 'n': if (a1 == 5) /* Report terminal status */ Report(win, "\033[0n", 0, 0); else if (a1 == 6) /* Report cursor position */ Report(win, "\033[%d;%dR", win->w_y + 1, win->w_x + 1); break; case 'c': /* Identify as VT100 */ if (a1 == 0) Report(win, "\033[?%d;%dc", 1, 2); break; case 'x': /* decreqtparm */ if (a1 == 0 || a1 == 1) Report(win, "\033[%d;1;1;112;112;1;0x", a1 + 2, 0); break; case 'p': /* obscure code from a 97801 term */ if (a1 == 6 || a1 == 7) { win->w_curinv = 7 - a1; LCursorVisibility(&win->w_layer, win->w_curinv ? -1 : win->w_curvvis); } break; case 'S': /* code from a 97801 term / DEC vt400 */ ScrollRegion(win, a1 ? a1 : 1); break; case 'T': /* code from a 97801 term / DEC vt400 */ case '^': /* SD as per ISO 6429 */ ScrollRegion(win, a1 ? -a1 : -1); break; } break; case ' ': if (c == 'q') { win->w_cursorstyle = a1; LCursorStyle(&win->w_layer, win->w_cursorstyle); } break; case '?': for (a2 = 0; a2 < win->w_NumArgs; a2++) { a1 = win->w_args[a2]; if (c != 'h' && c != 'l') break; i = (c == 'h'); switch (a1) { case 1: /* CKM: cursor key mode */ LCursorkeysMode(&win->w_layer, win->w_cursorkeys = i); #ifndef TIOCPKT WNewAutoFlow(win, !i); #endif /* !TIOCPKT */ break; case 2: /* ANM: ansi/vt52 mode */ if (i) { if (win->w_encoding) break; win->w_charsets[0] = win->w_charsets[1] = win->w_charsets[2] = win->w_charsets[3] = win->w_FontL = win->w_FontR = ASCII; win->w_Charset = 0; win->w_CharsetR = 2; win->w_ss = 0; } break; case 3: /* COLM: column mode */ i = (i ? Z0width : Z1width); ClearScreen(win); win->w_x = 0; win->w_y = 0; WChangeSize(win, i, win->w_height); break; /* case 4: SCLM: scrolling mode */ case 5: /* SCNM: screen mode */ if (i != win->w_revvid) WReverseVideo(win, i); win->w_revvid = i; break; case 6: /* OM: origin mode */ if ((win->w_origin = i) != 0) { win->w_y = win->w_top; win->w_x = 0; } else win->w_y = win->w_x = 0; LGotoPos(&win->w_layer, win->w_x, win->w_y); break; case 7: /* AWM: auto wrap mode */ win->w_wrap = i; break; /* case 8: ARM: auto repeat mode */ /* case 9: INLM: interlace mode */ case 9: /* X10 mouse tracking */ win->w_mouse = i ? 9 : 0; LMouseMode(&win->w_layer, win->w_mouse); break; /* case 10: EDM: edit mode */ /* case 11: LTM: line transmit mode */ /* case 13: SCFDM: space compression / field delimiting */ /* case 14: TEM: transmit execution mode */ /* case 16: EKEM: edit key execution mode */ /* case 18: PFF: Printer term form feed */ /* case 19: PEX: Printer extend screen / scroll. reg */ case 25: /* TCEM: text cursor enable mode */ win->w_curinv = !i; LCursorVisibility(&win->w_layer, win->w_curinv ? -1 : win->w_curvvis); break; /* case 34: RLM: Right to left mode */ /* case 35: HEBM: hebrew keyboard map */ /* case 36: HEM: hebrew encoding */ /* case 38: TeK Mode */ /* case 40: 132 col enable */ /* case 42: NRCM: 7bit NRC character mode */ /* case 44: margin bell enable */ case 47: /* xterm-like alternate screen */ case 1047: /* xterm-like alternate screen */ case 1049: /* xterm-like alternate screen */ if (use_altscreen) { if (i) { if (!win->w_alt.on) { SaveCursor(win, &win->w_alt.cursor); EnterAltScreen(win); } } else { if (win->w_alt.on) { RestoreCursor(win, &win->w_alt.cursor); LeaveAltScreen(win); } } if (a1 == 47 && !i) win->w_saved.on = 0; LRefreshAll(&win->w_layer, 0); LGotoPos(&win->w_layer, win->w_x, win->w_y); } break; case 1048: if (i) SaveCursor(win, &win->w_saved); else RestoreCursor(win, &win->w_saved); break; /* case 66: NKM: Numeric keypad appl mode */ /* case 68: KBUM: Keyboard usage mode (data process) */ case 1000: /* VT200 mouse tracking */ case 1001: /* VT200 highlight mouse */ case 1002: /* button event mouse */ case 1003: /* any event mouse */ win->w_mouse = i ? a1 : 0; LMouseMode(&win->w_layer, win->w_mouse); break; /* case 1005: UTF-8 mouse mode rejected */ case 1006: /* SGR mouse mode */ win->w_extmouse = i ? a1 : 0; LExtMouseMode(&win->w_layer, win->w_extmouse); break; /* case 1015: UXRVT mouse mode rejected */ case 2004: /* bracketed paste mode */ win->w_bracketed = i ? true : false; LBracketedPasteMode(&win->w_layer, win->w_bracketed); break; } } break; case '>': switch (c) { case 'c': /* secondary DA */ if (a1 == 0) Report(win, "\033[>%d;%d;0c", 83, nversion); /* 83 == 'S' */ break; } break; } } static void StringStart(Window *win, enum string_t type) { win->w_StringType = type; win->w_stringp = win->w_string; win->w_state = ASTR; } static void StringChar(Window *win, int c) { if (win->w_stringp >= win->w_string + MAXSTR - 1) win->w_state = LIT; else *(win->w_stringp)++ = c; } /* * Do string processing. Returns -1 if output should be suspended * until status is gone. */ static int StringEnd(Window *win) { Canvas *cv; char *p; int typ; char *t; /* There's two ways to terminate an OSC. If we've seen an ESC * then it's been ST otherwise it's BEL. */ t = win->w_state == STRESC ? "\033\\" : "\a"; win->w_state = LIT; *win->w_stringp = '\0'; switch (win->w_StringType) { case OSC: /* special xterm compatibility hack */ if (win->w_string[0] == ';' || (p = strchr(win->w_string, ';')) == NULL) break; typ = atoi(win->w_string); p++; if (typ == 83) { /* 83 = 'S' */ /* special execute commands sequence */ char *args[MAXARGS]; int argl[MAXARGS]; struct acluser *windowuser; windowuser = *FindUserPtr(":window:"); if (windowuser && Parse(p, ARRAY_SIZE(win->w_string) - (p - win->w_string), args, argl)) { for (display = displays; display; display = display->d_next) if (D_forecv->c_layer->l_bottom == &win->w_layer) break; /* found it */ if (display == NULL && win->w_layer.l_cvlist) display = win->w_layer.l_cvlist->c_display; if (display == NULL) display = displays; EffectiveAclUser = windowuser; fore = win; flayer = fore->w_savelayer ? fore->w_savelayer : &fore->w_layer; DoCommand(args, argl); EffectiveAclUser = NULL; fore = NULL; flayer = NULL; } break; } if (typ == 0 || typ == 1 || typ == 2 || typ == 11 || typ == 20 || typ == 39 || typ == 49) { int typ2; typ2 = typ / 10; if (strcmp(win->w_xtermosc[typ2], p)) { if (typ != 11 || strcmp("?", p)) { strncpy(win->w_xtermosc[typ2], p, ARRAY_SIZE(win->w_xtermosc[typ2]) - 1); win->w_xtermosc[typ2][ARRAY_SIZE(win->w_xtermosc[typ2]) - 1] = 0; } for (display = displays; display; display = display->d_next) { if (!D_CXT) continue; if (D_forecv->c_layer->l_bottom == &win->w_layer) SetXtermOSC(typ2, p, t); if ((typ2 == 3 || typ2 == 4) && D_xtermosc[typ2]) Redisplay(0); if (typ == 11 && !strcmp("?", p)) break; } } } if (typ != 0 && typ != 2) break; win->w_stringp -= p - win->w_string; if (win->w_stringp > win->w_string) memmove(win->w_string, p, win->w_stringp - win->w_string); *win->w_stringp = '\0'; /* FALLTHROUGH */ case APC: if (win->w_hstatus) { if (strcmp(win->w_hstatus, win->w_string) == 0) break; /* not changed */ free(win->w_hstatus); win->w_hstatus = NULL; } if (win->w_string != win->w_stringp) win->w_hstatus = SaveStr(win->w_string); WindowChanged(win, WINESC_HSTATUS); break; case PM: case GM: for (display = displays; display; display = display->d_next) { for (cv = D_cvlist; cv; cv = cv->c_next) if (cv->c_layer->l_bottom == &win->w_layer) break; if (cv || win->w_StringType == GM) MakeStatus(win->w_string); } return -1; case DCS: LAY_DISPLAYS(&win->w_layer, AddStr(win->w_string)); break; case AKA: if (win->w_title == win->w_akabuf && !*win->w_string) break; if (win->w_dynamicaka) ChangeAKA(win, win->w_string, strlen(win->w_string)); if (!*win->w_string) win->w_autoaka = win->w_y + 1; break; default: break; } return 0; } static void PrintStart(Window *win) { win->w_pdisplay = NULL; /* find us a nice display to print on, fore preferred */ display = win->w_lastdisp; if (!(display && win== D_fore && (printcmd || D_PO))) for (display = displays; display; display = display->d_next) if (win== D_fore && (printcmd || D_PO)) break; if (!display) { Canvas *cv; for (cv = win->w_layer.l_cvlist; cv; cv = cv->c_lnext) { display = cv->c_display; if (printcmd || D_PO) break; } if (!cv) { display = displays; if (!display || display->d_next || !(printcmd || D_PO)) return; } } win->w_pdisplay = display; win->w_stringp = win->w_string; win->w_state = PRIN; if (printcmd && win->w_pdisplay->d_printfd < 0) win->w_pdisplay->d_printfd = printpipe(win, printcmd); } static void PrintChar(Window *win, int c) { if (win->w_stringp >= win->w_string + MAXSTR - 1) PrintFlush(win); *(win->w_stringp)++ = c; } static void PrintFlush(Window *win) { display = win->w_pdisplay; if (display && printcmd) { char *bp = win->w_string; int len = win->w_stringp - win->w_string; int r; while (len && display->d_printfd >= 0) { r = write(display->d_printfd, bp, len); if (r <= 0) { WMsg(win, errno, "printing aborted"); close(display->d_printfd); display->d_printfd = -1; break; } bp += r; len -= r; } } else if (display && win->w_stringp > win->w_string) { AddCStr(D_PO); AddStrn(win->w_string, win->w_stringp - win->w_string); AddCStr(D_PF); Flush(3); } win->w_stringp = win->w_string; } void WNewAutoFlow(Window *win, int on) { if (win->w_flow & FLOW_AUTOFLAG) win->w_flow = FLOW_AUTOFLAG | (FLOW_AUTO | FLOW_ON) * on; else win->w_flow = (win->w_flow & ~FLOW_AUTO) | FLOW_AUTO * on; LSetFlow(&win->w_layer, win->w_flow & FLOW_ON); } static void DesignateCharset(Window *win, int c, int n) { win->w_ss = 0; if (c == ('@' & 037)) /* map JIS 6226 to 0208 */ c = KANJI; if (c == 'B') c = ASCII; if (win->w_charsets[n] != c) { win->w_charsets[n] = c; if (win->w_Charset == n) { win->w_FontL = c; win->w_rend.font = win->w_FontL; LSetRendition(&win->w_layer, &win->w_rend); } if (win->w_CharsetR == n) win->w_FontR = c; } } static void MapCharset(Window *win, int n) { win->w_ss = 0; if (win->w_Charset != n) { win->w_Charset = n; win->w_FontL = win->w_charsets[n]; win->w_rend.font = win->w_FontL; LSetRendition(&win->w_layer, &win->w_rend); } } static void MapCharsetR(Window *win, int n) { win->w_ss = 0; if (win->w_CharsetR != n) { win->w_CharsetR = n; win->w_FontR = win->w_charsets[n]; } win->w_gr = 1; } static void SaveCursor(Window *win, struct cursor *cursor) { cursor->on = 1; cursor->x = win->w_x; cursor->y = win->w_y; cursor->Rend = win->w_rend; cursor->Charset = win->w_Charset; cursor->CharsetR = win->w_CharsetR; memmove((char *)cursor->Charsets, (char *)win->w_charsets, 4 * sizeof(int)); } static void RestoreCursor(Window *win, struct cursor *cursor) { if (!cursor->on) return; LGotoPos(&win->w_layer, cursor->x, cursor->y); win->w_x = cursor->x; win->w_y = cursor->y; win->w_rend = cursor->Rend; memmove((char *)win->w_charsets, (char *)cursor->Charsets, 4 * sizeof(int)); win->w_Charset = cursor->Charset; win->w_CharsetR = cursor->CharsetR; win->w_ss = 0; win->w_FontL = win->w_charsets[win->w_Charset]; win->w_FontR = win->w_charsets[win->w_CharsetR]; LSetRendition(&win->w_layer, &win->w_rend); } static void BackSpace(Window *win) { if (win->w_x > 0) { win->w_x--; } else if (win->w_wrap && win->w_y > 0) { win->w_x = win->w_width - 1; win->w_y--; } LGotoPos(&win->w_layer, win->w_x, win->w_y); } static void Return(Window *win) { if (win->w_x == 0) return; win->w_x = 0; LGotoPos(&win->w_layer, win->w_x, win->w_y); } static void LineFeed(Window *win, int out_mode) { /* out_mode: 0=lf, 1=cr+lf */ if (out_mode) win->w_x = 0; if (win->w_y != win->w_bot) { /* Don't scroll */ if (win->w_y < win->w_height - 1) win->w_y++; LGotoPos(&win->w_layer, win->w_x, win->w_y); return; } if (win->w_autoaka > 1) win->w_autoaka--; MScrollV(win, 1, win->w_top, win->w_bot, win->w_rend.colorbg); LScrollV(&win->w_layer, 1, win->w_top, win->w_bot, win->w_rend.colorbg); LGotoPos(&win->w_layer, win->w_x, win->w_y); } static void ReverseLineFeed(Window *win) { if (win->w_y == win->w_top) { MScrollV(win, -1, win->w_top, win->w_bot, win->w_rend.colorbg); LScrollV(&win->w_layer, -1, win->w_top, win->w_bot, win->w_rend.colorbg); LGotoPos(&win->w_layer, win->w_x, win->w_y); } else if (win->w_y > 0) CursorUp(win, 1); } static void InsertChar(Window *win, int n) { int y = win->w_y, x = win->w_x; if (n <= 0) return; if (x == win->w_width) x--; save_mline(&win->w_mlines[y], win->w_width); MScrollH(win, -n, y, x, win->w_width - 1, win->w_rend.colorbg); LScrollH(&win->w_layer, -n, y, x, win->w_width - 1, win->w_rend.colorbg, &mline_old); LGotoPos(&win->w_layer, x, y); } static void DeleteChar(Window *win, int n) { int y = win->w_y, x = win->w_x; if (x == win->w_width) x--; save_mline(&win->w_mlines[y], win->w_width); MScrollH(win, n, y, x, win->w_width - 1, win->w_rend.colorbg); LScrollH(&win->w_layer, n, y, x, win->w_width - 1, win->w_rend.colorbg, &mline_old); LGotoPos(&win->w_layer, x, y); } static void DeleteLine(Window *win, int n) { if (win->w_y < win->w_top || win->w_y > win->w_bot) return; if (n > win->w_bot - win->w_y + 1) n = win->w_bot - win->w_y + 1; MScrollV(win, n, win->w_y, win->w_bot, win->w_rend.colorbg); LScrollV(&win->w_layer, n, win->w_y, win->w_bot, win->w_rend.colorbg); LGotoPos(&win->w_layer, win->w_x, win->w_y); } static void InsertLine(Window *win, int n) { if (win->w_y < win->w_top || win->w_y > win->w_bot) return; if (n > win->w_bot - win->w_y + 1) n = win->w_bot - win->w_y + 1; MScrollV(win, -n, win->w_y, win->w_bot, win->w_rend.colorbg); LScrollV(&win->w_layer, -n, win->w_y, win->w_bot, win->w_rend.colorbg); LGotoPos(&win->w_layer, win->w_x, win->w_y); } static void ScrollRegion(Window *win, int n) { MScrollV(win, n, win->w_top, win->w_bot, win->w_rend.colorbg); LScrollV(&win->w_layer, n, win->w_top, win->w_bot, win->w_rend.colorbg); LGotoPos(&win->w_layer, win->w_x, win->w_y); } static void ForwardTab(Window *win) { int x = win->w_x; if (x == win->w_width) { LineFeed(win, 1); x = 0; } if (win->w_tabs[x] && x < win->w_width - 1) x++; while (x < win->w_width - 1 && !win->w_tabs[x]) x++; win->w_x = x; LGotoPos(&win->w_layer, win->w_x, win->w_y); } static void BackwardTab(Window *win) { int x = win->w_x; if (win->w_tabs[x] && x > 0) x--; while (x > 0 && !win->w_tabs[x]) x--; win->w_x = x; LGotoPos(&win->w_layer, win->w_x, win->w_y); } static void ClearScreen(Window *win) { LClearArea(&win->w_layer, 0, 0, win->w_width - 1, win->w_height - 1, win->w_rend.colorbg, 1); MScrollV(win, win->w_height, 0, win->w_height - 1, win->w_rend.colorbg); } static void ClearFromBOS(Window *win) { int y = win->w_y, x = win->w_x; LClearArea(&win->w_layer, 0, 0, x, y, win->w_rend.colorbg, 1); MClearArea(win, 0, 0, x, y, win->w_rend.colorbg); RestorePosRendition(win); } static void ClearToEOS(Window *win) { int y = win->w_y, x = win->w_x; if (x == 0 && y == 0) { ClearScreen(win); RestorePosRendition(win); return; } LClearArea(&win->w_layer, x, y, win->w_width - 1, win->w_height - 1, win->w_rend.colorbg, 1); MClearArea(win, x, y, win->w_width - 1, win->w_height - 1, win->w_rend.colorbg); RestorePosRendition(win); } static void ClearLineRegion(Window *win, int from, int to) { int y = win->w_y; LClearArea(&win->w_layer, from, y, to, y, win->w_rend.colorbg, 1); MClearArea(win, from, y, to, y, win->w_rend.colorbg); RestorePosRendition(win); } static void CursorRight(Window *win, int n) { int x = win->w_x; if (x == win->w_width) LineFeed(win, 1); if ((win->w_x += n) >= win->w_width) win->w_x = win->w_width - 1; LGotoPos(&win->w_layer, win->w_x, win->w_y); } static void CursorUp(Window *win, int n) { if (win->w_y < win->w_top) { /* if above scrolling rgn, */ if ((win->w_y -= n) < 0) /* ignore its limits */ win->w_y = 0; } else if ((win->w_y -= n) < win->w_top) win->w_y = win->w_top; LGotoPos(&win->w_layer, win->w_x, win->w_y); } static void CursorDown(Window *win, int n) { if (win->w_y > win->w_bot) { /* if below scrolling rgn, */ if ((win->w_y += n) > win->w_height - 1) /* ignore its limits */ win->w_y = win->w_height - 1; } else if ((win->w_y += n) > win->w_bot) win->w_y = win->w_bot; LGotoPos(&win->w_layer, win->w_x, win->w_y); } static void CursorLeft(Window *win, int n) { if ((win->w_x -= n) < 0) win->w_x = 0; LGotoPos(&win->w_layer, win->w_x, win->w_y); } static void ASetMode(Window *win, bool on) { for (int i = 0; i < win->w_NumArgs; ++i) { switch (win->w_args[i]) { /* case 2: KAM: Lock keyboard */ case 4: /* IRM: Insert mode */ win->w_insert = on; LAY_DISPLAYS(&win->w_layer, InsertMode(on)); break; /* case 12: SRM: Echo mode on */ case 20: /* LNM: Linefeed mode */ win->w_autolf = on; break; case 34: win->w_curvvis = !on; LCursorVisibility(&win->w_layer, win->w_curinv ? -1 : win->w_curvvis); break; default: break; } } } static char rendlist[] = { ~((1 << NATTR) - 1), A_BD, A_DI, A_IT, A_US, A_BL, 0, A_RV, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ~(A_BD | A_DI), ~A_IT, ~A_US, ~A_BL, 0, ~A_RV }; static void SelectRendition(Window *win) { int j, i = 0; int attr = win->w_rend.attr; int colorbg = win->w_rend.colorbg; int colorfg = win->w_rend.colorfg; do { j = win->w_args[i]; /* indexed colour space aka 256 colours; example escape \e[48;2;12m */ if ((j == 38 || j == 48) && i + 2 < win->w_NumArgs && win->w_args[i + 1] == 5) { int jj; i += 2; jj = win->w_args[i]; if (jj < 0 || jj > 255) continue; if (j == 38) { colorfg = jj | 0x02000000; } else { colorbg = jj | 0x02000000; } continue; } /* truecolor (24bit) colour space; example escape \e[48;5;12;13;14m * where 12;13;14 are rgb values */ if ((j == 38 || j == 48) && i + 4 < win->w_NumArgs && win->w_args[i + 1] == 2) { uint8_t r, g, b; r = win->w_args[i + 2]; g = win->w_args[i + 3]; b = win->w_args[i + 4]; if (j == 38) { colorfg = 0x04000000 | (r << 16) | (g << 8) | b; } else { colorbg = 0x04000000 | (r << 16) | (g << 8) | b; } i += 4; continue; } if (j >= 90 && j <= 97) colorfg = (j - 90 + 8) | 0x01000000; if (j >= 100 && j <= 107) colorbg = (j - 100 + 8) | 0x01000000; if (j >= 30 && j < 38) colorfg = (j - 30) | 0x01000000; if (j >= 40 && j < 48) colorbg = (j - 40) | 0x01000000; if (j == 39) colorfg = 0; if (j == 49) colorbg = 0; if (j == 0) { attr = 0; /* will be xored to 0 */ colorbg = 0; colorfg = 0; } if (j < 0 || j >= (int)(ARRAY_SIZE(rendlist))) continue; j = rendlist[j]; if (j & (1 << NATTR)) attr &= j; else attr |= j; } while (++i < win->w_NumArgs); win->w_rend.attr = attr; win->w_rend.colorbg = colorbg; win->w_rend.colorfg = colorfg; LSetRendition(&win->w_layer, &win->w_rend); } static void FillWithEs(Window *win) { uint32_t *p, *ep; LClearAll(&win->w_layer, 1); win->w_y = win->w_x = 0; for (int i = 0; i < win->w_height; ++i) { clear_mline(&win->w_mlines[i], 0, win->w_width + 1); p = win->w_mlines[i].image; ep = p + win->w_width; while (p < ep) *p++ = 'E'; } LRefreshAll(&win->w_layer, 1); } /* * Ugly autoaka hack support: * ChangeAKA() sets a new aka * FindAKA() searches for an autoaka match */ void ChangeAKA(Window *win, char *s, size_t len) { int i, c; for (i = 0; len > 0; len--) { if (win->w_akachange + i == win->w_akabuf + ARRAY_SIZE(win->w_akabuf) - 1) break; c = (unsigned char)*s++; if (c == 0) break; if (c < 32 || c == 127 || (c >= 128 && c < 160 && win->w_c1)) continue; win->w_akachange[i++] = c; } win->w_akachange[i] = 0; win->w_title = win->w_akachange; if (win->w_akachange != win->w_akabuf) if (win->w_akachange[0] == 0 || win->w_akachange[-1] == ':') win->w_title = win->w_akabuf + strlen(win->w_akabuf) + 1; WindowChanged(win, WINESC_WIN_TITLE); WindowChanged(NULL, WINESC_WIN_NAMES); WindowChanged(NULL, WINESC_WIN_NAMES_NOCUR); } static void FindAKA(Window *win) { uint32_t *cp, *line; int len = strlen(win->w_akabuf); int y; y = (win->w_autoaka > 0 && win->w_autoaka <= win->w_height) ? win->w_autoaka - 1 : win->w_y; try_line: cp = line = win->w_mlines[y].image; if (win->w_autoaka > 0 && *win->w_akabuf != '\0') { for (;;) { if (cp - line >= win->w_width - len) { if (++y == win->w_autoaka && y < win->w_height) goto try_line; return; } if (strncmp((char *)cp, win->w_akabuf, len) == 0) break; cp++; } cp += len; } for (len = win->w_width - (cp - line); len && *cp == ' '; len--, cp++) ; if (len) { if (win->w_autoaka > 0 && (*cp == '!' || *cp == '%' || *cp == '^')) win->w_autoaka = -1; else win->w_autoaka = 0; line = cp; while (len && *cp != ' ') { if (*cp++ == '/') line = cp; len--; } ChangeAKA(win, (char *)line, cp - line); } else win->w_autoaka = 0; } static void RestorePosRendition(Window *win) { LGotoPos(&win->w_layer, win->w_x, win->w_y); LSetRendition(&win->w_layer, &win->w_rend); } /* Send a terminal report as if it were typed. */ static void Report(Window *win, char *fmt, int n1, int n2) { int len; char rbuf[40]; /* enough room for all replies */ sprintf(rbuf, fmt, n1, n2); len = strlen(rbuf); if (W_UWP(win)) { if ((unsigned)(win->w_pwin->p_inlen + len) <= ARRAY_SIZE(win->w_pwin->p_inbuf)) { memmove(win->w_pwin->p_inbuf + win->w_pwin->p_inlen, rbuf, len); win->w_pwin->p_inlen += len; } } else { if ((unsigned)(win->w_inlen + len) <= ARRAY_SIZE(win->w_inbuf)) { memmove(win->w_inbuf + win->w_inlen, rbuf, len); win->w_inlen += len; } } } /* *====================================================================* *====================================================================* */ /********************************************************************** * * Memory subsystem. * */ static void MFixLine(Window *win, int y, struct mchar *mc) { struct mline *ml = &win->w_mlines[y]; if (mc->attr && ml->attr == null) { if ((ml->attr = calloc(win->w_width + 1, 4)) == NULL) { ml->attr = null; mc->attr = win->w_rend.attr = 0; WMsg(win, 0, "Warning: no space for attr - turned off"); } } if (mc->font && ml->font == null) { if ((ml->font = calloc(win->w_width + 1, 4)) == NULL) { ml->font = null; win->w_FontL = win->w_charsets[win->w_ss ? win->w_ss : win->w_Charset] = 0; win->w_FontR = win->w_charsets[win->w_ss ? win->w_ss : win->w_CharsetR] = 0; mc->font = win->w_rend.font = 0; WMsg(win, 0, "Warning: no space for font - turned off"); } } if (mc->colorbg && ml->colorbg == null) { if ((ml->colorbg = calloc(win->w_width + 1, 4)) == NULL) { ml->colorbg = null; mc->colorbg = win->w_rend.colorbg = 0; WMsg(win, 0, "Warning: no space for color background - turned off"); } } if (mc->colorfg && ml->colorfg == null) { if ((ml->colorfg = calloc(win->w_width + 1, 4)) == NULL) { ml->colorfg = null; mc->colorfg = win->w_rend.colorfg = 0; WMsg(win, 0, "Warning: no space for color foreground - turned off"); } } } /*****************************************************************/ #define MKillDwRight(p, ml, x) \ if (dw_right(ml, x, p->w_encoding)) \ { \ if (x > 0) \ copy_mchar2mline(&mchar_blank, ml, x - 1); \ copy_mchar2mline(&mchar_blank, ml, x); \ } #define MKillDwLeft(p, ml, x) \ if (dw_left(ml, x, p->w_encoding)) \ { \ copy_mchar2mline(&mchar_blank, ml, x); \ copy_mchar2mline(&mchar_blank, ml, x + 1); \ } static void MScrollH(Window *win, int n, int y, int xs, int xe, int bce) { struct mline *ml; if (n == 0) return; ml = &win->w_mlines[y]; MKillDwRight(win, ml, xs); MKillDwLeft(win, ml, xe); if (n > 0) { if (xe - xs + 1 > n) { MKillDwRight(win, ml, xs + n); copy_mline(ml, xs + n, xs, xe + 1 - xs - n); } else n = xe - xs + 1; clear_mline(ml, xe + 1 - n, n); if (bce) MBceLine(win, y, xe + 1 - n, n, bce); } else { n = -n; if (xe - xs + 1 > n) { MKillDwLeft(win, ml, xe - n); copy_mline(ml, xs, xs + n, xe + 1 - xs - n); } else n = xe - xs + 1; clear_mline(ml, xs, n); if (bce) MBceLine(win, y, xs, n, bce); } } static void MScrollV(Window *win, int n, int ys, int ye, int bce) { int cnt1, cnt2; struct mline tmp[256]; struct mline *ml; if (n == 0) return; if (n > 0) { if (ye - ys + 1 < n) n = ye - ys + 1; if (n > 256) { MScrollV(win, n - 256, ys, ye, bce); n = 256; } if (compacthist) { ye = MFindUsedLine(win, ye, ys); if (ye - ys + 1 < n) n = ye - ys + 1; if (n <= 0) return; } /* Clear lines */ ml = win->w_mlines + ys; for (int i = ys; i < ys + n; i++, ml++) { if (ys == win->w_top) WAddLineToHist(win, ml); if (ml->attr != null) free(ml->attr); ml->attr = null; if (ml->font != null) free(ml->font); ml->font = null; if (ml->colorbg != null) free(ml->colorbg); ml->colorbg = null; if (ml->colorfg != null) free(ml->colorfg); ml->colorfg = null; memmove(ml->image, blank, (win->w_width + 1) * 4); if (bce) MBceLine(win, i, 0, win->w_width, bce); } /* switch 'em over */ cnt1 = n * sizeof(struct mline); cnt2 = (ye - ys + 1 - n) * sizeof(struct mline); if (cnt1 && cnt2) Scroll((char *)(win->w_mlines + ys), cnt1, cnt2, (char *)tmp); } else { n = -n; if (ye - ys + 1 < n) n = ye - ys + 1; if (n > 256) { MScrollV(win, - (n - 256), ys, ye, bce); n = 256; } ml = win->w_mlines + ye; /* Clear lines */ for (int i = ye; i > ye - n; i--, ml--) { if (ml->attr != null) free(ml->attr); ml->attr = null; if (ml->font != null) free(ml->font); ml->font = null; if (ml->colorbg != null) free(ml->colorbg); ml->colorbg = null; if (ml->colorfg != null) free(ml->colorfg); ml->colorfg = null; memmove(ml->image, blank, (win->w_width + 1) * 4); if (bce) MBceLine(win, i, 0, win->w_width, bce); } cnt1 = n * sizeof(struct mline); cnt2 = (ye - ys + 1 - n) * sizeof(struct mline); if (cnt1 && cnt2) Scroll((char *)(win->w_mlines + ys), cnt2, cnt1, (char *)tmp); } } static void Scroll(char *cp, int cnt1, int cnt2, char *tmp) { if (!cnt1 || !cnt2) return; if (cnt1 <= cnt2) { memmove(tmp, cp, cnt1); memmove(cp, cp + cnt1, cnt2); memmove(cp + cnt2, tmp, cnt1); } else { memmove(tmp, cp + cnt1, cnt2); memmove(cp + cnt2, cp, cnt1); memmove(cp, tmp, cnt2); } } static void MClearArea(Window *win, int xs, int ys, int xe, int ye, int bce) { int n; int xxe; struct mline *ml; /* Check for zero-height window */ if (ys < 0 || ye < ys) return; /* check for magic margin condition */ if (xs >= win->w_width) xs = win->w_width - 1; if (xe >= win->w_width) xe = win->w_width - 1; MKillDwRight(win, win->w_mlines + ys, xs); MKillDwLeft(win, win->w_mlines + ye, xe); ml = win->w_mlines + ys; for (int y = ys; y <= ye; y++, ml++) { xxe = (y == ye) ? xe : win->w_width - 1; n = xxe - xs + 1; if (n > 0) clear_mline(ml, xs, n); if (n > 0 && bce) MBceLine(win, y, xs, xs + n - 1, bce); xs = 0; } } static void MInsChar(Window *win, struct mchar *c, int x, int y) { int n; struct mline *ml; MFixLine(win, y, c); ml = win->w_mlines + y; n = win->w_width - x - 1; MKillDwRight(win, ml, x); if (n > 0) { MKillDwRight(win, ml, win->w_width - 1); copy_mline(ml, x, x + 1, n); } copy_mchar2mline(c, ml, x); if (c->mbcs) { if (--n > 0) { MKillDwRight(win, ml, win->w_width - 1); copy_mline(ml, x + 1, x + 2, n); } copy_mchar2mline(c, ml, x + 1); ml->image[x + 1] = c->mbcs; if (win->w_encoding != UTF8) ml->font[x + 1] |= 0x80; else if (win->w_encoding == UTF8 && c->mbcs) { ml->font[x + 1] = c->mbcs; } } } static void MPutChar(Window *win, struct mchar *c, int x, int y) { struct mline *ml; MFixLine(win, y, c); ml = &win->w_mlines[y]; MKillDwRight(win, ml, x); MKillDwLeft(win, ml, x); copy_mchar2mline(c, ml, x); if (c->mbcs) { MKillDwLeft(win, ml, x + 1); copy_mchar2mline(c, ml, x + 1); ml->image[x + 1] = c->mbcs; if (win->w_encoding != UTF8) ml->font[x + 1] |= 0x80; else if (win->w_encoding == UTF8 && c->mbcs) { ml->font[x + 1] = c->mbcs; } } } static void MWrapChar(Window *win, struct mchar *c, int y, int top, int bot, bool ins) { struct mline *ml; int bce; bce = c->colorbg; MFixLine(win, y, c); ml = &win->w_mlines[y]; copy_mchar2mline(&mchar_null, ml, win->w_width); if (y == bot) MScrollV(win, 1, top, bot, bce); else if (y < win->w_height - 1) y++; if (ins) MInsChar(win, c, 0, y); else MPutChar(win, c, 0, y); } static void MBceLine(Window *win, int y, int xs, int xe, int bce) { struct mchar mc; struct mline *ml; mc = mchar_null; mc.colorbg = bce; MFixLine(win, y, &mc); ml = win->w_mlines + y; if (mc.attr) for (int x = xs; x <= xe; x++) ml->attr[x] = mc.attr; if (mc.colorbg) for (int x = xs; x <= xe; x++) ml->colorbg[x] = mc.colorbg; if (mc.colorfg) for (int x = xs; x <= xe; x++) ml->colorfg[x] = mc.colorfg; } static void WAddLineToHist(Window *win, struct mline *ml) { uint32_t *q, *o; struct mline *hml; if (win->w_histheight == 0) return; hml = &win->w_hlines[win->w_histidx]; q = ml->image; ml->image = hml->image; hml->image = q; q = ml->attr; o = hml->attr; hml->attr = q; ml->attr = null; if (o != null) free(o); q = ml->font; o = hml->font; hml->font = q; ml->font = null; if (o != null) free(o); q = ml->colorbg; o = hml->colorbg; hml->colorbg = q; ml->colorbg = null; if (o != null) free(o); q = ml->colorfg; o = hml->colorfg; hml->colorfg = q; ml->colorfg = null; if (o != null) free(o); if (++win->w_histidx >= win->w_histheight) win->w_histidx = 0; if (win->w_scrollback_height < win->w_histheight) ++win->w_scrollback_height; } int MFindUsedLine(Window *win, int ye, int ys) { int y; struct mline *ml = win->w_mlines + ye; for (y = ye; y >= ys; y--, ml--) { if (memcmp(ml->image, blank, win->w_width * 4)) break; if (ml->attr != null && memcmp(ml->attr, null, win->w_width * 4)) break; if (ml->colorbg != null && memcmp(ml->colorbg, null, win->w_width * 4)) break; if (ml->colorfg != null && memcmp(ml->colorfg, null, win->w_width * 4)) break; if (win->w_encoding == UTF8) { if (ml->font != null && memcmp(ml->font, null, win->w_width)) break; } } return y; } /* *====================================================================* *====================================================================* */ /* * Tricky: send only one bell even if the window is displayed * more than once. */ void WBell(Window *win, bool visual) { Canvas *cv; if (displays == NULL) win->w_bell = BELL_DONE; for (display = displays; display; display = display->d_next) { for (cv = D_cvlist; cv; cv = cv->c_next) if (cv->c_layer->l_bottom == &win->w_layer) break; if (cv && !visual) AddCStr(D_BL); else if (cv && D_VB) AddCStr(D_VB); else win->w_bell = visual ? BELL_VISUAL : BELL_FOUND; } } /* * This should be reverse video. * Only change video if window is fore. * Because it is used in some termcaps to emulate * a visual bell we do this hack here. * (screen uses \Eg as special vbell sequence) */ static void WReverseVideo(Window *win, bool on) { for (Canvas *cv = win->w_layer.l_cvlist; cv; cv = cv->c_lnext) { display = cv->c_display; if (cv != D_forecv) continue; ReverseVideo(on); if (!on && win->w_revvid && !D_CVR) { if (D_VB) AddCStr(D_VB); else win->w_bell = BELL_VISUAL; } } } void WMsg(Window *win, int err, char *str) { Layer *oldflayer = flayer; flayer = &win->w_layer; LMsg(err, "%s", str); flayer = oldflayer; } static void WChangeSize(Window *win, int w, int h) { int wok = 0; Canvas *cv; if (win->w_layer.l_cvlist == NULL) { /* window not displayed -> works always */ ChangeWindowSize(win, w, h, win->w_histheight); return; } for (cv = win->w_layer.l_cvlist; cv; cv = cv->c_lnext) { display = cv->c_display; if (win != D_fore) continue; /* change only fore */ if (D_CWS) break; if (D_CZ0 && (w == Z0width || w == Z1width)) wok = 1; } if (cv == NULL && wok == 0) /* can't change any display */ return; if (!D_CWS) h = win->w_height; ChangeWindowSize(win, w, h, win->w_histheight); for (display = displays; display; display = display->d_next) { if (win == D_fore) { if (D_cvlist && D_cvlist->c_next == NULL) ResizeDisplay(w, h); else ResizeDisplay(w, D_height); ResizeLayersToCanvases(); /* XXX Hmm ? */ continue; } for (cv = D_cvlist; cv; cv = cv->c_next) if (cv->c_layer->l_bottom == &win->w_layer) break; if (cv) Redisplay(0); } } screen-5.0.1/misc.c0000664000175000017500000001106215011404317012535 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.1/screen.c0000664000175000017500000014331415011404317013067 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 accross 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 (access(SocketPath, F_OK)) { if (mkdir(SocketPath, 0700) == -1 && errno != EEXIST) Panic(errno, "Cannot make directory '%s'", SocketPath); (void)chown(SocketPath, real_uid, real_gid); } } #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.1/TODO0000664000175000017500000000035715011404317012133 0ustar alexalex- display size adaption (Activate) - process.c cleanup via comm splitting - writelocks? - partial? - type into several windows at once (for cluster admins) - configurable digraph table - command line options should overwrite config files. screen-5.0.1/input.h0000664000175000017500000000035715011404317012753 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.1/list_generic.h0000664000175000017500000000531015011404317014255 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.1/FAQ0000777000175000017500000000000015011405544013065 2doc/FAQustar alexalexscreen-5.0.1/process.c0000664000175000017500000051213615011404317013270 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(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 adress 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(-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 'supress 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(-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) { int rend = -1; 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 != -1) 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 != -1) 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(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; Msg(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.1/mark.h0000664000175000017500000000547415011404317012553 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.1/dumptermcap.h0000664000175000017500000000017715011404317014135 0ustar alexalex#ifndef SCREEN_DUMPTERMCAP_H #define SCREEN_DUMPTERMCAP_H void DumpTermcap (int, FILE *); #endif /* SCREEN_DUMPTERMCAP_H */ screen-5.0.1/.iscreenrc0000664000175000017500000001516615011404317013425 0ustar alexalex# # A sample .screenrc which I use for everyday work. # # some of the commands commented out here, have been moved to # /local/etc/screenrc # # we want no password, right? #password # This will ask us for a password. password none # Same as not even mentioning it. #password 12Bz/9hNlPLZk # "1234" #password YahtrWblnJw # ypmatch jnweiger passwd. Well, ... :-) scrollback 200 # we have a 200 lines history buffer markkeys "@=\177:@=^C" # our mad facit-twist terminal buffer overflow... markkeys "h=^B:l=^F:\$=^E" # some missing emacs style bindings in copymode echo -n "booting screen" # let it flash, not horn! #vbell on # "vbell" don't work any longer, sorry. #vbell_msg " Wuff, Wuff!! " # this is the default message #bell "Bimmmel No. %" # sounds the bell and shows a message # we want to login all windows we create. #login on # "login", "nologin" don't work any longer, sorry 2. echo -n "." # we have no termcap entry for screen on the target machine? Well then # we tell a lie. term screen # would be the obvious default here. #term vt100 # screen will understand vt100 for 99%. # we want to survive hangups # note that the default setting is off now! autodetach on # when we open a window, where shall its CWD be? chdir # without argument it's my $HOME echo -n "." # I hate nonexisting status lines! Force screen to believe me. #hardstatus off # now some Terminal setup: # Printing in the leftmost column is not save. We express that fact as :LP@: # # Emacs tends to smear it's highlighted status bar across the screen, producing # ugly areas of bright background, if termcap is'nt perfectly sober. # Give a little :ms@: in the termcap, this may help. # # And who invented the initialisation for facit terminals? We tell him that # we non't like smooth scroll, by specifying :ti=\E[?l:. # \E[?3l 80 Zeichen # \E[?3h 132 Zeichen # LP Last column Printable # \E[A cursor up # \E[B cursor down # \E[?4h smooth scroll # \E[?4l jump scroll # \E[%dL insert %d lines # \E[K clear to end of line # cs \E[%i%d;%dr for twist and xterm # ms@ Move in Standout mode is NOT save. # WS our private variable, it declares that the terminal can # be resized by an escape-sequence # The termcap statement takes 2 or three parameters. First parameter lists # which TERMCAPs are affected by this statement. Second we specify changes # in screen's view of that terminals. Third we may specify some capabilities # that user-programs want to see in the $TERMCAP environment variable or in # screen's termcap entry. termcap vt* cl=\E[H\E[J\E[?1h:vi=\E[?35h:ve=\E[35l:ti=\E[?4l[vt100] termcap facit ti=\E[?4l[facit] termcap xterm* is=\E[r\E[m\E[2J\E[H\E[?7h\E[?1;4;6l:Z0=\E[?3h:Z1=\E[?3l echo -n "." # "\E(B", "\E(0", "\E(1", "\E(2", ... to switch between charsets. # screen internally emulates G1: "\E)..", G2: "\E*..", G3: "\E+.." # you can switch between them, with: # # code | switch to # ------+------ # ^O | G0 # ^N | G1 # \En | G2 # \Eo | G3 #termcap facit|vt100|xterm* G0 # how do we resize windows? under sunview, this is standard, but xterm # needs to be a specially hacked xterm, to make this work. termcap xterm* WS=\E[8;%d;%dt # ICL 6402 testing: termcap icl* G0:S0=\E$[start]:E0=\E%[end]:C0=j9kx5 GS=\E(0^O:GE=\E(B^O:G1=k:G2=l:G3=m:G4=j:GV=x:GH=q:GR=u:GL=t:GU=w:GD=v:GC=n # Flowcontrol produces trouble. ^S und ^Q will never reach screen, as our # terminals catch them locally. Who can explain that to me?: #flow on|off|auto [interrupt] # Long Lines get wrapped around (the back of your terminal). This is the # default for vt100. But now programs make different asumptions about your # terminal. You may find two linefeeds where you'd expect one, or you may # be confronted with a truncated line. Currently there is no fix, but pressing # C-A r and doing a redraw. #wrap on # the autoaka allows you to see the currently executing shell command in the # window name field. To use that, your shell prompt must contain ^[k^[\ or # you will see the string "(init)" as a name. # in my .cshrc I may use this for a wonderfull tcsh-prompt: # set prompt="%{^[k^[\\%}%h %c2(%m)%# " # # defining a shellaka that contains a pipe-symbol (|) activites the # autoaka feature. To the left of that | you specify a constant part of # your prompt as a trigger, to the right you may place a default string # as in shellaka '> |tc' # but beware! specifying a window name with the -t option has priority over # the autoaka mechanism. Although specifying -t "> |foo" will work. # shellaka tc # ... now a little bit of key bindings # In case we don't have write permission for /etc/utmp (no s-bit) # we create even local windows via rlogin. -> Et voila: a utmp-slot # utmp-slots are strongly recomended to keep sccs and talk happy. # (thus we have ^A# or. ^Ac for windowcreation with or without utmp-slot.) # but if we run suid-root, we produce all the rlogins with -ln, # as nobody shall refer to these pty's. bind '!' screen -ln -k faui41 rlogin faui41 bind '@' screen -ln -k vme2 rlogin faui4_vme2 #bind '#' screen -k faui43 bind '#' screen -ln -k faui43 rlogin faui43 bind '$' screen -ln -k faui44 rlogin faui44 bind '%' screen -ln -k faui45 rlogin faui45 bind '\^' screen -ln -k sup1 rlogin fausup1 bind '&' screen -ln -k sup2 rlogin fausup2 bind '*' screen -ln -k faui48 rlogin faui48 bind '(' screen -ln -k faui09 rlogin faui09 bind ')' screen -ln -k faui10 rlogin faui10 bind 'J' screen -ln -k 4j rlogin faui4j bind 'P' screen -ln -k 4p rlogin faui4p bind '^C' screen -ln -k 45c rlogin faui45c bind '^D' screen -ln -k 45d rlogin faui45d bind '^E' screen -ln -k 45e rlogin faui45e bind '^I' screen -ln -k 45i rlogin faui45i # these two are logIn and logOut. As a toggle is too stupid. #bind 'I' set login on #bind 'O' set login off bind 'L' # What happens, when you 'think emacs' and want to erase a whole # line? You type ^A^K right? Under screen it should be ^Aa^K. But... # killing the window would be a real punishment for a little mistyping. bind k #wow! I even amange to type ^Ak by accident. #bind ^k #bind K kill echo -n "." #screen 1:faui43 # My good old : syntax #screen -k faui43 # The way Wayne Davison thinks about it. #screen -ln -k faui43 # this one not logged in. #screen -ln 2:faui09 rlogin faui09 -l jnweiger # Finally another bonus feature for people using strange terminal settings like # different baud rate, etc. The next user will get standard settings # as ^[c is a reset sequence. #pow_detach_msg "" # is the default pow_detach_msg "c" echo "done." screen-5.0.1/window.h0000664000175000017500000002645515011404317013132 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 */ size_t 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]; size_t w_inlen; char w_outbuf[IOSIZE]; size_t 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 statis */ 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.1/process.h0000664000175000017500000000300415011404317013262 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 (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.1/NEWS.3.70000664000175000017500000000270115011404317012443 0ustar alexalex ---------------------------- What's new in screen-3.7 ? ---------------------------- * Color support. Screen understands the following capabilities: AF (setaf) = Set foreground color (ANSI compatible) AB (setab) = Set background color (ANSI compatible) AX = Does understand ANSI set default fg/bg color (\E[39m / \E[49m) The tweaks for the color xterm would be: termcap xterm 'AF=\E[3%dm:AB=\E[4%dm' terminfo xterm 'AF=\E[3%p1%dm:AB=\E[4%p1%dm' * New 'digraph' command (bound to ^A^V) ^A^Va" or ^A^V0344 input an a-umlaut * activity/bell message strings can now include the window title: %t - title %n - number (a single % still works) * 'defhstatus' command to give every window a default hardstatus line. ^E is used as a string escape instead of % (see above). Try 'defhstatus "Screen: window ^E (^Et)"' * Input parser changed to understand '^' (see ^E above). Note that the linux color xterm has a stupid bug: the characters get the color of the cursor, therefore if you change color and move the cursor around all the characters will get the new color... Here is a patch: pub/utilities/screen/color_xterm_patch Btw.: rxvt works fine. * Optional Braille support. If you can read Braille and have one of the devices listed in README.DOTSCREEN, please compile with -DHAVE_BRAILLE and let us know if this feature is useful. screen-5.0.1/resize.c0000664000175000017500000004660315011404317013114 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.1/autogen.sh0000775000175000017500000000007215011404317013436 0ustar alexalex#!/bin/sh exec autoreconf --install rm -rf autom4te.cache screen-5.0.1/misc.h0000664000175000017500000000136615011404317012550 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.1/canvas.c0000664000175000017500000004372615011404317013071 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 "canvas.h" #include "screen.h" #include "help.h" #include "list_generic.h" #include "resize.h" #include "winmsg.h" static void CanvasInitBlank(Canvas *cv) { cv->c_blank.l_cvlist = cv; cv->c_blank.l_width = cv->c_xe - cv->c_xs + 1; cv->c_blank.l_height = cv->c_ye - cv->c_ys + 1; cv->c_blank.l_x = cv->c_blank.l_y = 0; cv->c_blank.l_layfn = &BlankLf; cv->c_blank.l_data = NULL; cv->c_blank.l_next = NULL; cv->c_blank.l_bottom = &cv->c_blank; cv->c_blank.l_blocking = 0; cv->c_layer = &cv->c_blank; } static void FreePerp(Canvas *pcv) { Canvas *cv; if (!pcv->c_slperp) return; cv = pcv->c_slperp; cv->c_slprev = pcv->c_slprev; if (cv->c_slprev) cv->c_slprev->c_slnext = cv; cv->c_slback = pcv->c_slback; if (cv->c_slback && cv->c_slback->c_slperp == pcv) cv->c_slback->c_slperp = cv; cv->c_slorient = pcv->c_slorient; cv->c_slweight = pcv->c_slweight; while (cv->c_slnext) { cv = cv->c_slnext; cv->c_slorient = pcv->c_slorient; cv->c_slback = pcv->c_slback; cv->c_slweight = pcv->c_slweight; } cv->c_slnext = pcv->c_slnext; if (cv->c_slnext) cv->c_slnext->c_slprev = cv; LayerCleanupMemory(&pcv->c_blank); free(pcv); } void FreeCanvas(Canvas *cv) { Viewport *vp, *nvp; Window *win; if (cv->c_slprev) cv->c_slprev->c_slnext = cv->c_slnext; if (cv->c_slnext) cv->c_slnext->c_slprev = cv->c_slprev; if (cv->c_slback && cv->c_slback->c_slperp == cv) cv->c_slback->c_slperp = cv->c_slnext ? cv->c_slnext : cv->c_slprev; if (cv->c_slperp) { while (cv->c_slperp) FreeCanvas(cv->c_slperp); LayerCleanupMemory(&cv->c_blank); free(cv); return; } if (display) { if (D_forecv == cv) D_forecv = NULL; /* remove from canvas chain as SetCanvasWindow might call * some layer function */ for (Canvas **cvp = &D_cvlist; *cvp; cvp = &(*cvp)->c_next) if (*cvp == cv) { *cvp = cv->c_next; break; } } win = cv->c_layer ? Layer2Window(cv->c_layer) : NULL; SetCanvasWindow(cv, NULL); if (win) WindowChanged(win, 'u'); if (flayer == cv->c_layer) flayer = NULL; for (vp = cv->c_vplist; vp; vp = nvp) { vp->v_canvas = NULL; nvp = vp->v_next; vp->v_next = NULL; free(vp); } evdeq(&cv->c_captev); LayerCleanupMemory(&cv->c_blank); free(cv); } int CountCanvas(Canvas *cv) { int num = 0; for (; cv; cv = cv->c_slnext) { if (cv->c_slperp) { num += CountCanvasPerp(cv); } else num++; } return num; } int CountCanvasPerp(Canvas *cv) { int num = 1; for (Canvas *cvp = cv->c_slperp; cvp; cvp = cvp->c_slnext) if (cvp->c_slperp) { int n = CountCanvas(cvp->c_slperp); if (n > num) num = n; } return num; } Canvas *FindCanvas(int x, int y) { Canvas *mcv = NULL; int m, mm = 0; for (Canvas *cv = D_cvlist; cv; cv = cv->c_next) { if (x >= cv->c_xs && x <= cv->c_xe) { if (y >= cv->c_ys && y <= cv->c_ye) return cv; if (captiontop && y == cv->c_ys - 1) return cv; if (!captiontop && y == cv->c_ye + 1) return cv; } if (cv == D_forecv) continue; m = 0; if (x >= D_forecv->c_xs && x <= D_forecv->c_xe) { if (x < cv->c_xs || x > cv->c_xe) continue; if (y < D_forecv->c_ys && y < cv->c_ys) continue; if (y > D_forecv->c_ye + 1 && y > cv->c_ye + 1) continue; if (y < cv->c_ys) m = cv->c_ys - y; if (y > cv->c_ye + 1) m = y - (cv->c_ye + 1); } if (y >= D_forecv->c_ys && y <= D_forecv->c_ye + 1) { if (y < cv->c_ys || y > cv->c_ye + 1) continue; if (x < D_forecv->c_xs && x < cv->c_xs) continue; if (x > D_forecv->c_xe && x > cv->c_xe) continue; if (x < cv->c_xs) m = cv->c_xs - x; if (x > cv->c_xe) m = x - cv->c_xe; } if (m && (!mm || m < mm)) { mcv = cv; mm = m; } } return mcv ? mcv : D_forecv; } void SetCanvasWindow(Canvas *cv, Window *window) { Window *p = NULL, **pp; Layer *l; Canvas *cvp, **cvpp; l = cv->c_layer; display = cv->c_display; if (l) { /* remove old layer */ for (cvpp = &l->l_cvlist; (cvp = *cvpp); cvpp = &cvp->c_lnext) if (cvp == cv) break; *cvpp = cvp->c_lnext; p = Layer2Window(l); l = cv->c_layer; cv->c_layer = NULL; if (p && cv == D_forecv) { ReleaseAutoWritelock(display, p); if (p->w_silence) { SetTimeout(&p->w_silenceev, p->w_silencewait * 1000); evenq(&p->w_silenceev); } D_other = fore; D_fore = NULL; } if (l->l_cvlist == NULL && (p == NULL || l != p->w_savelayer)) KillLayerChain(l); } /* find right layer to display on canvas */ if (window && window->w_type != W_TYPE_GROUP) { l = &window->w_layer; if (window->w_savelayer && (window->w_blocked || window->w_savelayer->l_cvlist == NULL)) l = window->w_savelayer; } else { l = &cv->c_blank; if (window) l->l_data = (char *)window; else l->l_data = NULL; } /* add our canvas to the layer's canvaslist */ cv->c_lnext = l->l_cvlist; l->l_cvlist = cv; cv->c_layer = l; cv->c_xoff = cv->c_xs; cv->c_yoff = cv->c_ys; RethinkViewportOffsets(cv); if (flayer == NULL) flayer = l; if (window && window->w_type == W_TYPE_GROUP) { /* auto-start windowlist on groups */ Display *d = display; Layer *oldflayer = flayer; flayer = l; display_windows(0, 0, window); flayer = oldflayer; display = d; } if (window && D_other == window) D_other = window->w_prev_mru; /* Might be 0, but that's OK. */ if (cv == D_forecv) { D_fore = window; fore = D_fore; /* XXX ? */ if (window) { ObtainAutoWritelock(display, window); /* * Place the window at the head of the most-recently-used list */ if (mru_window != window) { for (pp = &mru_window; (p = *pp); pp = &p->w_prev_mru) if (p == window) break; *pp = p->w_prev_mru; p->w_prev_mru = mru_window; mru_window = p; WListLinkChanged(); } } } } static void cv_winid_fn(Event *ev, void *data) { int ox, oy; Canvas *cv = (Canvas *)data; display = cv->c_display; if (D_status == STATUS_ON_WIN) { SetTimeout(ev, 1); evenq(ev); return; } ox = D_x; oy = D_y; if (cv->c_ye + 1 < D_height) RefreshLine(cv->c_ye + 1, 0, D_width - 1, 0); if (ox != -1 && oy != -1) GotoPos(ox, oy); } int MakeDefaultCanvas(void) { Canvas *cv; if ((cv = calloc(1, sizeof(Canvas))) == NULL) return -1; cv->c_xs = 0; cv->c_xe = D_width - 1; cv->c_ys = (D_has_hstatus == HSTATUS_FIRSTLINE) + captionalways * captiontop; cv->c_ye = D_height - 1 - (D_has_hstatus == HSTATUS_LASTLINE) - captionalways * !captiontop; cv->c_xoff = 0; cv->c_yoff = 0; cv->c_next = NULL; cv->c_display = display; cv->c_vplist = NULL; cv->c_slnext = NULL; cv->c_slprev = NULL; cv->c_slperp = NULL; cv->c_slweight = 1; cv->c_slback = &D_canvas; D_canvas.c_slperp = cv; D_canvas.c_xs = cv->c_xs; D_canvas.c_xe = cv->c_xe; D_canvas.c_ys = cv->c_ys; D_canvas.c_ye = cv->c_ye; cv->c_slorient = SLICE_UNKN; cv->c_captev.type = EV_TIMEOUT; cv->c_captev.data = (char *)cv; cv->c_captev.handler = cv_winid_fn; CanvasInitBlank(cv); cv->c_lnext = NULL; D_cvlist = cv; RethinkDisplayViewports(); D_forecv = cv; /* default input focus */ return 0; } static Canvas **CreateCanvasChainRec(Canvas *cv, Canvas **cvp) { for (; cv; cv = cv->c_slnext) { if (cv->c_slperp) cvp = CreateCanvasChainRec(cv->c_slperp, cvp); else { *cvp = cv; cvp = &cv->c_next; } } return cvp; } void RecreateCanvasChain(void) { Canvas **cvp; cvp = CreateCanvasChainRec(D_canvas.c_slperp, &D_cvlist); *cvp = NULL; } void EqualizeCanvas(Canvas *cv, bool gflag) { for (; cv; cv = cv->c_slnext) { if (cv->c_slperp && gflag) { cv->c_slweight = CountCanvasPerp(cv); for (Canvas *cv2 = cv->c_slperp; cv2; cv2 = cv2->c_slnext) if (cv2->c_slperp) EqualizeCanvas(cv2->c_slperp, gflag); } else cv->c_slweight = 1; } } void ResizeCanvas(Canvas *cv) { Canvas *cv2, *cvn, *fcv; int nh, i, maxi, hh, m, w, wsum; int need, got; int xs, ys, xe, ye; int focusmin = 0; xs = cv->c_xs; ys = cv->c_ys; xe = cv->c_xe; ye = cv->c_ye; cv = cv->c_slperp; if (cv == NULL) return; if (cv->c_slorient == SLICE_UNKN) { cv->c_xs = xs; cv->c_xe = xe; cv->c_ys = ys; cv->c_ye = ye; cv->c_xoff = cv->c_xs; cv->c_yoff = cv->c_ys; cv->c_blank.l_width = cv->c_xe - cv->c_xs + 1; cv->c_blank.l_height = cv->c_ye - cv->c_ys + 1; return; } fcv = NULL; if (focusminwidth || focusminheight) { cv2 = D_forecv; while (cv2->c_slback) { if (cv2->c_slback == cv->c_slback) { fcv = cv2; focusmin = cv->c_slorient == SLICE_VERT ? focusminheight : focusminwidth; if (focusmin > 0) focusmin--; else if (focusmin < 0) focusmin = cv->c_slorient == SLICE_VERT ? ye - ys + 2 : xe - xs + 2; } cv2 = cv2->c_slback; } } if (focusmin) { m = CountCanvas(cv) * 2; nh = cv->c_slorient == SLICE_VERT ? ye - ys + 2 : xe - xs + 2; nh -= m; if (nh < 0) nh = 0; if (focusmin > nh) focusmin = nh; } /* pass 1: calculate weight sum */ for (cv2 = cv, wsum = 0; cv2; cv2 = cv2->c_slnext) { wsum += cv2->c_slweight; } if (wsum == 0) wsum = 1; w = wsum; /* pass 2: calculate need/excess space */ nh = cv->c_slorient == SLICE_VERT ? ye - ys + 2 : xe - xs + 2; for (cv2 = cv, need = got = 0; cv2; cv2 = cv2->c_slnext) { m = cv2->c_slperp ? CountCanvasPerp(cv2) * 2 - 1 : 1; if (cv2 == fcv) m += focusmin; hh = cv2->c_slweight ? nh * cv2->c_slweight / w : 0; w -= cv2->c_slweight; nh -= hh; if (hh <= m + 1) need += m + 1 - hh; else got += hh - m - 1; } if (need > got) need = got; /* pass 3: distribute space */ nh = cv->c_slorient == SLICE_VERT ? ye - ys + 2 : xe - xs + 2; i = cv->c_slorient == SLICE_VERT ? ys : xs; maxi = cv->c_slorient == SLICE_VERT ? ye : xe; w = wsum; for (; cv; cv = cvn) { cvn = cv->c_slnext; if (i > maxi) { if (cv->c_slprev && !cv->c_slback->c_slback && !cv->c_slprev->c_slperp && !cv->c_slprev->c_slprev) { cv->c_slprev->c_slorient = SLICE_UNKN; if (!captionalways) { if (captiontop) { cv->c_slback->c_ys--; cv->c_slprev->c_ys--; } else { cv->c_slback->c_ye++; cv->c_slprev->c_ye++; } } } SetCanvasWindow(cv, NULL); FreeCanvas(cv); continue; } m = cv->c_slperp ? CountCanvasPerp(cv) * 2 - 1 : 1; if (cv == fcv) m += focusmin; hh = cv->c_slweight ? nh * cv->c_slweight / w : 0; w -= cv->c_slweight; nh -= hh; if (hh <= m + 1) { hh = m + 1; } else { int hx = need * (hh - m - 1) / got; got -= (hh - m - 1); hh -= hx; need -= hx; } /* hh is window size plus pation line */ if (i + hh > maxi + 2) { hh = maxi + 2 - i; } if (i + hh == maxi + 1) { hh++; } if (cv->c_slorient == SLICE_VERT) { cv->c_xs = xs; cv->c_xe = xe; cv->c_ys = i; cv->c_ye = i + hh - 2; cv->c_xoff = xs; cv->c_yoff = i; } else { cv->c_xs = i; cv->c_xe = i + hh - 2; cv->c_ys = ys; cv->c_ye = ye; cv->c_xoff = i; cv->c_yoff = ys; } cv->c_xoff = cv->c_xs; cv->c_yoff = cv->c_ys; cv->c_blank.l_width = cv->c_xe - cv->c_xs + 1; cv->c_blank.l_height = cv->c_ye - cv->c_ys + 1; if (cv->c_slperp) { ResizeCanvas(cv); if (!cv->c_slperp->c_slnext) { FreePerp(cv->c_slperp); FreePerp(cv); } } i += hh; } } static Canvas *AddPerp(Canvas *cv) { Canvas *pcv; if ((pcv = calloc(1, sizeof(Canvas))) == NULL) return NULL; pcv->c_next = NULL; pcv->c_display = cv->c_display; pcv->c_slnext = cv->c_slnext; pcv->c_slprev = cv->c_slprev; pcv->c_slperp = cv; pcv->c_slback = cv->c_slback; if (cv->c_slback && cv->c_slback->c_slperp == cv) cv->c_slback->c_slperp = pcv; pcv->c_slorient = cv->c_slorient; pcv->c_xoff = 0; pcv->c_yoff = 0; pcv->c_xs = cv->c_xs; pcv->c_xe = cv->c_xe; pcv->c_ys = cv->c_ys; pcv->c_ye = cv->c_ye; if (pcv->c_slnext) pcv->c_slnext->c_slprev = pcv; if (pcv->c_slprev) pcv->c_slprev->c_slnext = pcv; pcv->c_slweight = cv->c_slweight; CanvasInitBlank(pcv); cv->c_slweight = 1; cv->c_slnext = NULL; cv->c_slprev = NULL; cv->c_slperp = NULL; cv->c_slback = pcv; cv->c_slorient = SLICE_UNKN; return pcv; } int AddCanvas(int orient) { Canvas *cv; int xs, xe, ys, ye; int h, num; cv = D_forecv; if (cv->c_slorient != SLICE_UNKN && cv->c_slorient != orient) if (!AddPerp(cv)) return -1; cv = D_forecv; xs = cv->c_slback->c_xs; xe = cv->c_slback->c_xe; ys = cv->c_slback->c_ys; ye = cv->c_slback->c_ye; if (!captionalways && cv == D_canvas.c_slperp && !cv->c_slnext) { if (captiontop) ys++; /* need space for caption */ else ye--; /* need space for caption */ } num = CountCanvas(cv->c_slback->c_slperp) + 1; if (orient == SLICE_VERT) h = ye - ys + 1; else h = xe - xs + 1; h -= 2 * num - 1; if (h < 0) return -1; /* can't fit in */ if ((cv = calloc(1, sizeof(Canvas))) == NULL) return -1; D_forecv->c_slback->c_ys = ys; /* in case we modified it above */ D_forecv->c_slback->c_ye = ye; /* in case we modified it above */ D_forecv->c_slorient = orient; /* in case it was UNKN */ cv->c_slnext = D_forecv->c_slnext; cv->c_slprev = D_forecv; D_forecv->c_slnext = cv; if (cv->c_slnext) cv->c_slnext->c_slprev = cv; cv->c_slorient = orient; cv->c_slback = D_forecv->c_slback; cv->c_xs = xs; cv->c_xe = xe; cv->c_ys = ys; cv->c_ye = ye; cv->c_xoff = 0; cv->c_yoff = 0; cv->c_display = display; cv->c_vplist = NULL; cv->c_captev.type = EV_TIMEOUT; cv->c_captev.data = (char *)cv; cv->c_captev.handler = cv_winid_fn; CanvasInitBlank(cv); cv->c_lnext = NULL; cv->c_next = NULL; cv = cv->c_slback; EqualizeCanvas(cv->c_slperp, 0); ResizeCanvas(cv); RecreateCanvasChain(); RethinkDisplayViewports(); ResizeLayersToCanvases(); return 0; } void RemCanvas(void) { Canvas *cv; int ys, ye; cv = D_forecv; ys = cv->c_slback->c_ys; ye = cv->c_slback->c_ye; if (cv->c_slorient == SLICE_UNKN) return; while (cv->c_slprev) cv = cv->c_slprev; if (!cv->c_slnext) return; if (!cv->c_slnext->c_slnext && cv->c_slback->c_slback) { /* two canvases in slice, kill perp node */ cv = D_forecv; FreePerp(cv->c_slprev ? cv->c_slprev : cv->c_slnext); FreePerp(cv->c_slback); } /* free canvas */ cv = D_forecv; D_forecv = cv->c_slprev; if (!D_forecv) D_forecv = cv->c_slnext; FreeCanvas(cv); cv = D_forecv; while (D_forecv->c_slperp) D_forecv = D_forecv->c_slperp; /* if only one canvas left, set orient back to unknown */ if (!cv->c_slnext && !cv->c_slprev && !cv->c_slback->c_slback && !cv->c_slperp) { cv->c_slorient = SLICE_UNKN; if (!captionalways) { if (captiontop) cv->c_slback->c_ys = --ys; /* caption line no longer needed */ else cv->c_slback->c_ye = ++ye; /* caption line no longer needed */ } } cv = cv->c_slback; EqualizeCanvas(cv->c_slperp, 0); ResizeCanvas(cv); D_fore = Layer2Window(D_forecv->c_layer); flayer = D_forecv->c_layer; RecreateCanvasChain(); RethinkDisplayViewports(); ResizeLayersToCanvases(); } void OneCanvas(void) { Canvas *cv = D_forecv, *ocv = NULL; if (cv->c_slprev) { ocv = cv->c_slprev; cv->c_slprev->c_slnext = cv->c_slnext; } if (cv->c_slnext) { ocv = cv->c_slnext; cv->c_slnext->c_slprev = cv->c_slprev; } if (!ocv) return; if (cv->c_slback && cv->c_slback->c_slperp == cv) cv->c_slback->c_slperp = ocv; cv->c_slorient = SLICE_UNKN; while (D_canvas.c_slperp) FreeCanvas(D_canvas.c_slperp); cv = D_forecv; D_canvas.c_slperp = cv; cv->c_slback = &D_canvas; cv->c_slnext = NULL; cv->c_slprev = NULL; if (!captionalways) { if (captiontop) D_canvas.c_ys--; /* caption line no longer needed */ else D_canvas.c_ye++; /* caption line no longer needed */ } ResizeCanvas(&D_canvas); RecreateCanvasChain(); RethinkDisplayViewports(); ResizeLayersToCanvases(); } void DupLayoutCv(Canvas *cvf, Canvas *cvt, bool save) { while (cvf) { cvt->c_slorient = cvf->c_slorient; cvt->c_slweight = cvf->c_slweight; if (cvf == D_forecv) D_forecv = cvt; if (!save) { cvt->c_display = display; if (!cvf->c_slperp) { cvt->c_captev.type = EV_TIMEOUT; cvt->c_captev.data = (char *)cvt; cvt->c_captev.handler = cv_winid_fn; cvt->c_blank.l_cvlist = NULL; cvt->c_blank.l_layfn = &BlankLf; cvt->c_blank.l_bottom = &cvt->c_blank; } cvt->c_layer = cvf->c_layer; } else { Window *p = cvf->c_layer ? Layer2Window(cvf->c_layer) : NULL; cvt->c_layer = p ? &p->w_layer : NULL; } if (cvf->c_slperp) { cvt->c_slperp = calloc(1, sizeof(Canvas)); cvt->c_slperp->c_slback = cvt; CanvasInitBlank(cvt->c_slperp); DupLayoutCv(cvf->c_slperp, cvt->c_slperp, save); } if (cvf->c_slnext) { cvt->c_slnext = calloc(1, sizeof(Canvas)); cvt->c_slnext->c_slprev = cvt; cvt->c_slnext->c_slback = cvt->c_slback; CanvasInitBlank(cvt->c_slnext); } cvf = cvf->c_slnext; cvt = cvt->c_slnext; } } void PutWindowCv(Canvas *cv) { Window *p; for (; cv; cv = cv->c_slnext) { if (cv->c_slperp) { PutWindowCv(cv->c_slperp); continue; } p = cv->c_layer ? (Window *)cv->c_layer->l_data : NULL; cv->c_layer = NULL; SetCanvasWindow(cv, p); } } screen-5.0.1/layout.h0000664000175000017500000000441415011404317013127 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.1/INSTALL0000664000175000017500000001313315011404317012470 0ustar alexalexInstallation of screen 5.0.1 This instruction is quite lengthy ------------------------------------- ... and there are still important items near the end. Start here: Unpack. Screen comes as a compressed tar archive. You need gzip to uncompress. And... well, you probably already managed that step, when you are reading this. For general documentation on the coding and usage standards this distributions follows, see the GNU standards document on https://www.gnu.org/prep/standards/, especially the `Makefile Conventions', `Configuration', and `User Interfaces' sections. 0.) autogen.sh -------------- First, run ./autogen.sh. This will create configure file that you can use. This should be already done, so you can skip this step. 1.) configure & config.status ----------------------------- Run ./configure. This should create a reasonable Makefile and a config.h file suited for your machine. Rename config.status to reflect the architecture (hostname) where it was built. To reconfigure quickly for that architecture just run that config.status file. If this process fails, try to find out what configure did do and what it should have checked. And then please report a bug (https://savannah.gnu.org/bugs/?group=screen or mail screen-devel@gnu.org). Actually the initial Makefile that comes with the distribution just runs configure -- thus you can start by typing 'make' right after unpacking. You will be prompted to run 'make' again, which will really make screen. 2.) Makefile & config.h ----------------------- Look through the Makefile & user configuration section in config.h and check pathnames. Change them to suit your installation requirements. Usually sysadmins discuss the location of SOCKDIR, whether it should be in /tmp or not. At least it must be on a filesystem that supports sockets/fifos. SOCKDIR must not point into an AFS (Andrew File System) mounted directory. If you are uncertain about your NFS implementation, use a UFS directory for SOCKDIR. Personally, I favour a users home directory and recommend the the /tmp/ area. The path for ETCSCREENRC may also need to be adapted. 3.) how to actually compile --------------------------- Run 'make'. Screen should compile without too many warnings :) The creation of term.h, comm.h, tty.c or osdef.h may fail on some machines for some odd reason. (E.g. the sed under SCO-unix is known to be case-insensitive and breaks term.h.) If so, please mail a short description of the problem to screen-devel@gnu.org and use the files ending in .dist as a replacement (or in case of osdef.h retry with an empty file). You can then try 'make install' (if you dare). 4.) where to install -------------------- You may well run screen from your private binary directory and with a private socket directory like $HOME/.screen. But to have a full featured screen and (from a users point of view) more secure pty's you should consult a system administrator and discuss installing screen setuid-root in some globally accessible directory like /usr/local/bin. Consider this, when deciding whether you install screen setuid-root: - On some machines root privileges are required to open pty's. - Pty's should be owned by the user, so that she can do chmod to prevent intruder attacks. The PTYs used by screen will remain world read-writable if screen is not installed setuid-root. - Some commands only work properly when the pty is owned by the user. These include mesg and biff. - The ^At feature may need to lseek and read the kernel file to retrieve the load average. - On most machines utmp slots can only be created/manipulated with root privileges. Users will appear to be logged on the primary terminal instead of the screen windows, if screen is not installed setuid-root. - Multi-user screen sessions are only allowed when screen has a root-s-bit. - If screen sockets of multiple users are kept in one directory (e.g. /tmp/screens), this directory must be world writable when screen is not installed setuid-root. Any user can remove or abuse any socket then. 5.) doc/screen.1 & doc/screen.texinfo ------------------------------------- The man page doc/screen.1 should go to /usr/local/man/man1, or some similar directory. It should format nicely with nroff -man. If it does not, then try removing extra dots with: sed -e 's/^\.\././' < screen.1 | nroff -man The info page doc/screen.texinfo contains basically the same information as the man-page, we may have missed one or another thing in one of the files. If so, mail me. 6.) etc/screenrc & etc/etcscreenrc ---------------------------------- The files screenrc and etc/etcscreenrc are instructive samples that demonstrate what can/should be done from your private .screenrc and from $ETCSCREENRC -- do not just copy them. Read them. Look through the etcscreenrc file for system wide defaults that you like to set. e.g. autodetach off, startup_message off, vbell on, ... Since version 3.2.15 the screenrc file syntax changed slightly. All rc files from previous versions should be run through the 'newsyntax' script that comes with this package. If and only if you want to install screen as a console multiplexer, look at the *.sample files and what 'make cscreen' suggests. 7.) terminfo/screeninfo.src & terminfo/screencap ------------------------------------------------ Every now and then we update the termcap/terminfo entries for screen. E.g. keycodes were added in 3.6.0 -- thus you check that your termcap/terminfo database is up to date. See the README in the terminfo subdirectory. 8.) have fun ------------ To get an idea what the basic screen commands are, read the file README. Request snail mail address for liquid and solid donations. :-) screen-5.0.1/sched.h0000664000175000017500000000370015011404317012675 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.1/socket.c0000664000175000017500000010637015011404317013101 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 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); } sprintf(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 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 (CreateTempDisplay(&m, recvfd, NULL)) break; if (do_auth) AskPassword(&m); else FinishAttach(&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(-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 static int screen_conv(int num_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.1/list_display.c0000664000175000017500000001455115011404317014310 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.1/term.c0000664000175000017500000001732515011404317012561 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.1/backtick.c0000664000175000017500000001145415011404317013362 0ustar alexalex/* 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 "backtick.h" #include "fileio.h" #include "misc.h" #include "winmsg.h" /* TODO: get rid of global var */ static Backtick *backticks; static void backtick_filter(struct backtick *bt) { char *p, *q; int c; for (p = q = bt->result; (c = (unsigned char)*p++) != 0;) { if (c == '\t') c = ' '; if (c >= ' ' || c == '\005') *q++ = c; } *q = 0; } static void backtick_fn(Event *ev, void *data) { struct backtick *bt; int i, j, k, l; bt = (struct backtick *)data; i = bt->bufi; l = read(ev->fd, bt->buf + i, MAXSTR - i); if (l <= 0) { evdeq(ev); close(ev->fd); ev->fd = -1; return; } i += l; for (j = 0; j < l; j++) if (bt->buf[i - j - 1] == '\n') break; if (j < l) { for (k = i - j - 2; k >= 0; k--) if (bt->buf[k] == '\n') break; k++; memmove(bt->result, bt->buf + k, i - j - k); bt->result[i - j - k - 1] = 0; backtick_filter(bt); WindowChanged(NULL, WINESC_BACKTICK); } if (j == l && i == MAXSTR) { j = MAXSTR / 2; l = j + 1; } if (j < l) { if (j) memmove(bt->buf, bt->buf + i - j, j); i = j; } bt->bufi = i; } void setbacktick(int num, int lifespan, int tick, char **cmdv) { struct backtick **btp, *bt; char **v; for (btp = &backticks; (bt = *btp) != NULL; btp = &bt->next) if (bt->num == num) break; if (!bt && !cmdv) return; if (bt) { for (v = bt->cmdv; *v; v++) free(*v); free(bt->cmdv); if (bt->buf) free(bt->buf); if (bt->ev.fd >= 0) close(bt->ev.fd); evdeq(&bt->ev); } if (bt && !cmdv) { *btp = bt->next; free(bt); return; } if (!bt) { bt = malloc(sizeof(struct backtick)); if (!bt) { Msg(0, "%s", strnomem); return; } memset(bt, 0, sizeof(struct backtick)); bt->next = NULL; *btp = bt; } bt->num = num; bt->tick = tick; bt->lifespan = lifespan; bt->bestbefore = 0; bt->result[0] = 0; bt->buf = NULL; bt->bufi = 0; bt->cmdv = cmdv; bt->ev.fd = -1; if (bt->tick == 0 && bt->lifespan == 0) { bt->buf = malloc(MAXSTR); if (bt->buf == NULL) { Msg(0, "%s", strnomem); setbacktick(num, 0, 0, NULL); return; } bt->ev.type = EV_READ; bt->ev.fd = readpipe(bt->cmdv); bt->ev.handler = backtick_fn; bt->ev.data = (char *)bt; if (bt->ev.fd >= 0) evenq(&bt->ev); } } char *runbacktick(Backtick *bt, int *tickp, time_t now) { int f, i, l, j; time_t now2; if (bt->tick && (!*tickp || bt->tick < *tickp)) *tickp = bt->tick; if ((bt->lifespan == 0 && bt->tick == 0) || now < bt->bestbefore) { return bt->result; } f = readpipe(bt->cmdv); if (f == -1) return bt->result; i = 0; while ((l = read(f, bt->result + i, ARRAY_SIZE(bt->result) - i)) > 0) { i += l; for (j = 1; j < l; j++) if (bt->result[i - j - 1] == '\n') break; if (j == l && i == ARRAY_SIZE(bt->result)) { j = ARRAY_SIZE(bt->result) / 2; l = j + 1; } if (j < l) { memmove(bt->result, bt->result + i - j, j); i = j; } } close(f); bt->result[ARRAY_SIZE(bt->result) - 1] = '\n'; if (i && bt->result[i - 1] == '\n') i--; bt->result[i] = 0; backtick_filter(bt); (void)time(&now2); bt->bestbefore = now2 + bt->lifespan; return bt->result; } /* Locate a backtick by its id (number); returns NULL if no such backtick * exists. */ Backtick *bt_find_id(int num) { Backtick *bt; for (bt = backticks; bt; bt = bt->next) { if (bt->num == num) return bt; } return NULL; } screen-5.0.1/search.h0000664000175000017500000000027615011404317013061 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.1/sched.c0000664000175000017500000001156515011404317012700 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.1/autom4te.cache/0000755000175000017500000000000015011405517014243 5ustar alexalexscreen-5.0.1/autom4te.cache/traces.20000664000175000017500000007251215011405517015620 0ustar alexalexm4trace:configure.ac:1: -1- AC_INIT([GNU Screen], [5.0.1], [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 3, Interix. */ #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 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 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 C90 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_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.1/autom4te.cache/output.10000664000175000017500000053443415011405517015704 0ustar alexalex@%:@! /bin/sh @%:@ Guess values for system-dependent variables and create Makefiles. @%:@ Generated by GNU Autoconf 2.71 for GNU Screen 5.0.1. @%:@ @%:@ Report bugs to . @%:@ @%:@ @%:@ Copyright (C) 1992-1996, 1998-2017, 2020-2021 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 as_nop=: 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 $as_nop case `(set -o) 2>/dev/null` in @%:@( *posix*) : set -o posix ;; @%:@( *) : ;; 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="as_nop=: 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 \$as_nop case \`(set -o) 2>/dev/null\` in @%:@( *posix*) : set -o posix ;; @%:@( *) : ;; 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 \$as_nop exitcode=1; echo positional parameters were not saved. 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 $as_nop as_have_required=no fi if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null then : else $as_nop 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 $as_nop 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 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 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_nop @%:@ --------- @%:@ Do nothing but, unlike ":", preserve the value of @S|@?. as_fn_nop () { return $? } as_nop=as_fn_nop @%:@ 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 $as_nop as_fn_append () { eval $1=\$$1\$2 } 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 $as_nop as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } fi # as_fn_arith @%:@ as_fn_nop @%:@ --------- @%:@ Do nothing but, unlike ":", preserve the value of @S|@?. as_fn_nop () { return $? } as_nop=as_fn_nop @%:@ 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 ' 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_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" 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.1' PACKAGE_STRING='GNU Screen 5.0.1' 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.1 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.1:";; 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.1 generated by GNU Autoconf 2.71 Copyright (C) 2021 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 $as_nop printf "%s\n" "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 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 $as_nop 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 $as_nop eval "$3=no" fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext 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 $as_nop printf "%s\n" "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 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 $as_nop 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 (); 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 (); /* 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 $as_nop eval "$3=no" fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext 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.1, which was generated by GNU Autoconf 2.71. 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 (p, i) 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; } /* 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 #include extern int puts (const char *); extern int printf (const char *, ...); extern int dprintf (int, const char *, ...); extern void *malloc (size_t); // 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) { // See if C++-style comments work. // 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; // 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 $as_nop as_fn_error $? "cannot find required auxiliary files:$ac_missing_aux_files" "$LINENO" 5 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 $as_nop 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 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 $as_nop 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 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 $as_nop 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 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 $as_nop 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 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 $as_nop 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 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 $as_nop 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 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 $as_nop 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 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 $as_nop 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 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 $as_nop ac_file='' 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 $as_nop { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 printf "%s\n" "yes" >&6; } 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 $as_nop { { 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; } 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"); 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.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 $as_nop 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 $as_nop 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; } fi rm -f conftest.$ac_cv_objext conftest.$ac_ext 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 $as_nop 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 $as_nop ac_compiler_gnu=no fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ac_cv_c_compiler_gnu=$ac_compiler_gnu 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 $as_nop 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 $as_nop 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 $as_nop 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 fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ac_c_werror_flag=$ac_save_c_werror_flag 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 $as_nop 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 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 $as_nop 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 $as_nop { 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" fi ac_cv_prog_cc_stdc=$ac_cv_prog_cc_c11 ac_prog_cc_stdc=c11 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 $as_nop 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 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 $as_nop 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 $as_nop { 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" fi ac_cv_prog_cc_stdc=$ac_cv_prog_cc_c99 ac_prog_cc_stdc=c99 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 $as_nop 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 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 $as_nop 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 $as_nop { 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" fi ac_cv_prog_cc_stdc=$ac_cv_prog_cc_c89 ac_prog_cc_stdc=c89 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 $as_nop 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 $as_nop ac_cv_safe_to_define___extensions__=no fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext 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 $as_nop 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 $as_nop 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 fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext fi 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_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 $as_nop MINIX= 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 $as_nop 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 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 $as_nop 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 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 $as_nop 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 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 $as_nop 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 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 $as_nop 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 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 $as_nop 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 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 $as_nop 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 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 $as_nop 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 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 $as_nop 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 $as_nop ac_compiler_gnu=no fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ac_cv_c_compiler_gnu=$ac_compiler_gnu 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 $as_nop 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 $as_nop 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 $as_nop 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 fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ac_c_werror_flag=$ac_save_c_werror_flag 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 $as_nop 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 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 $as_nop 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 $as_nop { 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" fi ac_cv_prog_cc_stdc=$ac_cv_prog_cc_c11 ac_prog_cc_stdc=c11 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 $as_nop 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 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 $as_nop 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 $as_nop { 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" fi ac_cv_prog_cc_stdc=$ac_cv_prog_cc_c99 ac_prog_cc_stdc=c99 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 $as_nop 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 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 $as_nop 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 $as_nop { 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" fi ac_cv_prog_cc_stdc=$ac_cv_prog_cc_c89 ac_prog_cc_stdc=c89 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 $as_nop 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 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 $as_nop 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 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 $as_nop 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. */ char tgetent (); 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 $as_nop ac_cv_search_tgetent=no fi rm conftest.$ac_ext LIBS=$ac_func_search_save_LIBS 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 $as_nop as_fn_error $? "unable to find tgetent() function" "$LINENO" 5 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 $as_nop 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. */ char crypt (); 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 $as_nop ac_cv_search_crypt=no fi rm conftest.$ac_ext LIBS=$ac_func_search_save_LIBS 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 $as_nop as_fn_error $? "unable to find crypt() function" "$LINENO" 5 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 $as_nop 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. */ char openpty (); 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 $as_nop ac_cv_search_openpty=no fi rm conftest.$ac_ext LIBS=$ac_func_search_save_LIBS 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 $as_nop as_fn_error $? "unable to find openpty() function" "$LINENO" 5 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 $as_nop 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. */ char socket (); 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 $as_nop ac_cv_search_socket=no fi rm conftest.$ac_ext LIBS=$ac_func_search_save_LIBS 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 $as_nop as_fn_error $? "unable to find socket() function" "$LINENO" 5 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 $as_nop enable_pam=yes fi @%:@ Check whether --enable-utmp was given. if test ${enable_utmp+y} then : enableval=$enable_utmp; enable_utmp=$enableval else $as_nop enable_utmp=no fi @%:@ Check whether --enable-telnet was given. if test ${enable_telnet+y} then : enableval=$enable_telnet; enable_telnet=$enableval else $as_nop enable_telnet=no fi @%:@ Check whether --enable-socket-dir was given. if test ${enable_socket_dir+y} then : enableval=$enable_socket_dir; enable_socket_dir=$enableval else $as_nop enable_socket_dir=no fi @%:@ Check whether --with-system_screenrc was given. if test ${with_system_screenrc+y} then : withval=$with_system_screenrc; with_system_screenrc=$withval else $as_nop with_system_screenrc=/etc/screenrc fi @%:@ Check whether --with-pty-mode was given. if test ${with_pty_mode+y} then : withval=$with_pty_mode; with_pty_mode=$withval else $as_nop with_pty_mode=0620 fi @%:@ Check whether --with-pty-group was given. if test ${with_pty_group+y} then : withval=$with_pty_group; with_pty_group=$withval else $as_nop with_pty_group=5 fi @%:@ Check whether --with-pty-rofs was given. if test ${with_pty_rofs+y} then : withval=$with_pty_rofs; with_pty_rofs=$withval else $as_nop with_pty_rofs=no 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 $as_nop as_fn_error $? "no" "$LINENO" 5;LIBS="$oldlibs" 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 $as_nop have_utmpx=no 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 $as_nop have_utempter=no 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 $as_nop { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } 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 $as_nop { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } 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 as_nop=: 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 $as_nop case `(set -o) 2>/dev/null` in @%:@( *posix*) : set -o posix ;; @%:@( *) : ;; 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 $as_nop as_fn_append () { eval $1=\$$1\$2 } 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 $as_nop as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } 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_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" 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.1, which was generated by GNU Autoconf 2.71. 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.1 configured by $0, generated by GNU Autoconf 2.71, with options \\"\$ac_cs_config\\" Copyright (C) 2021 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.1/autom4te.cache/requests0000664000175000017500000001776215011405517016060 0ustar alexalex# This file was generated by Autom4te 2.71. # 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.16/internal/ac-config-macro-dirs.m4', 'configure.ac' ], { '_AM_AUTOCONF_VERSION' => 1, '_AM_CONFIG_MACRO_DIRS' => 1, 'AC_CONFIG_MACRO_DIR' => 1, '_m4_warn' => 1, 'm4_include' => 1, 'AC_DEFUN_ONCE' => 1, 'm4_pattern_forbid' => 1, 'm4_pattern_allow' => 1, 'AC_DEFUN' => 1, 'AC_CONFIG_MACRO_DIR_TRACE' => 1, 'include' => 1, 'AU_DEFUN' => 1 } ], 'Autom4te::Request' ), bless( [ '1', 1, [ '/usr/share/autoconf' ], [ '/usr/share/autoconf/autoconf/autoconf.m4f', 'configure.ac' ], { 'AM_GNU_GETTEXT' => 1, 'AM_PROG_CC_C_O' => 1, 'LT_INIT' => 1, 'AC_CONFIG_HEADERS' => 1, 'AC_FC_PP_SRCEXT' => 1, 'AM_AUTOMAKE_VERSION' => 1, 'sinclude' => 1, 'm4_include' => 1, 'AM_PATH_GUILE' => 1, 'AC_PROG_LIBTOOL' => 1, 'AM_ENABLE_MULTILIB' => 1, 'AC_CONFIG_SUBDIRS' => 1, 'include' => 1, 'AM_PROG_CXX_C_O' => 1, '_LT_AC_TAGCONFIG' => 1, 'LT_SUPPORTED_TAG' => 1, 'AC_CANONICAL_HOST' => 1, 'IT_PROG_INTLTOOL' => 1, 'm4_pattern_allow' => 1, 'AM_GNU_GETTEXT_INTL_SUBDIR' => 1, 'AC_CONFIG_MACRO_DIR_TRACE' => 1, 'AM_SILENT_RULES' => 1, 'AC_SUBST' => 1, 'AC_CANONICAL_BUILD' => 1, '_AM_COND_ELSE' => 1, 'AM_PROG_LIBTOOL' => 1, 'AM_PROG_F77_C_O' => 1, 'AM_PROG_FC_C_O' => 1, 'AC_FC_FREEFORM' => 1, '_AM_SUBST_NOTMAKE' => 1, 'AM_PROG_MOC' => 1, 'AC_INIT' => 1, 'AM_INIT_AUTOMAKE' => 1, 'AM_MAKEFILE_INCLUDE' => 1, '_m4_warn' => 1, 'AC_CONFIG_AUX_DIR' => 1, 'AM_CONDITIONAL' => 1, 'AC_CANONICAL_SYSTEM' => 1, '_AM_MAKEFILE_INCLUDE' => 1, 'AM_PROG_MKDIR_P' => 1, '_AM_COND_ENDIF' => 1, 'AC_LIBSOURCE' => 1, '_AM_COND_IF' => 1, 'AC_DEFINE_TRACE_LITERAL' => 1, 'GTK_DOC_CHECK' => 1, 'AM_EXTRA_RECURSIVE_TARGETS' => 1, 'AC_CONFIG_LIBOBJ_DIR' => 1, 'AC_CANONICAL_TARGET' => 1, 'AM_NLS' => 1, 'm4_pattern_forbid' => 1, 'AM_PROG_AR' => 1, 'AC_CONFIG_FILES' => 1, 'AM_MAINTAINER_MODE' => 1, 'AC_SUBST_TRACE' => 1, 'AC_CONFIG_LINKS' => 1, 'AM_XGETTEXT_OPTION' => 1, 'AC_REQUIRE_AUX_FILE' => 1, 'LT_CONFIG_LTDL_DIR' => 1, 'AC_FC_SRCEXT' => 1, 'AH_OUTPUT' => 1, 'm4_sinclude' => 1, 'AC_FC_PP_DEFINE' => 1, 'AM_POT_TOOLS' => 1 } ], 'Autom4te::Request' ), bless( [ '2', 1, [ '/usr/share/autoconf' ], [ '/usr/share/autoconf/autoconf/autoconf.m4f', '/usr/share/autoconf/autoconf/trailer.m4', 'configure.ac' ], { 'AM_PROG_CC_C_O' => 1, 'AM_GNU_GETTEXT' => 1, 'AC_FC_PP_SRCEXT' => 1, 'AM_AUTOMAKE_VERSION' => 1, 'LT_INIT' => 1, 'AC_CONFIG_HEADERS' => 1, 'm4_include' => 1, 'AM_PATH_GUILE' => 1, 'AM_ENABLE_MULTILIB' => 1, 'AC_PROG_LIBTOOL' => 1, 'sinclude' => 1, 'include' => 1, 'AC_CONFIG_SUBDIRS' => 1, 'LT_SUPPORTED_TAG' => 1, '_LT_AC_TAGCONFIG' => 1, 'AC_CANONICAL_HOST' => 1, 'AM_PROG_CXX_C_O' => 1, 'IT_PROG_INTLTOOL' => 1, 'm4_pattern_allow' => 1, 'AC_CONFIG_MACRO_DIR_TRACE' => 1, 'AM_GNU_GETTEXT_INTL_SUBDIR' => 1, '_AM_COND_ELSE' => 1, 'AC_CANONICAL_BUILD' => 1, 'AM_PROG_F77_C_O' => 1, 'AM_PROG_LIBTOOL' => 1, 'AM_PROG_FC_C_O' => 1, 'AC_FC_FREEFORM' => 1, 'AM_SILENT_RULES' => 1, 'AC_SUBST' => 1, 'AC_INIT' => 1, '_AM_SUBST_NOTMAKE' => 1, 'AM_PROG_MOC' => 1, '_m4_warn' => 1, 'AM_INIT_AUTOMAKE' => 1, 'AM_MAKEFILE_INCLUDE' => 1, 'AM_CONDITIONAL' => 1, 'AC_CANONICAL_SYSTEM' => 1, 'AC_CONFIG_AUX_DIR' => 1, 'AC_LIBSOURCE' => 1, '_AM_MAKEFILE_INCLUDE' => 1, '_AM_COND_ENDIF' => 1, 'AM_PROG_MKDIR_P' => 1, 'AC_CONFIG_LIBOBJ_DIR' => 1, 'AC_DEFINE_TRACE_LITERAL' => 1, '_AM_COND_IF' => 1, 'GTK_DOC_CHECK' => 1, 'AM_EXTRA_RECURSIVE_TARGETS' => 1, 'm4_pattern_forbid' => 1, 'AM_PROG_AR' => 1, 'AM_NLS' => 1, 'AC_CANONICAL_TARGET' => 1, 'AM_XGETTEXT_OPTION' => 1, 'AC_CONFIG_FILES' => 1, 'AM_MAINTAINER_MODE' => 1, 'AC_CONFIG_LINKS' => 1, 'AC_SUBST_TRACE' => 1, 'LT_CONFIG_LTDL_DIR' => 1, 'AC_FC_SRCEXT' => 1, 'AH_OUTPUT' => 1, 'AC_REQUIRE_AUX_FILE' => 1, 'AM_POT_TOOLS' => 1, 'm4_sinclude' => 1, 'AC_FC_PP_DEFINE' => 1 } ], 'Autom4te::Request' ) ); screen-5.0.1/autom4te.cache/traces.00000664000175000017500000002541515011405517015616 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_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.1/autom4te.cache/output.20000664000175000017500000053443715011405517015710 0ustar alexalex@%:@! /bin/sh @%:@ Guess values for system-dependent variables and create Makefiles. @%:@ Generated by GNU Autoconf 2.71 for GNU Screen 5.0.1. @%:@ @%:@ Report bugs to . @%:@ @%:@ @%:@ Copyright (C) 1992-1996, 1998-2017, 2020-2021 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 as_nop=: 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 $as_nop case `(set -o) 2>/dev/null` in @%:@( *posix*) : set -o posix ;; @%:@( *) : ;; 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="as_nop=: 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 \$as_nop case \`(set -o) 2>/dev/null\` in @%:@( *posix*) : set -o posix ;; @%:@( *) : ;; 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 \$as_nop exitcode=1; echo positional parameters were not saved. 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 $as_nop as_have_required=no fi if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null then : else $as_nop 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 $as_nop 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 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 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_nop @%:@ --------- @%:@ Do nothing but, unlike ":", preserve the value of @S|@?. as_fn_nop () { return $? } as_nop=as_fn_nop @%:@ 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 $as_nop as_fn_append () { eval $1=\$$1\$2 } 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 $as_nop as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } fi # as_fn_arith @%:@ as_fn_nop @%:@ --------- @%:@ Do nothing but, unlike ":", preserve the value of @S|@?. as_fn_nop () { return $? } as_nop=as_fn_nop @%:@ 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 ' 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_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" 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.1' PACKAGE_STRING='GNU Screen 5.0.1' 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.1 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.1:";; 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.1 generated by GNU Autoconf 2.71 Copyright (C) 2021 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 $as_nop printf "%s\n" "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 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 $as_nop 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 $as_nop eval "$3=no" fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext 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 $as_nop printf "%s\n" "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 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 $as_nop 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 (); 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 (); /* 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 $as_nop eval "$3=no" fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext 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.1, which was generated by GNU Autoconf 2.71. 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 (p, i) 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; } /* 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 #include extern int puts (const char *); extern int printf (const char *, ...); extern int dprintf (int, const char *, ...); extern void *malloc (size_t); // 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) { // See if C++-style comments work. // 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; // 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 $as_nop as_fn_error $? "cannot find required auxiliary files:$ac_missing_aux_files" "$LINENO" 5 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 $as_nop 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 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 $as_nop 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 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 $as_nop 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 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 $as_nop 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 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 $as_nop 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 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 $as_nop 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 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 $as_nop 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 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 $as_nop 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 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 $as_nop ac_file='' 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 $as_nop { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 printf "%s\n" "yes" >&6; } 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 $as_nop { { 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; } 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"); 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.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 $as_nop 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 $as_nop 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; } fi rm -f conftest.$ac_cv_objext conftest.$ac_ext 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 $as_nop 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 $as_nop ac_compiler_gnu=no fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ac_cv_c_compiler_gnu=$ac_compiler_gnu 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 $as_nop 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 $as_nop 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 $as_nop 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 fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ac_c_werror_flag=$ac_save_c_werror_flag 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 $as_nop 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 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 $as_nop 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 $as_nop { 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" fi ac_cv_prog_cc_stdc=$ac_cv_prog_cc_c11 ac_prog_cc_stdc=c11 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 $as_nop 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 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 $as_nop 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 $as_nop { 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" fi ac_cv_prog_cc_stdc=$ac_cv_prog_cc_c99 ac_prog_cc_stdc=c99 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 $as_nop 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 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 $as_nop 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 $as_nop { 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" fi ac_cv_prog_cc_stdc=$ac_cv_prog_cc_c89 ac_prog_cc_stdc=c89 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 $as_nop 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 $as_nop ac_cv_safe_to_define___extensions__=no fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext 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 $as_nop 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 $as_nop 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 fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext fi 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_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 $as_nop MINIX= 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 $as_nop 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 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 $as_nop 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 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 $as_nop 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 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 $as_nop 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 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 $as_nop 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 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 $as_nop 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 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 $as_nop 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 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 $as_nop 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 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 $as_nop 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 $as_nop ac_compiler_gnu=no fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ac_cv_c_compiler_gnu=$ac_compiler_gnu 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 $as_nop 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 $as_nop 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 $as_nop 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 fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ac_c_werror_flag=$ac_save_c_werror_flag 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 $as_nop 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 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 $as_nop 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 $as_nop { 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" fi ac_cv_prog_cc_stdc=$ac_cv_prog_cc_c11 ac_prog_cc_stdc=c11 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 $as_nop 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 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 $as_nop 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 $as_nop { 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" fi ac_cv_prog_cc_stdc=$ac_cv_prog_cc_c99 ac_prog_cc_stdc=c99 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 $as_nop 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 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 $as_nop 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 $as_nop { 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" fi ac_cv_prog_cc_stdc=$ac_cv_prog_cc_c89 ac_prog_cc_stdc=c89 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 $as_nop 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 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 $as_nop 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 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 $as_nop 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. */ char tgetent (); 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 $as_nop ac_cv_search_tgetent=no fi rm conftest.$ac_ext LIBS=$ac_func_search_save_LIBS 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 $as_nop as_fn_error $? "unable to find tgetent() function" "$LINENO" 5 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 $as_nop 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. */ char crypt (); 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 $as_nop ac_cv_search_crypt=no fi rm conftest.$ac_ext LIBS=$ac_func_search_save_LIBS 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 $as_nop as_fn_error $? "unable to find crypt() function" "$LINENO" 5 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 $as_nop 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. */ char openpty (); 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 $as_nop ac_cv_search_openpty=no fi rm conftest.$ac_ext LIBS=$ac_func_search_save_LIBS 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 $as_nop as_fn_error $? "unable to find openpty() function" "$LINENO" 5 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 $as_nop 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. */ char socket (); 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 $as_nop ac_cv_search_socket=no fi rm conftest.$ac_ext LIBS=$ac_func_search_save_LIBS 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 $as_nop as_fn_error $? "unable to find socket() function" "$LINENO" 5 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 $as_nop enable_pam=yes fi @%:@ Check whether --enable-utmp was given. if test ${enable_utmp+y} then : enableval=$enable_utmp; enable_utmp=$enableval else $as_nop enable_utmp=no fi @%:@ Check whether --enable-telnet was given. if test ${enable_telnet+y} then : enableval=$enable_telnet; enable_telnet=$enableval else $as_nop enable_telnet=no fi @%:@ Check whether --enable-socket-dir was given. if test ${enable_socket_dir+y} then : enableval=$enable_socket_dir; enable_socket_dir=$enableval else $as_nop enable_socket_dir=no fi @%:@ Check whether --with-system_screenrc was given. if test ${with_system_screenrc+y} then : withval=$with_system_screenrc; with_system_screenrc=$withval else $as_nop with_system_screenrc=/etc/screenrc fi @%:@ Check whether --with-pty-mode was given. if test ${with_pty_mode+y} then : withval=$with_pty_mode; with_pty_mode=$withval else $as_nop with_pty_mode=0620 fi @%:@ Check whether --with-pty-group was given. if test ${with_pty_group+y} then : withval=$with_pty_group; with_pty_group=$withval else $as_nop with_pty_group=5 fi @%:@ Check whether --with-pty-rofs was given. if test ${with_pty_rofs+y} then : withval=$with_pty_rofs; with_pty_rofs=$withval else $as_nop with_pty_rofs=no 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 $as_nop as_fn_error $? "no" "$LINENO" 5;LIBS="$oldlibs" 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 $as_nop have_utmpx=no 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 $as_nop have_utempter=no 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 $as_nop { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } 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 $as_nop { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } 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 as_nop=: 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 $as_nop case `(set -o) 2>/dev/null` in @%:@( *posix*) : set -o posix ;; @%:@( *) : ;; 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 $as_nop as_fn_append () { eval $1=\$$1\$2 } 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 $as_nop as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } 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_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" 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.1, which was generated by GNU Autoconf 2.71. 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.1 configured by $0, generated by GNU Autoconf 2.71, with options \\"\$ac_cs_config\\" Copyright (C) 2021 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.1/autom4te.cache/traces.10000664000175000017500000007251215011405517015617 0ustar alexalexm4trace:configure.ac:1: -1- AC_INIT([GNU Screen], [5.0.1], [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 3, Interix. */ #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 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 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 C90 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_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.1/autom4te.cache/output.00000664000175000017500000053443415011405517015703 0ustar alexalex@%:@! /bin/sh @%:@ Guess values for system-dependent variables and create Makefiles. @%:@ Generated by GNU Autoconf 2.71 for GNU Screen 5.0.1. @%:@ @%:@ Report bugs to . @%:@ @%:@ @%:@ Copyright (C) 1992-1996, 1998-2017, 2020-2021 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 as_nop=: 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 $as_nop case `(set -o) 2>/dev/null` in @%:@( *posix*) : set -o posix ;; @%:@( *) : ;; 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="as_nop=: 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 \$as_nop case \`(set -o) 2>/dev/null\` in @%:@( *posix*) : set -o posix ;; @%:@( *) : ;; 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 \$as_nop exitcode=1; echo positional parameters were not saved. 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 $as_nop as_have_required=no fi if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null then : else $as_nop 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 $as_nop 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 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 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_nop @%:@ --------- @%:@ Do nothing but, unlike ":", preserve the value of @S|@?. as_fn_nop () { return $? } as_nop=as_fn_nop @%:@ 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 $as_nop as_fn_append () { eval $1=\$$1\$2 } 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 $as_nop as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } fi # as_fn_arith @%:@ as_fn_nop @%:@ --------- @%:@ Do nothing but, unlike ":", preserve the value of @S|@?. as_fn_nop () { return $? } as_nop=as_fn_nop @%:@ 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 ' 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_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" 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.1' PACKAGE_STRING='GNU Screen 5.0.1' 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.1 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.1:";; 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.1 generated by GNU Autoconf 2.71 Copyright (C) 2021 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 $as_nop printf "%s\n" "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 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 $as_nop 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 $as_nop eval "$3=no" fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext 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 $as_nop printf "%s\n" "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 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 $as_nop 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 (); 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 (); /* 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 $as_nop eval "$3=no" fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext 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.1, which was generated by GNU Autoconf 2.71. 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 (p, i) 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; } /* 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 #include extern int puts (const char *); extern int printf (const char *, ...); extern int dprintf (int, const char *, ...); extern void *malloc (size_t); // 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) { // See if C++-style comments work. // 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; // 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 $as_nop as_fn_error $? "cannot find required auxiliary files:$ac_missing_aux_files" "$LINENO" 5 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 $as_nop 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 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 $as_nop 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 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 $as_nop 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 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 $as_nop 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 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 $as_nop 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 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 $as_nop 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 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 $as_nop 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 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 $as_nop 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 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 $as_nop ac_file='' 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 $as_nop { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 printf "%s\n" "yes" >&6; } 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 $as_nop { { 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; } 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"); 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.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 $as_nop 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 $as_nop 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; } fi rm -f conftest.$ac_cv_objext conftest.$ac_ext 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 $as_nop 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 $as_nop ac_compiler_gnu=no fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ac_cv_c_compiler_gnu=$ac_compiler_gnu 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 $as_nop 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 $as_nop 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 $as_nop 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 fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ac_c_werror_flag=$ac_save_c_werror_flag 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 $as_nop 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 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 $as_nop 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 $as_nop { 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" fi ac_cv_prog_cc_stdc=$ac_cv_prog_cc_c11 ac_prog_cc_stdc=c11 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 $as_nop 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 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 $as_nop 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 $as_nop { 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" fi ac_cv_prog_cc_stdc=$ac_cv_prog_cc_c99 ac_prog_cc_stdc=c99 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 $as_nop 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 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 $as_nop 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 $as_nop { 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" fi ac_cv_prog_cc_stdc=$ac_cv_prog_cc_c89 ac_prog_cc_stdc=c89 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 $as_nop 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 $as_nop ac_cv_safe_to_define___extensions__=no fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext 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 $as_nop 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 $as_nop 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 fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext fi 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_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 $as_nop MINIX= 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 $as_nop 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 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 $as_nop 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 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 $as_nop 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 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 $as_nop 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 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 $as_nop 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 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 $as_nop 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 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 $as_nop 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 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 $as_nop 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 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 $as_nop 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 $as_nop ac_compiler_gnu=no fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ac_cv_c_compiler_gnu=$ac_compiler_gnu 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 $as_nop 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 $as_nop 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 $as_nop 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 fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ac_c_werror_flag=$ac_save_c_werror_flag 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 $as_nop 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 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 $as_nop 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 $as_nop { 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" fi ac_cv_prog_cc_stdc=$ac_cv_prog_cc_c11 ac_prog_cc_stdc=c11 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 $as_nop 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 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 $as_nop 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 $as_nop { 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" fi ac_cv_prog_cc_stdc=$ac_cv_prog_cc_c99 ac_prog_cc_stdc=c99 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 $as_nop 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 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 $as_nop 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 $as_nop { 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" fi ac_cv_prog_cc_stdc=$ac_cv_prog_cc_c89 ac_prog_cc_stdc=c89 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 $as_nop 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 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 $as_nop 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 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 $as_nop 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. */ char tgetent (); 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 $as_nop ac_cv_search_tgetent=no fi rm conftest.$ac_ext LIBS=$ac_func_search_save_LIBS 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 $as_nop as_fn_error $? "unable to find tgetent() function" "$LINENO" 5 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 $as_nop 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. */ char crypt (); 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 $as_nop ac_cv_search_crypt=no fi rm conftest.$ac_ext LIBS=$ac_func_search_save_LIBS 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 $as_nop as_fn_error $? "unable to find crypt() function" "$LINENO" 5 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 $as_nop 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. */ char openpty (); 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 $as_nop ac_cv_search_openpty=no fi rm conftest.$ac_ext LIBS=$ac_func_search_save_LIBS 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 $as_nop as_fn_error $? "unable to find openpty() function" "$LINENO" 5 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 $as_nop 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. */ char socket (); 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 $as_nop ac_cv_search_socket=no fi rm conftest.$ac_ext LIBS=$ac_func_search_save_LIBS 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 $as_nop as_fn_error $? "unable to find socket() function" "$LINENO" 5 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 $as_nop enable_pam=yes fi @%:@ Check whether --enable-utmp was given. if test ${enable_utmp+y} then : enableval=$enable_utmp; enable_utmp=$enableval else $as_nop enable_utmp=no fi @%:@ Check whether --enable-telnet was given. if test ${enable_telnet+y} then : enableval=$enable_telnet; enable_telnet=$enableval else $as_nop enable_telnet=no fi @%:@ Check whether --enable-socket-dir was given. if test ${enable_socket_dir+y} then : enableval=$enable_socket_dir; enable_socket_dir=$enableval else $as_nop enable_socket_dir=no fi @%:@ Check whether --with-system_screenrc was given. if test ${with_system_screenrc+y} then : withval=$with_system_screenrc; with_system_screenrc=$withval else $as_nop with_system_screenrc=/etc/screenrc fi @%:@ Check whether --with-pty-mode was given. if test ${with_pty_mode+y} then : withval=$with_pty_mode; with_pty_mode=$withval else $as_nop with_pty_mode=0620 fi @%:@ Check whether --with-pty-group was given. if test ${with_pty_group+y} then : withval=$with_pty_group; with_pty_group=$withval else $as_nop with_pty_group=5 fi @%:@ Check whether --with-pty-rofs was given. if test ${with_pty_rofs+y} then : withval=$with_pty_rofs; with_pty_rofs=$withval else $as_nop with_pty_rofs=no 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 $as_nop as_fn_error $? "no" "$LINENO" 5;LIBS="$oldlibs" 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 $as_nop have_utmpx=no 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 $as_nop have_utempter=no 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 $as_nop { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } 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 $as_nop { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } 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 as_nop=: 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 $as_nop case `(set -o) 2>/dev/null` in @%:@( *posix*) : set -o posix ;; @%:@( *) : ;; 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 $as_nop as_fn_append () { eval $1=\$$1\$2 } 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 $as_nop as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } 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_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" 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.1, which was generated by GNU Autoconf 2.71. 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.1 configured by $0, generated by GNU Autoconf 2.71, with options \\"\$ac_cs_config\\" Copyright (C) 2021 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.1/terminfo/0000775000175000017500000000000015011404317013261 5ustar alexalexscreen-5.0.1/terminfo/test.txt0000664000175000017500000011376315011404317015014 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.1/terminfo/tetris.c0000664000175000017500000000267415011404317014750 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.1/terminfo/screeninfo.src0000664000175000017500000000764415011404317016140 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, 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, 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, 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.1/terminfo/README0000664000175000017500000000110215011404317014133 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.1/terminfo/checktc.c0000664000175000017500000001055215011404317015034 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.1/terminfo/8bits0000664000175000017500000000132015011404317014231 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.1/terminfo/screencap0000664000175000017500000000222315011404317015146 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.1/help.c0000664000175000017500000003422615011404317012541 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 ((n = 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.1/install.sh0000775000175000017500000000421315011404317013443 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.1/fileio.c0000664000175000017500000003532215011404317013056 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.1/README0000664000175000017500000000651215011404317012322 0ustar alexalex [If you just got the screen package, it pays to read the file INSTALL] [This intro only describes the most common features to get you started] [A full description of all features is contained in the source package] Short introduction to screen (Version 5.0.1) Send bugreports, fixes, enhancements, t-shirts, money, beer & pizza to screen-devel@gnu.org Screen provides you with an ANSI/vt100 terminal emulator, which can multiplex up to 10 pseudo-terminals. On startup, it executes $SHELL in window 0. Then it reads $HOME/.screenrc to learn configuration, keybindings, and possibly open more windows. C-a ? (help) Show all keybindings. C-a c (screen) Create new windows. C-a SPACE (next) Advance to next window (with wraparound). C-a C-a (other) Toggle between the current and previously displayed windows. C-a 0 (select n) Switch to window n=0 ... 9. ... C-a 9 C-a w (windows) Show a list of window names in the status line. C-a a (meta) Send a literal C-a/C-s/C-q to the C-a s (xoff) process in the window. C-a q (xon) For instance, emacs uses C-a and C-s. C-a l (redisplay) Redraw this window. C-a W (width) Toggle between 80 & 132 columns mode. C-a L (login) Try to toggle the window's utmp-slot. C-a z (suspend) Suspend the whole screen session. C-a x (lockscreen) Execute /usr/bin/lock, $LOCKCMD or a built-in terminal lock. C-a H (log) Log stdout of window n to screenlog.n. C-a C-[ (copy) Start copy mode. Move cursor with h,j,k,l. Set 2 marks with SPACE or y. Abort with ESC. (C-[ is ESC.) Preceeding second mark with an a appends the text to the copy buffer. C-a C-] (paste) Output copy buffer to current window's stdin. C-a < (readbuf) Read the copy buffer from /tmp/screen-exchange. C-a > (writebuf) Write the copy buffer to /tmp/screen-exchange. C-a d (detach) Detach screen. All processes continue and may spool output to their pty's, but screen disconnects from your terminal. C-a D D (pow_detach) Power detach. Disconnect like C-a d but also kill the parent shell. C-a K (kill) Kill a window and send SIGHUP to its process group. Per default this would be C-a C-k, but it is redefined in the demo .screenrc (think of killing a whole line in emacs). C-a : (colon) Online configuration change. See the man page or TeXinfo manual for many more keybindings and commands. screen -r [pid.tty.host|tty.host] Reattach to a specific detached session. The terminal emulator reconfigures according to your $TERMCAP or $TERM settings. When you have multiple screens detached, you must supply the session name. screen -R reattaches to a detached session or (if none) creates a new session. screen -d [pid.tty.host|tty.host] Detach a screen session remotely. Has the same effect as typing 'C-a d' on the controlling terminal. 'screen -D' will power-detach. screen -list screen -ls screen -wipe Show all available sessions and their status. Use -wipe to remove DEAD sessions. If sockets are missing, you may send a SIGCHLD to its 'SCREEN' process and the process will re-establish the socket (think of someone cleaning /tmp thoroughly). screen -h 200 Starts a new screen session and sets the number of lines in the scrollback buffer to 200. The default is 100 lines. screen-5.0.1/kmapdef.h0000664000175000017500000000026415011404317013220 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.1/NEWS.3.50000664000175000017500000001053315011404317012443 0ustar alexalex ---------------------------- What's new in screen-3.5 ? ---------------------------- * Texinfo manpage! Thanks to Jason Merrill. * Screen now has a very large 'configure' script. If you have problems with the resulting configuration please send mail to screen@uni-erlangen.de. * Stackable overlay planes. All commands are available even if you work with an overlay. Thus you can be in copy/paste mode on several windows! * Unification of key bindings and screen commands. All keys now generate commands. * Screen now reads/writes only in asynchronous mode. * ANSI parser speedup code resulting in much faster output of text. * Changed the rc file syntax. Commands now directly affect the current window. The default settings are changed with 'def...' commands. The 'set' keyword no longer exists. Please run the 'newsyntax' script on your old screenrc files! * Emacs style isearch added to copy mode. Try ^A ESC ^R screen ^R ^R to locate the last three occurences of the word 'screen' in the history buffer. * New command 'silence'. Alarms the user whenever there was inactivity for a specified amount of time on a certain window. Useful if you want to wait for a compilation to end. * Much better margin handling: Screen now handles autowrapped lines correctly in the redisplay and copy/paste functions. * New commands for pastebuffer management: 'copy_reg' copies the pastebuffer to a register, 'ins_reg' pastes a register, 'register' fills a register with a string, 'process' stuffs a register into strings input queue. * Autonuke feature. Flush the output buffer if the window gets cleared. Enable this with 'autonuke on'. * Modifications to save memory: Empty attribute and font lines don't get allocated. This is very useful if you have a large scrollback. * Multi display support: You can now attach from more than one terminal to a session with the '-x' option. * New option '-S' to specify socket name. * Experimental multiuser support added: You can start screen in multiuser Mode by prepending the socket name with a '/' (or by the command 'multiuser on'). If another user wants to attach to the screen session, he can do this by prepending the socketname with 'screenuser/'. Of course he must be in the access control list for a successful attach (see the acladd/acldel command). * Extension to the 'screen' command: You can now specify tty lines instead of programs. This can be used for console management. Added the command 'break' to send a break to the tty line. Not really a new feature, but terminal initialisation now works on suns. * Input/output filters added. This has been implemented to allow the user to configure an open tty line, but got soon exended to allow all sorts of filters. For more information read the explanation of the 'exec' command in the man page and check the 'fdpat.ps' document. * Screen can now be started detached (screen -d -m -S sockname). This is useful if you want to start screen in your /etc/rc file (e.g. as a console multiplexer) * Console grabbing added ('console on' command). * Windows can now be selected by akas, too. (Per default bound to the >'< key.) * New terminal capabilitise CS/CE for cursorkey control. * setenv/unsetenv commands added. * Expansion of environment variables ($VAR) and terminal capabilities ($:TC:) in the screenrc files and detach messages. Example: pow_detach_msg "Session of \$LOGNAME \$:cr:\$:nl:ended." * New commands: 'hardcopydir' and 'logdir' to change the output directories, 'partial' and 'allpartial' to make screen only refresh the line containing the cursor if a window is selected (useful for slow modem connections). * Cleanup of the provided termcap/terminfo file. Please install the new one! * The program 'terminfo/checktc.c' does a visual check of a termcap/terminfo entry. Please try it before calling screen and in a screen session. * LOTS of bugfixes and code cleanup. Thanks to all the beta testers who helped porting screen to at least the following platforms: Ultrix, SunOS, Solaris, BSD43, linux, NEWSOS, Irix, OSF/1, Harris CX/UX, hpux, dynix/ptx, AIX. And even more thanks to the brave who attempted to use the 'exec' command features. Donate patches, bugreports, suggestions, money, beer & pizza to screen@uni-erlangen.de screen-5.0.1/tty.c0000664000175000017500000006543215011404317012434 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 #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 ridiculus. 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 originaly 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.1/attacher.c0000664000175000017500000003232415011404317013401 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 "attacher.h" #include #include #include #include #include #include #include #include #include "screen.h" #ifdef ENABLE_PAM #include #endif #include "misc.h" #include "socket.h" #include "tty.h" static int WriteMessage(int, Message *); static void AttacherSigInt(int); static void AttacherWinch(int); static void DoLock(int); static void AttachSigCont(int); static void AttacherFinitBye(int sigsig) __attribute__((__noreturn__)); static bool AttacherPanic = false; static bool ContinuePlease = false; static bool LockPlease = false; static bool SigWinchPlease = false; static bool SuspendPlease = false; static int QueryResult; static void AttachSigCont(int sigsig) { (void)sigsig; /* unused */ ContinuePlease = true; } static void QueryResultSuccess(int sigsig) { (void)sigsig; /* unused */ QueryResult = 1; } static void QueryResultFail(int sigsig) { (void)sigsig; /* unused */ QueryResult = 2; } /* * Send message to a screen backend. * returns 1 if we could attach one, or 0 if none. * Understands MSG_ATTACH, MSG_DETACH, MSG_POW_DETACH * MSG_CONT, MSG_WINCH and nothing else! * * if type == MSG_ATTACH and sockets are used, attaches * tty file descriptor. */ static int WriteMessage(int sock, Message *msg) { ssize_t r, l = sizeof(Message); if (msg->type == MSG_ATTACH) return SendAttachMsg(sock, msg, attach_fd); while (l > 0) { r = write(sock, (char *)msg + (sizeof(Message) - l), l); if (r == -1 && errno == EINTR) continue; if (r == -1 || r == 0) return -1; l -= r; } return 0; } int Attach(int how) { int n, lasts; Message m; struct stat st; char *s; if ((how == MSG_ATTACH || how == MSG_CONT) && multiattach) { real_uid = multi_uid; eff_uid = own_uid; #ifdef HAVE_SETRESUID if (setresuid(multi_uid, own_uid, multi_uid)) Panic(errno, "setresuid"); #else xseteuid(multi_uid); xseteuid(own_uid); #endif } memset((char *)&m, 0, sizeof(Message)); m.type = how; m.protocol_revision = MSG_REVISION; strncpy(m.m_tty, attach_tty_is_in_new_ns ? attach_tty_name_in_ns : attach_tty, ARRAY_SIZE(m.m_tty) - 1); m.m_tty[ARRAY_SIZE(m.m_tty) - 1] = 0; if (how == MSG_WINCH) { if ((lasts = MakeClientSocket(0)) >= 0) { WriteMessage(lasts, &m); close(lasts); } return 0; } if (how == MSG_CONT) { if ((lasts = MakeClientSocket(0)) < 0) { Panic(0, "Sorry, cannot contact session \"%s\" again.\r\n", SocketName); } } else { n = FindSocket(&lasts, NULL, NULL, SocketMatch); switch (n) { case 0: if (rflag && (rflag & 1) == 0) return 0; if (quietflag) eexit(10); if (SocketMatch && *SocketMatch) { Panic(0, "There is no screen to be %sed matching %s.", xflag ? "attach" : dflag ? "detach" : "resum", SocketMatch); } else { Panic(0, "There is no screen to be %sed.", xflag ? "attach" : dflag ? "detach" : "resum"); } /* NOTREACHED */ case 1: break; default: if (rflag < 3) { if (quietflag) eexit(10 + n); Panic(0, "Type \"screen [-d] -r [pid.]tty.host\" to resume one of them."); } /* NOTREACHED */ } } /* * Go in UserContext. Advantage is, you can kill your attacher * when things go wrong. Any disadvantages? jw. * Do this before the attach to prevent races! */ if (!multiattach) { if (setuid(real_uid)) Panic(errno, "setuid"); } else { /* This call to xsetuid should also set the saved uid */ xseteuid(real_uid); /* multi_uid, allow backend to send signals */ } eff_uid = real_uid; if (setgid(real_gid)) Panic(errno, "setgid"); eff_gid = real_gid; MasterPid = 0; for (s = SocketName; *s; s++) { if (*s > '9' || *s < '0') break; MasterPid = 10 * MasterPid + (*s - '0'); } if (stat(SocketPath, &st) == -1) Panic(errno, "stat %s", SocketPath); if ((st.st_mode & 0600) != 0600) Panic(0, "Socket is in wrong mode (%03o)", (int)st.st_mode); /* * Change: if -x or -r ignore failing -d */ if ((xflag || rflag) && dflag && (st.st_mode & 0700) == 0600) dflag = 0; /* * Without -x, the mode must match. * With -x the mode is irrelevant unless -d. */ if ((dflag || !xflag) && (st.st_mode & 0700) != (dflag ? 0700 : 0600)) Panic(0, "That screen is %sdetached.", dflag ? "already " : "not "); if (dflag && (how == MSG_DETACH || how == MSG_POW_DETACH)) { m.m.detach.dpid = getpid(); strncpy(m.m.detach.duser, LoginName, ARRAY_SIZE(m.m.detach.duser) - 1); m.m.detach.duser[ARRAY_SIZE(m.m.detach.duser) - 1] = 0; if (dflag == 2) m.type = MSG_POW_DETACH; else m.type = MSG_DETACH; /* If there is no password for the session, or the user enters the correct * password, then we get a SIGCONT. Otherwise we get a SIG_BYE */ xsignal(SIGCONT, AttachSigCont); if (WriteMessage(lasts, &m)) Panic(errno, "WriteMessage"); close(lasts); while (!ContinuePlease) pause(); /* wait for SIGCONT */ xsignal(SIGCONT, SIG_DFL); ContinuePlease = false; if (how != MSG_ATTACH) return 0; /* we detached it. jw. */ sleep(1); /* we dont want to overrun our poor backend. jw. */ if ((lasts = MakeClientSocket(0)) == -1) Panic(0, "Cannot contact screen again. Sigh."); m.type = how; } strncpy(m.m.attach.envterm, attach_term, MAXTERMLEN); m.m.attach.envterm[MAXTERMLEN] = 0; strncpy(m.m.attach.auser, LoginName, ARRAY_SIZE(m.m.attach.auser) - 1); m.m.attach.auser[ARRAY_SIZE(m.m.attach.auser) - 1] = 0; m.m.attach.esc = DefaultEsc; m.m.attach.meta_esc = DefaultMetaEsc; strncpy(m.m.attach.preselect, preselect ? preselect : "", ARRAY_SIZE(m.m.attach.preselect) - 1); m.m.attach.preselect[ARRAY_SIZE(m.m.attach.preselect) - 1] = 0; m.m.attach.apid = getpid(); m.m.attach.adaptflag = adaptflag; m.m.attach.lines = m.m.attach.columns = 0; if ((s = getenv("LINES"))) m.m.attach.lines = atoi(s); if ((s = getenv("COLUMNS"))) m.m.attach.columns = atoi(s); m.m.attach.encoding = nwin_options.encoding > 0 ? nwin_options.encoding + 1 : 0; if (dflag == 2) m.m.attach.detachfirst = MSG_POW_DETACH; else if (dflag) m.m.attach.detachfirst = MSG_DETACH; else m.m.attach.detachfirst = MSG_ATTACH; /* setup CONT signal handler to repair the terminal mode */ if (multi && (how == MSG_ATTACH || how == MSG_CONT)) xsignal(SIGCONT, AttachSigCont); if (WriteMessage(lasts, &m)) Panic(errno, "WriteMessage"); close(lasts); if (multi && (how == MSG_ATTACH || how == MSG_CONT)) { while (!ContinuePlease) pause(); /* wait for SIGCONT */ xsignal(SIGCONT, SIG_DFL); ContinuePlease = false; } rflag = 0; return 1; } static void AttacherSigAlarm(int sigsig) { (void)sigsig; /* unused */ } /* * the frontend's Interrupt handler * we forward SIGINT to the poor backend */ static void AttacherSigInt(int sigsig) { (void)sigsig; /* unused */ xsignal(SIGINT, AttacherSigInt); Kill(MasterPid, SIGINT); } /* * Unfortunately this is also the SIGHUP handler, so we have to * check if the backend is already detached. */ void AttacherFinit(int sigsig) { struct stat statb; Message m; int s; (void)sigsig; /* unused */ xsignal(SIGHUP, SIG_IGN); /* Check if signal comes from backend */ if (stat(SocketPath, &statb) == 0 && (statb.st_mode & 0777) != 0600) { memset((char *)&m, 0, sizeof(Message)); strncpy(m.m_tty, attach_tty_is_in_new_ns ? attach_tty_name_in_ns : attach_tty, ARRAY_SIZE(m.m_tty) - 1); m.m_tty[ARRAY_SIZE(m.m_tty) - 1] = 0; m.m.detach.dpid = getpid(); m.type = MSG_HANGUP; m.protocol_revision = MSG_REVISION; if ((s = MakeClientSocket(0)) >= 0) { WriteMessage(s, &m); close(s); } } exit(0); } static void AttacherFinitBye(int sigsig) { pid_t ppid; (void)sigsig; /* unused */ if (setgid(real_gid)) Panic(errno, "setgid"); if (setuid(own_uid)) Panic(errno, "setuid"); /* we don't want to disturb init (even if we were root), eh? jw */ if ((ppid = getppid()) > 1) Kill(ppid, SIGHUP); /* carefully say good bye. jw. */ exit(0); } static void SigStop(int sigsig) { (void)sigsig; /* unused */ SuspendPlease = true; } static void DoLock(int sigsig) { (void)sigsig; /* unused */ LockPlease = true; } static void AttacherWinch(int sigsig) { (void)sigsig; /* unused */ SigWinchPlease = true; } /* * Attacher loop - no return */ void Attacher(void) { xsignal(SIGHUP, AttacherFinit); xsignal(SIG_BYE, AttacherFinit); xsignal(SIG_POWER_BYE, AttacherFinitBye); xsignal(SIG_LOCK, DoLock); xsignal(SIGINT, AttacherSigInt); xsignal(SIG_STOP, SigStop); xsignal(SIGWINCH, AttacherWinch); dflag = 0; xflag = 1; for (;;) { xsignal(SIGALRM, AttacherSigAlarm); alarm(15); pause(); alarm(0); if (kill(MasterPid, 0) < 0 && errno != EPERM) { AttacherPanic = true; } if (AttacherPanic) { fcntl(0, F_SETFL, 0); SetTTY(0, &attach_Mode); printf("\nError: Cannot find master process to attach to!\n"); eexit(1); } if (SuspendPlease) { SuspendPlease = false; xsignal(SIGTSTP, SIG_DFL); kill(getpid(), SIGTSTP); xsignal(SIG_STOP, SigStop); (void)Attach(MSG_CONT); } if (LockPlease) { LockPlease = false; (void)Attach(MSG_CONT); } if (SigWinchPlease) { SigWinchPlease = false; (void)Attach(MSG_WINCH); } } } void SendCmdMessage(char *sty, char *match, char **av, int query) { int i, s; Message m; char *p; int n; if (sty == NULL) { i = FindSocket(&s, NULL, NULL, match); if (i == 0) Panic(0, "No screen session found."); if (i != 1) Panic(0, "Use -S to specify a session."); } else { 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 = query ? MSG_QUERY : MSG_COMMAND; if (attach_tty) { strncpy(m.m_tty, attach_tty_is_in_new_ns ? attach_tty_name_in_ns : attach_tty, ARRAY_SIZE(m.m_tty) - 1); m.m_tty[ARRAY_SIZE(m.m_tty) - 1] = 0; } p = m.m.command.cmd; n = 0; size_t space_left = ARRAY_SIZE(m.m.command.cmd); for (; *av && n < MAXARGS - 1; ++av, ++n) { int printed = snprintf(p, space_left, "%s", *av); if (printed < 0 || (size_t)printed >= space_left) Panic(0, "Total length of the command to send too large.\n"); printed += 1; // add null terminator p += printed; space_left -= printed; } *p = 0; m.m.command.nargs = n; strncpy(m.m.attach.auser, LoginName, ARRAY_SIZE(m.m.attach.auser) - 1); m.m.command.auser[ARRAY_SIZE(m.m.command.auser) - 1] = 0; m.protocol_revision = MSG_REVISION; strncpy(m.m.command.preselect, preselect ? preselect : "", ARRAY_SIZE(m.m.command.preselect) - 1); m.m.command.preselect[ARRAY_SIZE(m.m.command.preselect) - 1] = 0; m.m.command.apid = getpid(); if (query) { /* Create a server socket so we can get back the result */ char *sp = SocketPath + strlen(SocketPath); char query[] = "-queryX"; char c; int r = -1; for (c = 'A'; c <= 'Z'; c++) { query[6] = c; strncpy(sp, query, strlen(SocketPath)); if ((r = MakeServerSocket()) >= 0) break; } if (r < 0) { for (c = '0'; c <= '9'; c++) { query[6] = c; strncpy(sp, query, strlen(SocketPath)); if ((r = MakeServerSocket()) >= 0) break; } } if (r < 0) Panic(0, "Could not create a listening socket to read the results."); strncpy(m.m.command.writeback, SocketPath, ARRAY_SIZE(m.m.command.writeback) - 1); m.m.command.writeback[ARRAY_SIZE(m.m.command.writeback) - 1] = '\0'; /* Send the message, then wait for a response */ xsignal(SIGCONT, QueryResultSuccess); xsignal(SIG_BYE, QueryResultFail); if (WriteMessage(s, &m)) Msg(errno, "write"); close(s); while (!QueryResult) pause(); xsignal(SIGCONT, SIG_DFL); xsignal(SIG_BYE, SIG_DFL); /* Read the result and spit it out to stdout */ ReceiveRaw(r); close(r); unlink(SocketPath); if (QueryResult == 2) /* An error happened */ exit(1); } else { if (WriteMessage(s, &m)) Msg(errno, "write"); close(s); } } screen-5.0.1/display.c0000664000175000017500000020523515011404317013256 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 "display.h" #include #include #include #include #include #include #include #include #include #include "screen.h" #include "canvas.h" #include "encoding.h" #include "mark.h" #include "misc.h" #include "process.h" #include "pty.h" #include "resize.h" #include "termcap.h" #include "tty.h" #include "winmsg.h" /* CSI parsing status */ enum { CSI_PB=0, CSI_PX=1, CSI_PY=2, CSI_DONE=3, CSI_ESC_SEEN, CSI_BEGIN, CSI_INACTIVE, CSI_INVALID }; static int CountChars(int); static int DoAddChar(int); static int BlankResize(int, int); static void disp_readev_fn(Event *, void *); static void disp_writeev_fn(Event *, void *); static void disp_writeev_eagain(Event *, void *); static void disp_status_fn(Event *, void *); static void disp_hstatus_fn(Event *, void *); static void disp_blocked_fn(Event *, void *); static void disp_map_fn(Event *, void *); static void disp_idle_fn(Event *, void *); static void disp_blanker_fn(Event *, void *); static void disp_mousetimeout_fn(Event *, void *); static void disp_processinput (Display *, unsigned char *, size_t); static void WriteLP(int, int); static void INSERTCHAR(uint32_t); static void RAW_PUTCHAR(uint32_t); static void SetBackColor(int); static void RemoveStatusMinWait(void); Display *display, *displays; /* * The default values */ bool defautonuke = false; int defobuflimit = OBUF_MAX; int defnonblock = -1; int defmousetrack = 0; int defbracketed = 0; int defcursorstyle = 0; int captionalways = 0; int captiontop = 0; int hardstatusemu = HSTATUS_IGNORE; struct statusposstr statuspos = { STATUS_BOTTOM, STATUS_LEFT }; int focusminwidth, focusminheight; /* * Default layer management */ void DefProcess(char **bufp, size_t *lenp) { *bufp += *lenp; *lenp = 0; } void DefRedisplayLine(int y, int xs, int xe, int isblank) { if (isblank == 0 && y >= 0) DefClearLine(y, xs, xe, 0); } void DefClearLine(int y, int xs, int xe, int bce) { LClearLine(flayer, y, xs, xe, bce, NULL); } int DefResize(int width, int height) { (void)width; /* unused */ (void)height; /* unused */ return -1; } void DefRestore(void) { LAY_DISPLAYS(flayer, InsertMode(false)); /* ChangeScrollRegion(0, D_height - 1); */ LKeypadMode(flayer, 0); LCursorkeysMode(flayer, 0); LCursorVisibility(flayer, 0); LMouseMode(flayer, 0); LExtMouseMode(flayer, 0); LBracketedPasteMode(flayer, false); LCursorStyle(flayer, 0); LSetRendition(flayer, &mchar_null); LSetFlow(flayer, nwin_default.flowflag & FLOW_ON); } /* * Blank layer management */ const struct LayFuncs BlankLf = { DefProcess, NULL, DefRedisplayLine, DefClearLine, BlankResize, DefRestore, NULL }; static int BlankResize(int wi, int he) { flayer->l_width = wi; flayer->l_height = he; return 0; } /* * Generate new display, start with a blank layer. * The termcap arrays are not initialised here. * The new display is placed in the displays list. */ Display *MakeDisplay(char *uname, char *utty, char *term, int fd, pid_t pid, struct mode *Mode) { struct acluser **u; if (!*(u = FindUserPtr(uname)) && UserAdd(uname, u)) return NULL; /* could not find or add user */ if ((display = calloc(1, sizeof(Display))) == NULL) return NULL; display->d_next = displays; displays = display; D_flow = 1; D_nonblock = defnonblock; D_userfd = fd; D_readev.fd = D_writeev.fd = fd; D_readev.type = EV_READ; D_writeev.type = EV_WRITE; D_readev.data = D_writeev.data = (char *)display; D_readev.handler = disp_readev_fn; D_writeev.handler = disp_writeev_fn; evenq(&D_readev); D_writeev.condpos = &D_obuflen; D_writeev.condneg = &D_obuffree; evenq(&D_writeev); D_statusev.type = EV_TIMEOUT; D_statusev.data = (char *)display; D_statusev.handler = disp_status_fn; D_hstatusev.type = EV_TIMEOUT; D_hstatusev.data = (char *)display; D_hstatusev.handler = disp_hstatus_fn; D_blockedev.type = EV_TIMEOUT; D_blockedev.data = (char *)display; D_blockedev.handler = disp_blocked_fn; D_blockedev.condpos = &D_obuffree; D_blockedev.condneg = &D_obuflenmax; D_mapev.type = EV_TIMEOUT; D_mapev.data = (char *)display; D_mapev.handler = disp_map_fn; D_idleev.type = EV_TIMEOUT; D_idleev.data = (char *)display; D_idleev.handler = disp_idle_fn; D_blankerev.type = EV_READ; D_blankerev.data = (char *)display; D_blankerev.handler = disp_blanker_fn; D_blankerev.fd = -1; D_mousetimeoutev.type = EV_TIMEOUT; D_mousetimeoutev.data = (char *)display; D_mousetimeoutev.handler = disp_mousetimeout_fn; D_OldMode = *Mode; D_status_obuffree = -1; Resize_obuf(); /* Allocate memory for buffer */ D_obufmax = defobuflimit; D_obuflenmax = D_obuflen - D_obufmax; D_auto_nuke = defautonuke; D_obufp = D_obuf; D_printfd = -1; D_userpid = pid; strncpy(D_usertty, utty, ARRAY_SIZE(D_usertty) - 1); D_usertty[ARRAY_SIZE(D_usertty) - 1] = 0; strncpy(D_termname, term, MAXTERMLEN); D_termname[MAXTERMLEN] = 0; D_user = *u; D_processinput = ProcessInput; D_mousetrack = defmousetrack; D_bracketed = defbracketed; D_cursorstyle = defcursorstyle; return display; } void FreeDisplay(void) { Display *d, **dp; FreeTransTable(); KillBlanker(); if (D_userfd >= 0) { Flush(3); if (!display) return; SetTTY(D_userfd, &D_OldMode); fcntl(D_userfd, F_SETFL, 0); } freetty(); if (D_tentry) free(D_tentry); D_tentry = NULL; if (D_processinputdata) free(D_processinputdata); D_processinputdata = NULL; D_tcinited = 0; evdeq(&D_hstatusev); evdeq(&D_statusev); evdeq(&D_readev); evdeq(&D_writeev); evdeq(&D_blockedev); evdeq(&D_mapev); if (D_kmaps) { free(D_kmaps); D_kmaps = NULL; D_aseqs = 0; D_nseqs = 0; D_seqp = NULL; D_seql = 0; D_seqh = NULL; } evdeq(&D_idleev); evdeq(&D_blankerev); for (dp = &displays; (d = *dp); dp = &d->d_next) if (d == display) break; if (D_status_lastmsg) free(D_status_lastmsg); if (D_obuf) free(D_obuf); *dp = display->d_next; while (D_canvas.c_slperp) FreeCanvas(D_canvas.c_slperp); D_cvlist = NULL; for (Window *p = mru_window; p; p = p->w_prev_mru) { if (p->w_pdisplay == display) p->w_pdisplay = NULL; if (p->w_lastdisp == display) p->w_lastdisp = NULL; if (p->w_readev.condneg == (int *)&D_status || p->w_readev.condneg == &D_obuflenmax) p->w_readev.condpos = p->w_readev.condneg = NULL; } for (Window *p = mru_window; p; p = p->w_prev_mru) if (p->w_zdisplay == display) zmodem_abort(p, NULL); if (D_mousetrack) { D_mousetrack = 0; MouseMode(0); ExtMouseMode(0); } free((char *)display); display = NULL; } /* * if the adaptflag is on, we keep the size of this display, else * we may try to restore our old window sizes. */ void InitTerm(int adapt) { D_top = D_bot = -1; AddCStr(D_IS); AddCStr(D_TI); /* Check for toggle */ if (D_IM && strcmp(D_IM, D_EI)) AddCStr(D_EI); D_insert = 0; AddCStr(D_KS); AddCStr(D_CCS); D_keypad = 0; D_cursorkeys = 0; AddCStr(D_ME); AddCStr(D_EA); AddCStr(D_CE0); D_rend = mchar_null; D_atyp = 0; if (adapt == 0) ResizeDisplay(D_defwidth, D_defheight); ChangeScrollRegion(0, D_height - 1); D_x = D_y = 0; Flush(3); ClearAll(); /* In case the size was changed by a init sequence */ CheckScreenSize((adapt) ? 2 : 0); } void FinitTerm(void) { KillBlanker(); if (D_tcinited) { ResizeDisplay(D_defwidth, D_defheight); InsertMode(false); ChangeScrollRegion(0, D_height - 1); KeypadMode(0); CursorkeysMode(0); CursorVisibility(0); if (D_mousetrack) D_mousetrack = 0; MouseMode(0); ExtMouseMode(0); BracketedPasteMode(false); CursorStyle(0); SetRendition(&mchar_null); SetFlow(FLOW_ON); AddCStr(D_KE); AddCStr(D_CCE); if (D_hstatus) ShowHStatus(NULL); ClearAllXtermOSC(); D_x = D_y = -1; GotoPos(0, D_height - 1); AddChar('\r'); AddChar('\n'); AddCStr(D_TE); } Flush(3); } static void INSERTCHAR(uint32_t c) { if (!D_insert && D_x < D_width - 1) { if (D_IC || D_CIC) { if (D_IC) AddCStr(D_IC); else AddCStr2(D_CIC, 1); RAW_PUTCHAR(c); return; } InsertMode(true); if (!D_insert) { RefreshLine(D_y, D_x, D_width - 1, 0); return; } } RAW_PUTCHAR(c); } void PUTCHAR(uint32_t c) { if (D_insert && D_x < D_width - 1) InsertMode(false); RAW_PUTCHAR(c); } void PUTCHARLP(uint32_t c) { if (D_x < D_width - 1) { if (D_insert) InsertMode(false); RAW_PUTCHAR(c); return; } if (D_CLP || D_y != D_bot) { int y = D_y; RAW_PUTCHAR(c); if (D_AM && !D_CLP) GotoPos(D_width - 1, y); return; } D_lp_missing = 1; D_rend.image = c; D_lpchar = D_rend; /* XXX -> PutChar ? */ if (D_mbcs) { D_lpchar.mbcs = c; D_lpchar.image = D_mbcs; D_mbcs = 0; D_x--; } } /* * RAW_PUTCHAR() is for all text that will be displayed. * NOTE: charset Nr. 0 has a conversion table, but c1, c2, ... don't. */ static void RAW_PUTCHAR(uint32_t c) { if (D_encoding == UTF8) { if (D_mbcs) { c = D_mbcs; if (D_x == D_width) D_x += D_AM ? 1 : -1; D_mbcs = 0; } else if (utf8_isdouble(c)) { D_mbcs = c; D_x++; return; } if (c < 32) { AddCStr2(D_CS0, '0'); AddChar(c + 0x5f); AddCStr(D_CE0); goto addedutf8; } if (c < 0x80) { if (D_xtable && D_xtable[(int)(unsigned char)D_rend.font] && D_xtable[(int)(unsigned char)D_rend.font][(int)(unsigned char)c]) AddStr(D_xtable[(int)(unsigned char)D_rend.font][(int)(unsigned char)c]); else AddChar(c); } else AddUtf8(c); goto addedutf8; } if (is_dw_font(D_rend.font)) { int t = c; if (D_mbcs == 0) { D_mbcs = c; D_x++; return; } D_x--; if (D_x == D_width - 1) D_x += D_AM ? 1 : -1; c = D_mbcs; D_mbcs = t; } if (D_encoding) c = PrepareEncodedChar(c); kanjiloop: if (D_xtable && D_xtable[(int)(unsigned char)D_rend.font] && D_xtable[(int)(unsigned char)D_rend.font][(int)(unsigned char)c]) AddStr(D_xtable[(int)(unsigned char)D_rend.font][(int)(unsigned char)c]); else AddChar(D_rend.font != '0' ? c : (uint32_t)D_c0_tab[(int)(unsigned char)c]); addedutf8: if (++D_x >= D_width) { if (D_AM == 0) D_x = D_width - 1; else if (!D_CLP || D_x > D_width) { D_x -= D_width; if (D_y < D_height - 1 && D_y != D_bot) D_y++; } } if (D_mbcs) { c = D_mbcs; D_mbcs = 0; goto kanjiloop; } } static int DoAddChar(int c) { /* this is for ESC-sequences only (AddChar is a macro) */ AddChar(c); return c; } void AddCStr(char *s) { if (display && s && *s) { tputs(s, 1, DoAddChar); } } void AddCStr2(char *s, int c) { if (display && s && *s) { tputs(tgoto(s, 0, c), 1, DoAddChar); } } /* Insert mode is a toggle on some terminals, so we need this hack: */ void InsertMode(bool on) { if (display && on != D_insert && D_IM) { D_insert = on; if (on) AddCStr(D_IM); else AddCStr(D_EI); } } /* ...and maybe keypad application mode is a toggle, too: */ void KeypadMode(int on) { if (display) D_keypad = on; } void CursorkeysMode(int on) { if (display) D_cursorkeys = on; } void ReverseVideo(bool on) { if (display && D_revvid != on && D_CVR) { D_revvid = on; if (D_revvid) AddCStr(D_CVR); else AddCStr(D_CVN); } } void CursorVisibility(int v) { if (display && D_curvis != v) { if (D_curvis) AddCStr(D_VE); /* do this always, just to be safe */ D_curvis = 0; if (v == -1 && D_VI) AddCStr(D_VI); else if (v == 1 && D_VS) AddCStr(D_VS); else return; D_curvis = v; } } void MouseMode(int mode) { if (!display) return; if (mode < D_mousetrack) mode = D_mousetrack; if (D_mouse != mode) { char mousebuf[20]; if (!D_CXT) return; if (D_mouse) { sprintf(mousebuf, "\033[?%dl", D_mouse); AddStr(mousebuf); } if (mode) { sprintf(mousebuf, "\033[?%dh", mode); AddStr(mousebuf); } D_mouse = mode; D_mouse_parse.state = CSI_INACTIVE; } } void ExtMouseMode(int mode) { if (display && D_extmouse != mode) { char mousebuf[20]; if (!D_CXT) return; if (D_extmouse) { sprintf(mousebuf, "\033[?%dl", D_extmouse); AddStr(mousebuf); } if (mode) { sprintf(mousebuf, "\033[?%dh", mode); AddStr(mousebuf); } D_extmouse = mode; D_mouse_parse.state = CSI_INACTIVE; } } void BracketedPasteMode(bool mode) { if (!display) return; if (D_bracketed != mode) { if (!D_CXT) return; if (D_bracketed) { AddStr("\033[?2004l"); } if (mode) { AddStr("\033[?2004h"); } D_bracketed = mode; } } void CursorStyle(int mode) { char buf[32]; if (!display) return; if (D_cursorstyle != mode) { if (!D_CXT) return; if (mode < 0) return; sprintf(buf, "\033[%d q", mode); AddStr(buf); D_cursorstyle = mode; } } static int StrCost; static int CountChars(int c) { StrCost++; return c; } int CalcCost(char *s) { if (s) { StrCost = 0; tputs(s, 1, CountChars); return StrCost; } else return EXPENSIVE; } void GotoPos(int x2, int y2) { int dy, dx, x1, y1; int costx, costy; int m; char *s; int CMcost; enum move_t xm = M_NONE, ym = M_NONE; if (!display) return; x1 = D_x; y1 = D_y; if (x1 == D_width) { if (D_CLP && D_AM) x1 = -1; /* don't know how the terminal treats this */ else x1--; } if (x2 == D_width) x2--; dx = x2 - x1; dy = y2 - y1; if (dy == 0 && dx == 0) return; if (!D_MS) /* Safe to move ? */ SetRendition(&mchar_null); if (y1 < 0 /* don't know the y position */ || (y2 > D_bot && y1 <= D_bot) /* have to cross border */ ||(y2 < D_top && y1 >= D_top)) { /* of scrollregion ? */ DoCM: if (D_HO && !x2 && !y2) AddCStr(D_HO); else AddCStr(tgoto(D_CM, x2, y2)); D_x = x2; D_y = y2; return; } /* some scrollregion implementations don't allow movements * away from the region. sigh. */ if ((y1 > D_bot && y2 > y1) || (y1 < D_top && y2 < y1)) goto DoCM; /* Calculate CMcost */ if (D_HO && !x2 && !y2) s = D_HO; else s = tgoto(D_CM, x2, y2); CMcost = CalcCost(s); /* Calculate the cost to move the cursor to the right x position */ costx = EXPENSIVE; if (x1 >= 0) { /* relative x positioning only if we know where we are */ if (dx > 0) { if (D_CRI && (dx > 1 || !D_ND)) { costx = CalcCost(tgoto(D_CRI, 0, dx)); xm = M_CRI; } if ((m = D_NDcost * dx) < costx) { costx = m; xm = M_RI; } } else if (dx < 0) { if (D_CLE && (dx < -1 || !D_BC)) { costx = CalcCost(tgoto(D_CLE, 0, -dx)); xm = M_CLE; } if ((m = -dx * D_LEcost) < costx) { costx = m; xm = M_LE; } } else costx = 0; } if (x2 + D_CRcost < costx && (m = (D_CRcost < costx))) { costx = EXPENSIVE; xm = M_CR; } /* Check if it is already cheaper to do CM */ if (costx >= CMcost) goto DoCM; /* Calculate the cost to move the cursor to the right y position */ costy = EXPENSIVE; if (dy > 0) { if (D_CDO && dy > 1) { /* DO & NL are always != 0 */ costy = CalcCost(tgoto(D_CDO, 0, dy)); ym = M_CDO; } if ((m = dy * ((x2 == 0) ? D_NLcost : D_DOcost)) < costy) { costy = m; ym = M_DO; } } else if (dy < 0) { if (D_CUP && (dy < -1 || !D_UP)) { costy = CalcCost(tgoto(D_CUP, 0, -dy)); ym = M_CUP; } if ((m = -dy * D_UPcost) < costy) { costy = m; ym = M_UP; } } else costy = 0; /* Finally check if it is cheaper to do CM */ if (costx + costy >= CMcost) goto DoCM; switch (xm) { case M_LE: while (dx++ < 0) AddCStr(D_BC); break; case M_CLE: AddCStr2(D_CLE, -dx); break; case M_RI: while (dx-- > 0) AddCStr(D_ND); break; case M_CRI: AddCStr2(D_CRI, dx); break; case M_CR: AddCStr(D_CR); D_x = 0; /* FALLTHROUGH */ case M_RW: break; default: break; } switch (ym) { case M_UP: while (dy++ < 0) AddCStr(D_UP); break; case M_CUP: AddCStr2(D_CUP, -dy); break; case M_DO: s = (x2 == 0) ? D_NL : D_DO; while (dy-- > 0) AddCStr(s); break; case M_CDO: AddCStr2(D_CDO, dy); break; default: break; } D_x = x2; D_y = y2; } void ClearAll(void) { ClearArea(0, 0, 0, D_width - 1, D_width - 1, D_height - 1, 0, 0); } void ClearArea(int x1, int y1, int xs, int xe, int x2, int y2, int bce, int uselayfn) { int xxe; Canvas *cv; Viewport *vp; if (x1 == D_width) x1--; if (x2 == D_width) x2--; if (xs == -1) xs = x1; if (xe == -1) xe = x2; if (D_UT) /* Safe to erase ? */ SetRendition(&mchar_null); if (D_BE) SetBackColor(bce); if (D_lp_missing && y1 <= D_bot && xe >= D_width - 1) { if (y2 > D_bot || (y2 == D_bot && x2 >= D_width - 1)) D_lp_missing = 0; } if (x2 == D_width - 1 && (xs == 0 || y1 == y2) && xe == D_width - 1 && y2 == D_height - 1 && (!bce || D_BE)) { if (x1 == 0 && y1 == 0 && D_auto_nuke) NukePending(); if (x1 == 0 && y1 == 0 && D_CL) { AddCStr(D_CL); D_y = D_x = 0; return; } /* * Workaround a hp700/22 terminal bug. Do not use CD where CE * is also appropriate. */ if (D_CD && (y1 < y2 || !D_CE)) { GotoPos(x1, y1); AddCStr(D_CD); return; } } if (x1 == 0 && xs == 0 && (xe == D_width - 1 || y1 == y2) && y1 == 0 && D_CCD && (!bce || D_BE)) { GotoPos(x1, y1); AddCStr(D_CCD); return; } xxe = xe; for (int y = y1; y <= y2; y++, x1 = xs) { if (y == y2) xxe = x2; if (x1 == 0 && D_CB && (xxe != D_width - 1 || (D_x == xxe && D_y == y)) && (!bce || D_BE)) { GotoPos(xxe, y); AddCStr(D_CB); continue; } if (xxe == D_width - 1 && D_CE && (!bce || D_BE)) { GotoPos(x1, y); AddCStr(D_CE); continue; } if (uselayfn) { vp = NULL; for (cv = D_cvlist; cv; cv = cv->c_next) { if (y < cv->c_ys || y > cv->c_ye || xxe < cv->c_xs || x1 > cv->c_xe) continue; for (vp = cv->c_vplist; vp; vp = vp->v_next) if (y >= vp->v_ys && y <= vp->v_ye && xxe >= vp->v_xs && x1 <= vp->v_xe) break; if (vp) break; } if (cv && cv->c_layer && x1 >= vp->v_xs && xxe <= vp->v_xe && y - vp->v_yoff >= 0 && y - vp->v_yoff < cv->c_layer->l_height && xxe - vp->v_xoff >= 0 && x1 - vp->v_xoff < cv->c_layer->l_width) { Layer *oldflayer = flayer; Canvas *cvlist, *cvlnext; flayer = cv->c_layer; cvlist = flayer->l_cvlist; cvlnext = cv->c_lnext; flayer->l_cvlist = cv; cv->c_lnext = NULL; LayClearLine(y - vp->v_yoff, x1 - vp->v_xoff, xxe - vp->v_xoff, bce); flayer->l_cvlist = cvlist; cv->c_lnext = cvlnext; flayer = oldflayer; continue; } } ClearLine(NULL, y, x1, xxe, bce); } } /* * if cur_only > 0, we only redisplay current line, as a full refresh is * too expensive over a low baud line. */ void Redisplay(int cur_only) { /* XXX do em all? */ InsertMode(false); ChangeScrollRegion(0, D_height - 1); KeypadMode(0); CursorkeysMode(0); CursorVisibility(0); MouseMode(0); ExtMouseMode(0); BracketedPasteMode(false); CursorStyle(0); SetRendition(&mchar_null); SetFlow(FLOW_ON); ClearAll(); RefreshXtermOSC(); if (cur_only > 0 && D_fore) RefreshArea(0, D_fore->w_y, D_width - 1, D_fore->w_y, 1); else RefreshAll(1); RefreshHStatus(); CV_CALL(D_forecv, LayRestore(); LaySetCursor()); } void RedisplayDisplays(int cur_only) { Display *olddisplay = display; for (display = displays; display; display = display->d_next) Redisplay(cur_only); display = olddisplay; } /* XXX: use oml! */ void ScrollH(int y, int xs, int xe, int n, int bce, struct mline *oml) { (void)oml; /* unused */ if (n == 0) return; if (xe != D_width - 1) { RefreshLine(y, xs, xe, 0); /* UpdateLine(oml, y, xs, xe); */ return; } GotoPos(xs, y); if (D_UT) SetRendition(&mchar_null); if (D_BE) SetBackColor(bce); if (n > 0) { if (n >= xe - xs + 1) n = xe - xs + 1; if (D_CDC && !(n == 1 && D_DC)) AddCStr2(D_CDC, n); else if (D_DC) { for (int i = n; i--;) AddCStr(D_DC); } else { RefreshLine(y, xs, xe, 0); /* UpdateLine(oml, y, xs, xe); */ return; } } else { if (-n >= xe - xs + 1) n = -(xe - xs + 1); if (!D_insert) { if (D_CIC && !(n == -1 && D_IC)) AddCStr2(D_CIC, -n); else if (D_IC) { for (int i = -n; i--;) AddCStr(D_IC); } else if (D_IM) { InsertMode(true); SetRendition(&mchar_null); SetBackColor(bce); for (int i = -n; i--;) INSERTCHAR(' '); bce = 0; /* all done */ } else { /* UpdateLine(oml, y, xs, xe); */ RefreshLine(y, xs, xe, 0); return; } } else { SetRendition(&mchar_null); SetBackColor(bce); for (int i = -n; i--;) INSERTCHAR(' '); bce = 0; /* all done */ } } if (bce && !D_BE) { if (n > 0) ClearLine(NULL, y, xe - n + 1, xe, bce); else ClearLine(NULL, y, xs, xs - n - 1, bce); } if (D_lp_missing && y == D_bot) { if (n > 0) WriteLP(D_width - 1 - n, y); D_lp_missing = 0; } } void ScrollV(int xs, int ys, int xe, int ye, int n, int bce) { int up; int /*oldtop,*/ oldbot; int alok, dlok, aldlfaster; int missy = 0; if (n == 0) return; if (n >= ye - ys + 1 || -n >= ye - ys + 1) { ClearArea(xs, ys, xs, xe, xe, ye, bce, 0); return; } if (xs > D_vpxmin || xe < D_vpxmax) { RefreshArea(xs, ys, xe, ye, 0); return; } if (D_lp_missing) { if (D_bot > ye || D_bot < ys) missy = D_bot; else { missy = D_bot - n; if (missy > ye || missy < ys) D_lp_missing = 0; } } up = 1; if (n < 0) { up = 0; n = -n; } if (n >= ye - ys + 1) n = ye - ys + 1; /* oldtop = D_top; */ oldbot = D_bot; if (ys < D_top || D_bot != ye) ChangeScrollRegion(ys, ye); alok = (D_AL || D_CAL || (ys >= D_top && ye == D_bot && up)); dlok = (D_DL || D_CDL || (ys >= D_top && ye == D_bot && !up)); if (D_top != ys && !(alok && dlok)) ChangeScrollRegion(ys, ye); if (D_lp_missing && (oldbot != D_bot || (oldbot == D_bot && up && D_top == ys && D_bot == ye))) { WriteLP(D_width - 1, oldbot); if (oldbot == D_bot) { /* have scrolled */ if (--n == 0) { /* XXX ChangeScrollRegion(oldtop, oldbot); */ if (bce && !D_BE) ClearLine(NULL, ye, xs, xe, bce); return; } } } if (D_UT) SetRendition(&mchar_null); if (D_BE) SetBackColor(bce); aldlfaster = (n > 1 && ys >= D_top && ye == D_bot && ((up && D_CDL) || (!up && D_CAL))); if ((up || D_SR) && D_top == ys && D_bot == ye && !aldlfaster) { if (up) { GotoPos(0, ye); for (int i = n; i-- > 0;) AddCStr(D_NL); /* was SF, I think NL is faster */ } else { GotoPos(0, ys); for (int i = n; i-- > 0;) AddCStr(D_SR); } } else if (alok && dlok) { if (up || ye != D_bot) { GotoPos(0, up ? ys : ye + 1 - n); if (D_CDL && !(n == 1 && D_DL)) AddCStr2(D_CDL, n); else for (int i = n; i--;) AddCStr(D_DL); } if (!up || ye != D_bot) { GotoPos(0, up ? ye + 1 - n : ys); if (D_CAL && !(n == 1 && D_AL)) AddCStr2(D_CAL, n); else for (int i = n; i--;) AddCStr(D_AL); } } else { RefreshArea(xs, ys, xe, ye, 0); return; } if (bce && !D_BE) { if (up) ClearArea(xs, ye - n + 1, xs, xe, xe, ye, bce, 0); else ClearArea(xs, ys, xs, xe, xe, ys + n - 1, bce, 0); } if (D_lp_missing && missy != D_bot) WriteLP(D_width - 1, missy); /* XXX ChangeScrollRegion(oldtop, oldbot); if (D_lp_missing && missy != D_bot) WriteLP(D_width - 1, missy); */ } void SetAttr(int new) { int i, j, old, typ; old = D_rend.attr; if (!display) return; if (old == new) return; D_rend.attr = new; typ = D_atyp; if ((new & old) != old) { if ((typ & ATYP_U)) AddCStr(D_UE); if ((typ & ATYP_S)) AddCStr(D_SE); if ((typ & ATYP_M)) { AddCStr(D_ME); /* ansi attrib handling: \E[m resets color, too */ if (D_hascolor) D_rend.colorbg = D_rend.colorfg = 0; if (!D_CG0) { /* D_ME may also reset the alternate charset */ D_rend.font = 0; D_realfont = 0; } } old = 0; typ = 0; } old ^= new; for (i = 0, j = 1; old && i < NATTR; i++, j <<= 1) { if ((old & j) == 0) continue; old ^= j; if (D_attrtab[i]) { AddCStr(D_attrtab[i]); typ |= D_attrtyp[i]; } } D_atyp = typ; } void SetFont(int new) { int old = D_rend.font; if (!display || old == new) return; D_rend.font = new; if (D_encoding && CanEncodeFont(D_encoding, new)) return; if (new == D_realfont) return; D_realfont = new; if (D_xtable && D_xtable[(int)(unsigned char)new] && D_xtable[(int)(unsigned char)new][256]) { AddCStr(D_xtable[(int)(unsigned char)new][256]); return; } if (!D_CG0 && new != '0') { new = ASCII; if (old == new) return; } if (new == ASCII) AddCStr(D_CE0); else if (new < ' ') { AddStr("\033$"); if (new > 2) AddChar('('); AddChar(new + '@'); } else AddCStr2(D_CS0, new); } int color256to16(int color) { int min, max; int r, g, b; if (color >= 232) { color = (color - 232) / 6; color = (color & 1) << 3 | (color & 2 ? 7 : 0); } else if (color >= 16) { color -= 16; r = color / 36; g = (color / 6) % 6; b = color % 6; min = r < g ? (r < b ? r : b) : (g < b ? g : b); max = r > g ? (r > b ? r : b) : (g > b ? g : b); if (min == max) color = ((max + 1) & 2) << 2 | ((max + 1) & 4 ? 7 : 0); else color = (b - min) / (max - min) << 2 | (g - min) / (max - min) << 1 | (r - min) / (max - min) | (max > 3 ? 8: 0); } return color; } int color256to88(int color) { int r, g, b; if (color >= 232) return (color - 232) / 3 + 80; if (color >= 16) { color -= 16; r = color / 36; g = (color / 6) % 6; b = color % 6; return ((r + 1) / 2) * 16 + ((g + 1) / 2) * 4 + ((b + 1) / 2) + 16; } return color; } /* * SetColor - Sets foreground and background color * 0x00000000 <- default color ("transparent") * one note here that "null" variable is pointer to array of 0 and that's one of reasons to use it this way * 0x0100000x <- 16 base color * 0x020000xx <- 256 color * 0x04xxxxxx <- truecolor */ void SetColor(uint32_t foreground, uint32_t background) { uint32_t f, b, of, ob; static unsigned char sftrans[8] = { 0, 4, 2, 6, 1, 5, 3, 7 }; if (!display) return; f = foreground; b = background; of = D_rend.colorfg; ob = D_rend.colorbg; D_rend.colorfg = f; D_rend.colorbg = b; if (!D_CAX && D_hascolor && ((f == 0 && f != of) || (b == 0 && b != ob))) { if (D_OP) AddCStr(D_OP); else { int oattr; oattr = D_rend.attr; AddCStr(D_ME ? D_ME : "\033[m"); if (D_ME && !D_CG0) { /* D_ME may also reset the alternate charset */ D_rend.font = 0; D_realfont = 0; } D_atyp = 0; D_rend.attr = 0; SetAttr(oattr); } of = ob = 0; } if (!D_hascolor) return; /* FOREGROUND */ if (f != of && f == 0) { AddCStr("\033[39m"); /* works because AX is set */ } if (f != of && (f & 0x01000000)) { f &= 0x0f; if (f < 8) { if (D_CAF) AddCStr2(D_CAF, f); else if (D_CSF) AddCStr2(D_CSF, sftrans[f]); } if (D_CXT && f >= 8 && f <= 15) { AddCStr2("\033[9%p1%dm", f & 7); } } if (f != of && (f & 0x02000000)) { f &= 0x0ff; if (f > 15 && D_CCO != 256) { f = D_CCO == 88 && D_CAF ? color256to88(f) : color256to16(f); } if (D_CAF) { //AddCStr2(D_CAF, f); //FIXME tputs(tparm("\033[38;5;%dm", f), 1, DoAddChar); } } if (f != of && (f & 0x04000000) && hastruecolor) { uint8_t _r, _g, _b; _r = (f & 0x00ff0000) >> 16; _g = (f & 0x0000ff00) >> 8; _b = (f & 0x000000ff); /* TODO - properly get escape code */ tputs(tparm("\033[38;2;%p1%d;%p2%d;%p3%dm", _r, _g, _b), 1, DoAddChar); } /* BACKGROUND */ if (b != ob && b == 0) { AddCStr("\033[49m"); /* works because AX is set */ } if (b != ob && (b & 0x01000000)) { b &= 0x0f; if (b < 8) { if (D_CAB) AddCStr2(D_CAB, b); else if (D_CSB) AddCStr2(D_CSB, sftrans[b]); } if (D_CXT && b >= 8 && b <= 15) { AddCStr2("\033[10%p1%dm", b & 7); } } if (b != ob && (b & 0x02000000)) { b &= 0x0ff; if (b > 15 && D_CCO != 256) { b = D_CCO == 88 && D_CAB ? color256to88(b) : color256to16(b); } if (D_CAB) { // AddCStr2(D_CAB, b); // FIXME tputs(tparm("\033[48;5;%dm", b), 1, DoAddChar); } } if (b != ob && (b & 0x04000000) && hastruecolor) { uint8_t _r, _g, _b; _r = (b & 0x00ff0000) >> 16; _g = (b & 0x0000ff00) >> 8; _b = (b & 0x000000ff); /* TODO - properly get escape code */ tputs(tparm("\033[48;2;%p1%d;%p2%d;%p3%dm", _r, _g, _b), 1, DoAddChar); } } static void SetBackColor(int new) { if (!display) return; SetColor(D_rend.colorfg, new); } void SetRendition(struct mchar *mc) { if (!display) return; if (D_rend.attr != mc->attr) SetAttr(mc->attr); if (D_rend.colorbg != mc->colorbg || D_rend.colorfg != mc->colorfg) SetColor(mc->colorfg, mc->colorbg); if (D_rend.font != mc->font) SetFont(mc->font); } void SetRenditionMline(struct mline *ml, int x) { if (!display) return; if (D_rend.attr != ml->attr[x]) SetAttr(ml->attr[x]); if (D_rend.colorbg != ml->colorbg[x] || D_rend.colorfg != ml->colorfg[x]) { struct mchar mc; copy_mline2mchar(&mc, ml, x); SetColor(mc.colorfg, mc.colorbg); } if (D_rend.font != ml->font[x]) SetFont(ml->font[x]); } void MakeStatus(char *msg) { char *s, *t; int max; if (!display) return; if (D_blocked) return; if (!D_tcinited) { if (D_processinputdata) return; /* XXX: better */ AddStr(msg); AddStr("\r\n"); Flush(0); return; } if (!use_hardstatus || !D_HS) { max = D_width; if (D_CLP == 0) max--; } else max = D_WS > 0 ? D_WS : (D_width - !D_CLP); if (D_status) { /* same message? */ if (strcmp(msg, D_status_lastmsg) == 0) { if (!D_status_obufpos) SetTimeout(&D_statusev, MsgWait); return; } RemoveStatusMinWait(); } for (s = t = msg; *s && t - msg < max; ++s) if (*s == BELL) AddCStr(D_BL); else if ((unsigned char)*s >= ' ' && *s != 0177) *t++ = *s; *t = '\0'; if (t == msg) return; if (t - msg >= D_status_buflen) { char *buf; if (D_status_lastmsg) buf = realloc(D_status_lastmsg, t - msg + 1); else buf = malloc(t - msg + 1); if (buf) { D_status_lastmsg = buf; D_status_buflen = t - msg + 1; } } if (t - msg < D_status_buflen) strncpy(D_status_lastmsg, msg, D_status_buflen); D_status_len = t - msg; D_status_lastx = D_x; D_status_lasty = D_y; if (!use_hardstatus || D_has_hstatus == HSTATUS_IGNORE || D_has_hstatus == HSTATUS_MESSAGE) { D_status = STATUS_ON_WIN; GotoPos(STATCOL(D_width, D_status_len), STATLINE()); SetRendition(&mchar_so); InsertMode(false); AddStr(msg); if (D_status_len < max) { /* Wayne Davison: add extra space for readability */ D_status_len++; SetRendition(&mchar_null); AddChar(' '); if (D_status_len < max) { D_status_len++; AddChar(' '); AddChar('\b'); } AddChar('\b'); } D_x = -1; } else { D_status = STATUS_ON_HS; ShowHStatus(msg); } D_status_obufpos = D_obufp - D_obuf; if (D_status == STATUS_ON_WIN) { Display *olddisplay = display; Layer *oldflayer = flayer; /* this is copied over from RemoveStatus() */ D_status = 0; GotoPos(STATCOL(D_width, D_status_len), STATLINE()); RefreshLine(STATLINE(), STATCOL(D_width, D_status_len), STATCOL(D_width, D_status_len) + D_status_len - 1, 0); GotoPos(D_status_lastx, D_status_lasty); flayer = D_forecv ? D_forecv->c_layer : NULL; if (flayer) LaySetCursor(); display = olddisplay; flayer = oldflayer; D_status = STATUS_ON_WIN; } } void RemoveStatus(void) { Display *olddisplay; Layer *oldflayer; int where; if (!display) return; if (!(where = D_status)) return; if (D_status_obuffree >= 0) { D_obuflen = D_status_obuflen; D_obuffree = D_status_obuffree; D_status_obuffree = -1; } D_status = 0; D_status_obufpos = 0; D_status_bell = 0; evdeq(&D_statusev); olddisplay = display; oldflayer = flayer; if (where == STATUS_ON_WIN) { if (captionalways || (D_canvas.c_slperp && D_canvas.c_slperp->c_slnext)) { GotoPos(STATCOL(D_width, D_status_len), STATLINE()); RefreshLine(STATLINE(), STATCOL(D_width, D_status_len), STATCOL(D_width, D_status_len) + D_status_len - 1, 0); GotoPos(D_status_lastx, D_status_lasty); } } else RefreshHStatus(); flayer = D_forecv ? D_forecv->c_layer : NULL; if (flayer) LaySetCursor(); display = olddisplay; flayer = oldflayer; } /* Remove the status but make sure that it is seen for MsgMinWait ms */ static void RemoveStatusMinWait(void) { /* XXX: should flush output first if D_status_obufpos is set */ if (!D_status_bell && !D_status_obufpos) { struct timeval now; int ti; gettimeofday(&now, NULL); ti = (now.tv_sec - D_status_time.tv_sec) * 1000 + (now.tv_usec - D_status_time.tv_usec) / 1000; if (ti < MsgMinWait) DisplaySleep1000(MsgMinWait - ti, 0); } RemoveStatus(); } static int strlen_onscreen(char *c, char *end) { int len = 0; while (*c && (!end || c < end)) { int v, dec = 0; do { v = FromUtf8(*c++, &dec); if (v == -2) c--; } while (v < 0 && (!end || c < end)); if (!utf8_iscomb(v)) { if (utf8_isdouble(v)) len++; len++; } } return len; } static int PrePutWinMsg(char *s, int start, int max) { /* Avoid double-encoding problem for a UTF-8 message on a UTF-8 locale. Ideally, this would not be necessary. But fixing it the Right Way will probably take way more time. So this will have to do for now. */ if (D_encoding == UTF8) { int chars = strlen_onscreen((s + start), (s + max)); D_encoding = 0; PutWinMsg(s, start, max + ((max - start) - chars)); /* Multibyte count */ D_encoding = UTF8; D_x -= (max - chars); /* Yak! But this is necessary to count for the fact that not every byte represents a character. */ return start + chars; } else { PutWinMsg(s, start, max); return max; } } /* refresh the display's hstatus line */ void ShowHStatus(char *str) { int l, ox, oy, max; if (D_status == STATUS_ON_WIN && (D_has_hstatus == HSTATUS_FIRSTLINE || D_has_hstatus == HSTATUS_LASTLINE) && STATLINE() == D_height - 1) return; /* sorry, in use */ if (D_blocked) return; if (D_HS && D_has_hstatus == HSTATUS_HS) { if (!D_hstatus && (str == NULL || *str == 0)) return; SetRendition(&mchar_null); InsertMode(false); if (D_hstatus) AddCStr(D_DS); D_hstatus = false; if (str == NULL || *str == 0) return; AddCStr2(D_TS, 0); max = D_WS > 0 ? D_WS : (D_width - !D_CLP); if ((int)strlen(str) > max) AddStrn(str, max); else AddStr(str); AddCStr(D_FS); D_hstatus = true; } else if (D_has_hstatus == HSTATUS_LASTLINE) { ox = D_x; oy = D_y; str = str ? str : ""; l = strlen(str); if (l > D_width) l = D_width; GotoPos(0, D_height - 1); SetRendition(&mchar_null); l = PrePutWinMsg(str, 0, l); if (!captionalways && D_cvlist && !D_cvlist->c_next) while (l++ < D_width) PUTCHARLP(' '); if (l < D_width) ClearArea(l, D_height - 1, l, D_width - 1, D_width - 1, D_height - 1, 0, 0); if (ox != -1 && oy != -1) GotoPos(ox, oy); D_hstatus = (str != NULL); SetRendition(&mchar_null); } else if (D_has_hstatus == HSTATUS_FIRSTLINE) { ox = D_x; oy = D_y; str = str ? str : ""; l = strlen(str); if (l > D_width) l = D_width; GotoPos(0, 0); SetRendition(&mchar_null); l = PrePutWinMsg(str, 0, l); if (!captionalways || (D_cvlist && !D_cvlist->c_next)) while (l++ < D_width) PUTCHARLP(' '); if (l < D_width) ClearArea(l, 0, l, D_width - 1, D_width - 1, 0, 0, 0); if (ox != -1 && oy != -1) GotoPos(ox, oy); D_hstatus = (str != NULL); SetRendition(&mchar_null); } else if (str && *str && D_has_hstatus == HSTATUS_MESSAGE) { Msg(0, "%s", str); } } /* * Refreshes the hardstatus of the fore window. Shouldn't be here... */ void RefreshHStatus(void) { char *buf; int extrabytes = strlen(hstatusstring) - strlen_onscreen(hstatusstring, NULL); evdeq(&D_hstatusev); if (D_status == STATUS_ON_HS) return; buf = MakeWinMsgEv(NULL, hstatusstring, D_fore, '%', (D_HS && D_has_hstatus == HSTATUS_HS && D_WS > 0) ? D_WS : D_width - !D_CLP + extrabytes, &D_hstatusev, 0); if (buf && *buf) { ShowHStatus(buf); if (D_has_hstatus != HSTATUS_IGNORE && D_hstatusev.timeout) evenq(&D_hstatusev); } else ShowHStatus(NULL); } /*********************************************************************/ /* * Here come the routines that refresh an arbitrary part of the screen. */ void RefreshAll(int isblank) { for (Canvas *cv = D_cvlist; cv; cv = cv->c_next) { CV_CALL(cv, LayRedisplayLine(-1, -1, -1, isblank)); display = cv->c_display; /* just in case! */ } RefreshArea(0, 0, D_width - 1, D_height - 1, isblank); } void RefreshArea(int xs, int ys, int xe, int ye, int isblank) { if (!isblank && xs == 0 && xe == D_width - 1 && ye == D_height - 1 && (ys == 0 || D_CD)) { ClearArea(xs, ys, xs, xe, xe, ye, 0, 0); isblank = 1; } for (int y = ys; y <= ye; y++) RefreshLine(y, xs, xe, isblank); } void RefreshLine(int y, int from, int to, int isblank) { Viewport *vp, *lvp; Canvas *cv, *lcv, *cvlist, *cvlnext; Layer *oldflayer; int xx, yy, l; char *buf; Window *p; if (D_status == STATUS_ON_WIN && y == STATLINE()) { if (to >= D_status_len) D_status_len = to + 1; return; /* can't refresh status */ } if (isblank == 0 && D_CE && to == D_width - 1 && from < to && D_status != STATUS_ON_HS) { GotoPos(from, y); if (D_UT || D_BE) SetRendition(&mchar_null); AddCStr(D_CE); isblank = 1; } if ((y == D_height - 1 && D_has_hstatus == HSTATUS_LASTLINE) || (y == 0 && D_has_hstatus == HSTATUS_FIRSTLINE)) { RefreshHStatus(); return; } while (from <= to) { lcv = NULL; lvp = NULL; for (cv = display->d_cvlist; cv; cv = cv->c_next) { if (y == (captiontop ? cv->c_ys - 1 : cv->c_ye + 1) && from >= cv->c_xs && from <= cv->c_xe) { int extrabytes = strlen(captionstring) - strlen_onscreen(captionstring, NULL); p = Layer2Window(cv->c_layer); buf = MakeWinMsgEv(NULL, captionstring, p, '%', cv->c_xe - cv->c_xs + (cv->c_xe + 1 < D_width || D_CLP) + extrabytes, &cv->c_captev, 0); if (cv->c_captev.timeout) evenq(&cv->c_captev); xx = to > cv->c_xe ? cv->c_xe : to; l = strlen(buf); GotoPos(from, y); SetRendition(&mchar_so); if (l > xx - cv->c_xs + 1) l = xx - cv->c_xs + 1; l = PrePutWinMsg(buf, from - cv->c_xs, l + extrabytes); from = cv->c_xs + l; for (; from <= xx; from++) PUTCHARLP(' '); break; } if (from == cv->c_xe + 1 && (y >= cv->c_ys - captiontop) && (y <= cv->c_ye + !captiontop)) { GotoPos(from, y); SetRendition(&mchar_so); PUTCHARLP(' '); from++; break; } if (y < cv->c_ys || y > cv->c_ye || to < cv->c_xs || from > cv->c_xe) continue; for (vp = cv->c_vplist; vp; vp = vp->v_next) { /* find leftmost overlapping vp */ if (y >= vp->v_ys && y <= vp->v_ye && from <= vp->v_xe && to >= vp->v_xs && (lvp == NULL || lvp->v_xs > vp->v_xs)) { lcv = cv; lvp = vp; } } } if (cv) continue; /* we advanced from */ if (lvp == NULL) break; if (from < lvp->v_xs) { if (!isblank) DisplayLine(&mline_null, &mline_blank, y, from, lvp->v_xs - 1); from = lvp->v_xs; } /* call LayRedisplayLine on canvas lcv viewport lvp */ yy = y - lvp->v_yoff; xx = to < lvp->v_xe ? to : lvp->v_xe; if (lcv->c_layer && lcv->c_xoff + lcv->c_layer->l_width == from) { GotoPos(from, y); SetRendition(&mchar_blank); PUTCHARLP('|'); from++; } if (lcv->c_layer && yy == lcv->c_layer->l_height) { GotoPos(from, y); SetRendition(&mchar_blank); while (from <= lvp->v_xe && from - lvp->v_xoff < lcv->c_layer->l_width) { PUTCHARLP('-'); from++; } if (from >= lvp->v_xe + 1) continue; } if (lcv->c_layer == NULL || yy >= lcv->c_layer->l_height || from - lvp->v_xoff >= lcv->c_layer->l_width) { if (!isblank) DisplayLine(&mline_null, &mline_blank, y, from, lvp->v_xe); from = lvp->v_xe + 1; continue; } if (xx - lvp->v_xoff >= lcv->c_layer->l_width) xx = lcv->c_layer->l_width + lvp->v_xoff - 1; oldflayer = flayer; flayer = lcv->c_layer; cvlist = flayer->l_cvlist; cvlnext = lcv->c_lnext; flayer->l_cvlist = lcv; lcv->c_lnext = NULL; LayRedisplayLine(yy, from - lvp->v_xoff, xx - lvp->v_xoff, isblank); flayer->l_cvlist = cvlist; lcv->c_lnext = cvlnext; flayer = oldflayer; from = xx + 1; } if (!isblank && from <= to) DisplayLine(&mline_null, &mline_blank, y, from, to); } /*********************************************************************/ /* clear lp_missing by writing the char on the screen. The * position must be safe. */ static void WriteLP(int x2, int y2) { struct mchar oldrend; oldrend = D_rend; if (D_lpchar.mbcs) { if (x2 > 0) x2--; else D_lpchar = mchar_blank; } /* Can't use PutChar */ GotoPos(x2, y2); SetRendition(&D_lpchar); PUTCHAR(D_lpchar.image); if (D_lpchar.mbcs) PUTCHAR(D_lpchar.mbcs); D_lp_missing = 0; SetRendition(&oldrend); } void ClearLine(struct mline *oml, int y, int from, int to, int bce) { int x; struct mchar bcechar; if (D_UT) /* Safe to erase ? */ SetRendition(&mchar_null); if (D_BE) SetBackColor(bce); if (from == 0 && D_CB && (to != D_width - 1 || (D_x == to && D_y == y)) && (!bce || D_BE)) { GotoPos(to, y); AddCStr(D_CB); return; } if (to == D_width - 1 && D_CE && (!bce || D_BE)) { GotoPos(from, y); AddCStr(D_CE); return; } if (oml == NULL) oml = &mline_null; if (!bce) { DisplayLine(oml, &mline_blank, y, from, to); return; } bcechar = mchar_null; bcechar.colorbg = bce; for (x = from; x <= to; x++) copy_mchar2mline(&bcechar, &mline_old, x); DisplayLine(oml, &mline_old, y, from, to); } void DisplayLine(struct mline *oml, struct mline *ml, int y, int from, int to) { int x; int last2flag = 0, delete_lp = 0; if (!D_CLP && y == D_bot && to == D_width - 1) { if (D_lp_missing || !cmp_mline(oml, ml, to)) { if ((D_IC || D_IM) && from < to && !dw_left(ml, to, D_encoding)) { last2flag = 1; D_lp_missing = 0; to--; } else { delete_lp = !cmp_mchar_mline(&mchar_blank, oml, to) && (D_CE || D_DC || D_CDC); D_lp_missing = !cmp_mchar_mline(&mchar_blank, ml, to); copy_mline2mchar(&D_lpchar, ml, to); } } to--; } if (D_mbcs) { /* finish dw-char (can happen after a wrap) */ SetRenditionMline(ml, from); PUTCHAR(ml->image[from]); from++; } for (x = from; x <= to; x++) { if (ml != NULL) { if ((x < to || x != D_width - 1 || ml->image[x + 1])) if (cmp_mline(oml, ml, x)) continue; GotoPos(x, y); if (dw_right(ml, x, D_encoding)) { if (x > 0) { x--; } else { x++; } GotoPos(x, y); } if (x == to && dw_left(ml, x, D_encoding)) break; /* don't start new kanji */ SetRenditionMline(ml, x); PUTCHAR(ml->image[x]); if (dw_left(ml, x, D_encoding)) PUTCHAR(ml->image[++x]); } } if (last2flag) { GotoPos(x, y); SetRenditionMline(ml, x + 1); PUTCHAR(ml->image[x + 1]); GotoPos(x, y); SetRenditionMline(ml, x); INSERTCHAR(ml->image[x]); } else if (delete_lp) { if (D_UT) SetRendition(&mchar_null); if (D_DC) AddCStr(D_DC); else if (D_CDC) AddCStr2(D_CDC, 1); else if (D_CE) AddCStr(D_CE); } } void PutChar(struct mchar *c, int x, int y) { GotoPos(x, y); SetRendition(c); PUTCHARLP(c->image); if (c->mbcs) { if (D_encoding == UTF8) D_rend.font = 0; PUTCHARLP(c->mbcs); } } void InsChar(struct mchar *c, int x, int xe, int y, struct mline *oml) { (void)oml; /* unused */ GotoPos(x, y); if (y == D_bot && !D_CLP) { if (x == D_width - 1) { D_lp_missing = 1; D_lpchar = *c; return; } if (xe == D_width - 1) D_lp_missing = 0; } if (x == xe) { SetRendition(c); PUTCHARLP(c->image); return; } if (!(D_IC || D_CIC || D_IM) || xe != D_width - 1) { RefreshLine(y, x, xe, 0); GotoPos(x + 1, y); /* UpdateLine(oml, y, x, xe); */ return; } InsertMode(true); if (!D_insert) { if (c->mbcs && D_IC) AddCStr(D_IC); if (D_IC) AddCStr(D_IC); else AddCStr2(D_CIC, c->mbcs ? 2 : 1); } SetRendition(c); RAW_PUTCHAR(c->image); if (c->mbcs) { if (D_encoding == UTF8) D_rend.font = 0; if (D_x == D_width - 1) PUTCHARLP(c->mbcs); else RAW_PUTCHAR(c->mbcs); } } void WrapChar(struct mchar *c, int x, int y, int xs, int ys, int xe, int ye, bool ins) { int bce; bce = c->colorbg; if (xs != 0 || x != D_width || !D_AM) { if (y == ye) ScrollV(xs, ys, xe, ye, 1, bce); else if (y < D_height - 1) y++; if (ins) InsChar(c, xs, xe, y, NULL); else PutChar(c, xs, y); return; } if (y == ye) { /* we have to scroll */ ChangeScrollRegion(ys, ye); if (D_bot != y || D_x != D_width || (!bce && !D_BE)) { ScrollV(xs, ys, xe, ye, 1, bce); y--; } } else if (y == D_bot) /* remove unusable region? */ ChangeScrollRegion(0, D_height - 1); if (D_x != D_width || D_y != y) { if (D_CLP && y >= 0) /* don't even try if !LP */ RefreshLine(y, D_width - 1, D_width - 1, 0); if (D_x != D_width || D_y != y) { /* sorry, no bonus */ if (y == ye) ScrollV(xs, ys, xe, ye, 1, bce); GotoPos(xs, y == ye || y == D_height - 1 ? y : y + 1); } } if (y != ye && y < D_height - 1) y++; if (ins != D_insert) InsertMode(ins); if (ins && !D_insert) { InsChar(c, 0, xe, y, NULL); return; } D_y = y; D_x = 0; SetRendition(c); RAW_PUTCHAR(c->image); if (c->mbcs) { if (D_encoding == UTF8) D_rend.font = 0; RAW_PUTCHAR(c->mbcs); } } int ResizeDisplay(int wi, int he) { if (D_width == wi && D_height == he) { return 0; } if (D_width != wi && (D_height == he || !D_CWS) && D_CZ0 && (wi == Z0width || wi == Z1width)) { AddCStr(wi == Z0width ? D_CZ0 : D_CZ1); ChangeScreenSize(wi, D_height, 0); return (he == D_height) ? 0 : -1; } if (D_CWS) { AddCStr(tgoto(D_CWS, wi, he)); ChangeScreenSize(wi, he, 0); return 0; } return -1; } void ChangeScrollRegion(int newtop, int newbot) { if (display == NULL) return; if (newtop == newbot) return; /* xterm etc can't do it */ if (newtop == -1) newtop = 0; if (newbot == -1) newbot = D_height - 1; if (D_CS == NULL) { D_top = 0; D_bot = D_height - 1; return; } if (D_top == newtop && D_bot == newbot) return; AddCStr(tgoto(D_CS, newbot, newtop)); D_top = newtop; D_bot = newbot; D_y = D_x = -1; /* Just in case... */ } #define WT_FLAG "2" /* change to "0" to set both title and icon */ void SetXtermOSC(int i, char *s, char *t) { static char *oscs[][2] = { {WT_FLAG ";", "screen"}, /* set window title */ {"11;", ""}, /* background RGB */ {"20;", ""}, /* background */ {"39;", "black"}, /* default foreground (black?) */ {"49;", "white"} /* default background (white?) */ }; if (!D_CXT) return; if (!s) s = ""; if (!D_xtermosc[i] && !*s) return; if (i == 0 && !D_xtermosc[0]) AddStr("\033[22;" WT_FLAG "t"); /* stack titles (xterm patch #251) */ if (!*s) s = oscs[i][1]; D_xtermosc[i] = 1; AddStr("\033]"); AddStr(oscs[i][0]); AddStr(s); AddStr(t); } void ClearAllXtermOSC(void) { for (int i = 4; i >= 0; i--) SetXtermOSC(i, NULL, "\a"); if (D_xtermosc[0]) AddStr("\033[23;" WT_FLAG "t"); /* unstack titles (xterm patch #251) */ } #undef WT_FLAG /* * Output buffering routines */ void AddStr(char *str) { char c; if (D_encoding == UTF8) { while ((c = *str++)) AddUtf8((unsigned char)c); return; } while ((c = *str++)) AddChar(c); } void AddStrn(char *str, int n) { char c; if (D_encoding == UTF8) { while ((c = *str++) && n-- > 0) AddUtf8((unsigned char)c); } else while ((c = *str++) && n-- > 0) AddChar(c); while (n-- > 0) AddChar(' '); } void Flush(int progress) { int l; int wr; char *p; l = D_obufp - D_obuf; if (l == 0) return; if (D_userfd < 0) { D_obuffree += l; D_obufp = D_obuf; return; } p = D_obuf; if (!progress) { fcntl(D_userfd, F_SETFL, 0); } while (l) { if (progress) { struct pollfd pfd[1]; pfd[0].fd = D_userfd; pfd[0].events = POLLOUT; wr = poll(pfd, ARRAY_SIZE(pfd), progress / 1000); if (wr == -1) { if (errno == EINTR) continue; break; } if (wr == 0) { /* no progress after 3 seconds. sorry. */ break; } } wr = write(D_userfd, p, l); if (wr <= 0) { if (errno == EINTR) continue; break; } D_obuffree += wr; p += wr; l -= wr; } D_obuffree += l; D_obufp = D_obuf; if (!progress) { fcntl(D_userfd, F_SETFL, FNBLOCK); } if (D_blocked == 1) D_blocked = 0; D_blocked_fuzz = 0; } void freetty(void) { if (D_userfd >= 0) close(D_userfd); D_userfd = -1; D_obufp = NULL; D_obuffree = 0; if (D_obuf) free(D_obuf); D_obuf = NULL; D_obuflen = 0; D_obuflenmax = -D_obufmax; D_blocked = 0; D_blocked_fuzz = 0; } /* * Asynchronous output routines by * Tim MacKenzie (tym@dibbler.cs.monash.edu.au) */ void Resize_obuf(void) { int ind; if (D_status_obuffree >= 0) { RemoveStatusMinWait(); if (--D_obuffree > 0) /* redo AddChar decrement */ return; } if (D_obuflen && D_obuf) { ind = D_obufp - D_obuf; D_obuflen += GRAIN; D_obuffree += GRAIN; D_obuf = realloc(D_obuf, D_obuflen); } else { ind = 0; D_obuflen = GRAIN; D_obuffree = GRAIN; D_obuf = malloc(D_obuflen); } if (!D_obuf) Panic(0, "Out of memory"); D_obufp = D_obuf + ind; D_obuflenmax = D_obuflen - D_obufmax; } void DisplaySleep1000(int n, int eat) { struct pollfd pfd[1]; char buf; if (n <= 0) return; if (!display) { usleep(1000 * n); return; } pfd[0].fd = D_userfd; pfd[0].events = POLLIN; if (poll(pfd, ARRAY_SIZE(pfd), n) > 0) { if (eat) read(D_userfd, &buf, 1); } } void NukePending(void) { /* Nuke pending output in current display, clear screen */ int len; int oldtop = D_top, oldbot = D_bot; struct mchar oldrend; int oldkeypad = D_keypad, oldcursorkeys = D_cursorkeys; int oldcurvis = D_curvis; int oldmouse = D_mouse; int extoldmouse = D_extmouse; bool oldbracketed = D_bracketed; int oldcursorstyle = D_cursorstyle; oldrend = D_rend; len = D_obufp - D_obuf; /* Throw away any output that we can... */ tcflush(D_userfd, TCOFLUSH); D_obufp = D_obuf; D_obuffree += len; D_top = D_bot = -1; AddCStr(D_IS); AddCStr(D_TI); /* Turn off all attributes. (Tim MacKenzie) */ if (D_ME) AddCStr(D_ME); else { if (D_hascolor) AddStr("\033[m"); /* why is D_ME not set? */ AddCStr(D_SE); AddCStr(D_UE); } /* Check for toggle */ if (D_IM && strcmp(D_IM, D_EI)) AddCStr(D_EI); D_insert = 0; /* Check for toggle */ if (D_KS && strcmp(D_KS, D_KE)) AddCStr(D_KS); if (D_CCS && strcmp(D_CCS, D_CCE)) AddCStr(D_CCS); AddCStr(D_CE0); D_rend = mchar_null; D_atyp = 0; AddCStr(D_DS); D_hstatus = false; AddCStr(D_VE); D_curvis = 0; ChangeScrollRegion(oldtop, oldbot); SetRendition(&oldrend); KeypadMode(oldkeypad); CursorkeysMode(oldcursorkeys); CursorVisibility(oldcurvis); MouseMode(oldmouse); ExtMouseMode(extoldmouse); BracketedPasteMode(oldbracketed); CursorStyle(oldcursorstyle); if (D_CWS) { AddCStr(tgoto(D_CWS, D_width, D_height)); } else if (D_CZ0 && (D_width == Z0width || D_width == Z1width)) { AddCStr(D_width == Z0width ? D_CZ0 : D_CZ1); } } /* linux' select can't handle flow control, so wait 100ms if * we get EAGAIN */ static void disp_writeev_eagain(Event *event, void *data) { (void)event; /* unused */ display = (Display *)data; evdeq(&D_writeev); D_writeev.type = EV_WRITE; D_writeev.handler = disp_writeev_fn; evenq(&D_writeev); } static void disp_writeev_fn(Event *event, void *data) { int len, size = OUTPUT_BLOCK_SIZE; (void)event; /* unused */ display = (Display *)data; len = D_obufp - D_obuf; if (len < size) size = len; if (D_status_obufpos && size > D_status_obufpos) size = D_status_obufpos; size = write(D_userfd, D_obuf, size); if (size >= 0) { len -= size; if (len) { memmove(D_obuf, D_obuf + size, len); } D_obufp -= size; D_obuffree += size; if (D_status_obufpos) { D_status_obufpos -= size; if (!D_status_obufpos) { /* we're finished displaying the message! */ if (D_status == STATUS_ON_WIN) { /* setup continue trigger */ D_status_obuflen = D_obuflen; D_status_obuffree = D_obuffree; /* setting obbuffree to 0 will make AddChar call * ResizeObuf */ D_obuffree = D_obuflen = 0; } gettimeofday(&D_status_time, NULL); SetTimeout(&D_statusev, MsgWait); evenq(&D_statusev); } } if (D_blocked_fuzz) { D_blocked_fuzz -= size; if (D_blocked_fuzz < 0) D_blocked_fuzz = 0; } if (D_blockedev.queued) { if (D_obufp - D_obuf > D_obufmax / 2) { SetTimeout(&D_blockedev, D_nonblock); } else { evdeq(&D_blockedev); } } if (D_blocked == 1 && D_obuf == D_obufp) { /* empty again, restart output */ D_blocked = 0; Activate(D_fore ? D_fore->w_norefresh : 0); D_blocked_fuzz = D_obufp - D_obuf; } } else { /* linux flow control is badly broken */ if (errno == EAGAIN) { evdeq(&D_writeev); D_writeev.type = EV_TIMEOUT; D_writeev.handler = disp_writeev_eagain; SetTimeout(&D_writeev, 100); evenq(&D_writeev); } if (errno != EINTR && errno != EAGAIN) #if defined(EWOULDBLOCK) && (EWOULDBLOCK != EAGAIN) if (errno != EWOULDBLOCK) #endif Msg(errno, "Error writing output to display"); } } /* maximum mouse sequence length is SGR: ESC [ < b ; x ; y M */ #define MAX_MOUSE_SEQUENCE (3+10+1+10+1+10+1) static void disp_readev_fn(Event *event, void *data) { /* We have to intercept mouse sequences in order to translate them * properly, and an incoming sequence could be spread over multiple * I/O reads. When this occurs, we buffer intermediate state in * D_mouse_params, and then use the reservation at the front of * bufspace to prepend the completed and translated mouse sequence. */ ssize_t size; unsigned char bufspace[MAX_MOUSE_SEQUENCE + IOSIZE]; unsigned char *buf = bufspace + MAX_MOUSE_SEQUENCE; Canvas *cv; (void)event; /* unused */ display = (Display *)data; /* Hmmmm... a bit ugly... */ if (D_forecv) for (cv = D_forecv->c_layer->l_cvlist; cv; cv = cv->c_lnext) { display = cv->c_display; if (D_status == STATUS_ON_WIN) RemoveStatus(); } display = (Display *)data; if (D_fore == NULL) size = IOSIZE; else { if (W_UWP(D_fore)) size = ARRAY_SIZE(D_fore->w_pwin->p_inbuf) - D_fore->w_pwin->p_inlen; else size = ARRAY_SIZE(D_fore->w_inbuf) - D_fore->w_inlen; } if (size > IOSIZE) size = IOSIZE; if (size <= 0) size = 1; /* Always allow one char for command keys */ size = read(D_userfd, buf, size); if (size < 0) { if (errno == EINTR || errno == EAGAIN) return; #if defined(EWOULDBLOCK) && (EWOULDBLOCK != EAGAIN) if (errno == EWOULDBLOCK) return; #endif Hangup(); sleep(1); return; } else if (size == 0) { Hangup(); sleep(1); return; } if (D_blocked == 4) { D_blocked = 0; KillBlanker(); Activate(D_fore ? D_fore->w_norefresh : 0); ResetIdle(); return; } if (D_blocked > 1) { /* 2, 3 */ flayer = NULL; for (Window *p = mru_window; p; p = p->w_prev_mru) if (p->w_zdisplay == display) { char *bufp = (char *)buf; flayer = &p->w_layer; while (size > 0) LayProcess(&bufp, (size_t*)&size); return; } zmodem_abort(NULL, display); } if (idletimo > 0) ResetIdle(); if (D_fore) D_fore->w_lastdisp = display; if (D_mouse && D_forecv) { unsigned char *bp = (unsigned char *)buf; unsigned char *end = bp + size; unsigned char *mark = NULL; /* When mouse mode is enabled, buffer up incoming CSI until we * know whether it is a mouse sequence. If not a mouse event, * emit the CSI unchanged; if an invalid mouse event, swallow * it; otherwise, translate the sequence and emit it. * * Supported mouse events take two flavors. * * VT200: CSI M Cb Cx Cy * SGR: CSI < Ps ; Ps ; Ps M|m * * UTF-8 and UXRVT modes are explicitly rejected because they * introduce incompatibilities with other control sequences. * * NOTE: applications wishing to use SGR mode will normally * enable VT200 mode first as a fallback in case the terminal * does not support SGR mode. Thus, we must expect to receive * either mode's sequences when mouse mode is enabled. We will * dutifully translate whatever arrives, without attempting to * convert between modes on behalf of the application. */ switch (D_mouse_parse.state) { case CSI_PY: case CSI_PX: case CSI_PB: /* Partial mouse sequence; do not restore suppressed * characters. We will emit a translated version (if valid) * or swallow them (otherwise). */ break; case CSI_BEGIN: /* Partial CSI; restore suppressed characters in case it * turns out not to be a mouse sequence after all. */ *(--buf) = '['; ++size; /* fall through */ case CSI_ESC_SEEN: /* Escape character; restore it in case this turns out not * to be the start of a mouse sequence after all. */ *(--buf) = '\033'; ++size; break; default: break; }; while (bp != end) { unsigned char c = *(bp++); switch (D_mouse_parse.state) { case CSI_INACTIVE: if (c == '\033') { /* potential escape sequence */ mark = bp - 1; D_mouse_parse.state = CSI_ESC_SEEN; SetTimeout(&D_mousetimeoutev, maptimeout); evenq(&D_mousetimeoutev); } break; case CSI_ESC_SEEN: if (c == '[') { /* continue buffering an escape sequence */ D_mouse_parse.state = CSI_BEGIN; evdeq(&D_mousetimeoutev); SetTimeout(&D_mousetimeoutev, maptimeout); evenq(&D_mousetimeoutev); } else D_mouse_parse.state = CSI_INACTIVE; break; case CSI_BEGIN: evdeq(&D_mousetimeoutev); if (c == 'M') { /* VT200 mouse sequence */ D_mouse_parse.state = CSI_PB; D_mouse_parse.sgrmode = 0; } else if (c == '<') { /* SGR mouse sequence */ D_mouse_parse.state = CSI_PB; D_mouse_parse.params[(int)D_mouse_parse.state] = 0; D_mouse_parse.sgrmode = 1; } else D_mouse_parse.state = CSI_INACTIVE; break; case CSI_PB: case CSI_PX: case CSI_PY: if (D_mouse_parse.sgrmode) { /* SGR mode: parse decimal numbers */ if ('0' <= c && c <= '9') { D_mouse_parse.params[(int)D_mouse_parse.state] *= 10; D_mouse_parse.params[(int)D_mouse_parse.state] += c - '0'; } else if (D_mouse_parse.state == CSI_PY) { if (c == 'M' || c == 'm') D_mouse_parse.state = CSI_DONE; else D_mouse_parse.state = CSI_INVALID; } else if (c == ';') { D_mouse_parse.state++; D_mouse_parse.params[(int)D_mouse_parse.state] = 0; } else D_mouse_parse.state = CSI_INVALID; } else { /* VT200 mode: read raw binary values */ D_mouse_parse.params[(int)D_mouse_parse.state++] = c; } break; default: break; } if (D_mouse_parse.state == CSI_INVALID) { /* swallow invalid sequence, but emit whatever came before */ if (buf < mark) disp_processinput(display, buf, mark - buf); buf = bp; size = end - bp; D_mouse_parse.state = CSI_INACTIVE; } else if (D_mouse_parse.state == CSI_DONE) { /* emit whatever came before this sequence */ if (buf < mark) disp_processinput(display, buf, mark - buf); buf = bp; size = end - bp; int x = D_mouse_parse.params[CSI_PX]; int y = D_mouse_parse.params[CSI_PY]; int bias = D_mouse_parse.sgrmode? 1 : 33; x -= bias; y -= bias; if (x >= D_forecv->c_xs && x <= D_forecv->c_xe && y >= D_forecv->c_ys && y <= D_forecv->c_ye) { if ((D_fore && D_fore->w_mouse) || (D_mousetrack && D_forecv->c_layer->l_mode == 1)) { /* Send clicks only if the window is expecting clicks */ x -= D_forecv->c_xoff; y -= D_forecv->c_yoff; if (x >= 0 && x < D_forecv->c_layer->l_width && y >= 0 && y < D_forecv->c_layer->l_height) { char tmp[MAX_MOUSE_SEQUENCE+1]; int n; x += bias; y += bias; if (D_mouse_parse.sgrmode) { n = snprintf( tmp, MAX_MOUSE_SEQUENCE, "\033[<%d;%d;%d%c", D_mouse_parse.params[CSI_PB], x, y, c); } else { n = snprintf( tmp, MAX_MOUSE_SEQUENCE, "\033[M%c%c%c", D_mouse_parse.params[CSI_PB], x, y); } if (n > MAX_MOUSE_SEQUENCE) n = MAX_MOUSE_SEQUENCE; /* emit sequence */ buf -= n; size += n; memmove(buf, tmp, n); } } } else if (D_mousetrack) { /* 'focus' to the clicked region, only on mouse up */ int focus = 0; if (D_mouse_parse.sgrmode) focus = (c == 'm'); else focus = (D_mouse_parse.params[CSI_PB] == '#'); Canvas *cv = FindCanvas(x, y); if (focus && cv) { SetForeCanvas(display, cv); /* XXX: Do we want to reset the input buffer? */ } } D_mouse_parse.state = CSI_INACTIVE; } } if (D_mouse_parse.state != CSI_INACTIVE) { /* suppress partial sequence at end */ size = mark? mark - buf : 0; } } if (size > 0) disp_processinput(display, buf, size); } static void disp_processinput(Display * display, unsigned char *buf, size_t size) { if (D_encoding != (D_forecv ? D_forecv->c_layer->l_encoding : 0)) { int c, enc; ptrdiff_t i, j; char buf2[IOSIZE * 2 + 10]; enc = D_forecv ? D_forecv->c_layer->l_encoding : 0; for (i = j = 0; i < (ptrdiff_t)size; i++) { c = ((unsigned char *)buf)[i]; c = DecodeChar(c, D_encoding, &D_decodestate); if (c == -2) i--; /* try char again */ if (c < 0) continue; if (pastefont) { int font = 0; j += EncodeChar(buf2 + j, c, enc, &font); j += EncodeChar(buf2 + j, -1, enc, &font); } else j += EncodeChar(buf2 + j, c, enc, NULL); if (j > (int)ARRAY_SIZE(buf2) - 10) /* just in case... */ break; } (*D_processinput) (buf2, j); return; } (*D_processinput) ((char *)buf, size); } static void disp_mousetimeout_fn(Event *event, void *data) { unsigned char buf[2] = {'\033', '['}; int size = 0; (void)event; /* unused */ display = (Display *)data; switch (D_mouse_parse.state) { case CSI_PY: case CSI_PX: case CSI_PB: /* Do not restore */ break; case CSI_BEGIN: ++size; /* fall through */ case CSI_ESC_SEEN: ++size; disp_processinput(display, buf, size); break; default: break; }; D_mouse_parse.state = CSI_INACTIVE; } static void disp_status_fn(Event *event, void *data) { (void)event; /* unused */ display = (Display *)data; if (D_status) RemoveStatus(); } static void disp_hstatus_fn(Event *event, void *data) { display = (Display *)data; if (D_status == STATUS_ON_HS) { SetTimeout(event, 1); evenq(event); return; } RefreshHStatus(); } static void disp_blocked_fn(Event *event, void *data) { (void)event; /* unused */ display = (Display *)data; if (D_obufp - D_obuf > D_obufmax + D_blocked_fuzz) { D_blocked = 1; /* re-enable all windows */ for (Window *p = mru_window; p; p = p->w_prev_mru) if (p->w_readev.condneg == &D_obuflenmax) { p->w_readev.condpos = p->w_readev.condneg = NULL; } } } static void disp_map_fn(Event *event, void *data) { char *p; int l, i; unsigned char *q; (void)event; /* unused */ display = (Display *)data; if (!(l = D_seql)) return; p = (char *)D_seqp - l; D_seqp = D_kmaps + 3; D_seql = 0; 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); } static void disp_idle_fn(Event *event, void *data) { Display *olddisplay; (void)event; /* unused */ display = (Display *)data; if (idletimo <= 0 || idleaction.nr == RC_ILLEGAL) return; olddisplay = display; flayer = D_forecv->c_layer; fore = D_fore; DoAction(&idleaction); if (idleaction.nr == RC_BLANKER) return; for (display = displays; display; display = display->d_next) if (olddisplay == display) break; if (display) ResetIdle(); } void ResetIdle(void) { if (idletimo > 0) { SetTimeout(&D_idleev, idletimo); if (!D_idleev.queued) evenq(&D_idleev); } else evdeq(&D_idleev); } static void disp_blanker_fn(Event *event, void *data) { char buf[IOSIZE], *b; int size; (void)event; /* unused */ display = (Display *)data; size = read(D_blankerev.fd, buf, IOSIZE); if (size <= 0) { evdeq(&D_blankerev); ClosePTY(D_blankerev.fd); D_blankerev.fd = -1; return; } for (b = buf; size; size--) AddChar(*b++); } void KillBlanker(void) { int oldtop = D_top, oldbot = D_bot; struct mchar oldrend; if (D_blankerev.fd == -1) return; if (D_blocked == 4) D_blocked = 0; evdeq(&D_blankerev); ClosePTY(D_blankerev.fd); D_blankerev.fd = -1; Kill(D_blankerpid, SIGHUP); D_top = D_bot = -1; oldrend = D_rend; if (D_ME) { AddCStr(D_ME); AddCStr(D_ME); } else { if (D_hascolor) AddStr("\033[m\033[m"); /* why is D_ME not set? */ AddCStr(D_SE); AddCStr(D_UE); } AddCStr(D_VE); AddCStr(D_CE0); D_rend = mchar_null; D_atyp = 0; D_curvis = 0; D_x = D_y = -1; ChangeScrollRegion(oldtop, oldbot); SetRendition(&oldrend); ClearAll(); } void RunBlanker(char **cmdv) { char *m; pid_t pid; int slave = -1; int ptype = 0; char termname[MAXTERMLEN + 6]; char **np; strncpy(termname, "TERM=", 6); strncpy(termname + 5, D_termname, MAXTERMLEN - 6); termname[ARRAY_SIZE(termname) - 1] = 0; KillBlanker(); D_blankerpid = -1; if ((D_blankerev.fd = OpenDevice(cmdv, 0, &ptype, &m)) == -1) { Msg(0, "OpenDevice failed"); return; } #ifdef O_NOCTTY if (pty_preopen) { if ((slave = open(m, O_RDWR | O_NOCTTY)) == -1) { Msg(errno, "%s", m); ClosePTY(D_blankerev.fd); D_blankerev.fd = -1; return; } } #endif switch (pid = fork()) { case -1: Msg(errno, "fork"); ClosePTY(D_blankerev.fd); D_blankerev.fd = -1; if (slave != -1) close(slave); return; case 0: displays = NULL; ServerSocket = -1; if (setgid(real_gid) || setuid(real_uid)) Panic(errno, "setuid/setgid"); eff_uid = real_uid; eff_gid = real_gid; brktty(D_userfd); freetty(); if (slave != -1) { close(0); dup(slave); close(slave); closeallfiles(D_blankerev.fd); slave = dup(0); } else closeallfiles(D_blankerev.fd); close(0); close(1); close(2); if (open(m, O_RDWR)) Panic(errno, "Cannot open %s", m); if (dup(0) < 0) Panic(errno, "Cannot dup() %s", m); if (dup(0) < 0) Panic(errno, "Cannot dup() %s", m); if (slave != -1) close(slave); close(D_blankerev.fd); fgtty(0); SetTTY(0, &D_OldMode); np = NewEnv + 3; *np++ = NewEnv[0]; *np++ = termname; glwz.ws_col = D_width; glwz.ws_row = D_height; (void)ioctl(0, TIOCSWINSZ, (char *)&glwz); display = NULL; execvpe(*cmdv, cmdv, NewEnv + 3); Panic(errno, "Cannot exec '%s'", *cmdv); default: break; } D_blankerpid = pid; evenq(&D_blankerev); D_blocked = 4; ClearAll(); if (slave != -1) close(slave); } void ClearScrollbackBuffer(void) { if (D_CE3) AddCStr(D_CE3); } screen-5.0.1/ansi.h0000664000175000017500000001162415011404317012545 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_ANSI_H #define SCREEN_ANSI_H #include #include #include #define NATTR 7 /* Capname TCapCode */ #define ATTR_DI 0 /* Dim mode dim mh */ #define ATTR_US 1 /* Underscore mode smul us */ #define ATTR_BD 2 /* Bold mode bold md */ #define ATTR_RV 3 /* Reverse mode rev mr */ #define ATTR_SO 4 /* Standout mode smso so */ #define ATTR_BL 5 /* Blinking blink mb */ #define ATTR_IT 6 /* Italicized simt ZH */ #define A_DI (1<font[(x) + 1] == 0xff && (ml)->image[(x) + 1] == 0xff : \ ((ml)->font[x] & 0x1f) != 0 && ((ml)->font[x] & 0xe0) == 0 \ ) #define dw_right(ml, x, enc) ((enc == UTF8) ? \ (ml)->font[x] == 0xff && (ml)->image[x] == 0xff : \ ((ml)->font[x] & 0xe0) == 0x80 \ ) typedef struct Window Window; void ResetAnsiState (Window *); void ResetCharsets (Window *); void WriteString (Window *, char *, size_t); void ChangeAKA (Window *, char *, size_t); void SetCharsets (Window *, char *); int GetAnsiStatus (Window *, char *); void WNewAutoFlow (Window *, int); void WBell (Window *, bool); void WMsg (Window *, int, char *); int MFindUsedLine (Window *, int, int); /* global variables */ extern bool visual_bell; extern bool use_altscreen; extern bool use_hardstatus; extern char *printcmd; extern uint32_t *blank; extern uint32_t *null; extern uint64_t renditions[]; extern const int Z0width; extern const int Z1width; extern struct mline mline_blank; extern struct mline mline_null; extern struct mline mline_old; extern struct mchar mchar_so; extern struct mchar mchar_blank; extern struct mchar mchar_null; #endif /* SCREEN_ANSI_H */ screen-5.0.1/comm.sh0000664000175000017500000000421415011404317012726 0ustar alexalex#! /bin/sh if test -z "$AWK"; then AWK=awk fi if test -z "$CC"; then CC=cc fi if test -z "$srcdir"; then srcdir=. fi LC_ALL=C export LC_ALL rm -f comm.h cat << EOF > comm.h /* * This file is automagically created from comm.c -- DO NOT EDIT */ #ifndef SCREEN_COMM_H #define SCREEN_COMM_H #include "acls.h" struct comm { char *name; int flags; AclBits userbits[ACL_BITS_PER_CMD]; }; extern struct comm comms[]; #define ARGS_MASK (3) #define ARGS_0 (0) #define ARGS_1 (1) #define ARGS_2 (2) #define ARGS_3 (3) #define ARGS_PLUS1 (1<<2) #define ARGS_PLUS2 (1<<3) #define ARGS_PLUS3 (1<<4) #define ARGS_ORMORE (1<<5) #define NEED_FORE (1<<6) /* this command needs a fore window */ #define NEED_DISPLAY (1<<7) /* this command needs a display */ #define NEED_LAYER (1<<8) /* this command needs a layer */ #define CAN_QUERY (1<<9) /* this command can be queried, i.e. used with -Q to get back a result to stdout */ #define ARGS_01 (ARGS_0 | ARGS_PLUS1) #define ARGS_02 (ARGS_0 | ARGS_PLUS2) #define ARGS_12 (ARGS_1 | ARGS_PLUS1) #define ARGS_23 (ARGS_2 | ARGS_PLUS1) #define ARGS_24 (ARGS_2 | ARGS_PLUS2) #define ARGS_34 (ARGS_3 | ARGS_PLUS1) #define ARGS_012 (ARGS_0 | ARGS_PLUS1 | ARGS_PLUS2) #define ARGS_0123 (ARGS_0 | ARGS_PLUS1 | ARGS_PLUS2 | ARGS_PLUS3) #define ARGS_123 (ARGS_1 | ARGS_PLUS1 | ARGS_PLUS2) #define ARGS_124 (ARGS_1 | ARGS_PLUS1 | ARGS_PLUS3) #define ARGS_1234 (ARGS_1 | ARGS_PLUS1 | ARGS_PLUS2 | ARGS_PLUS3) struct action { int nr; char **args; int *argl; int quiet; /* Suppress (currently unused) 0x01 - Error message 0x02 - Normal message */ }; #define RC_ILLEGAL -1 #endif /* SCREEN_COMM_H */ EOF $AWK < ${srcdir}/comm.c >> comm.h ' /^ [{] ".*/ { if (old > $2) { printf("***ERROR: %s <= %s !!!\n\n", $2, old); exit 1; } old = $2; } ' $CC -E -I. -I${srcdir} ${srcdir}/comm.c > comm.cpp || exit $? sed < comm.cpp \ -n \ -e '/^ *{ "/y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/' \ -e '/^ *{ "/s/^ *{ "\([^"]*\)".*/\1/p' \ | $AWK ' /.*/ { printf "#define RC_%s %d\n",$0,i++; } END { printf "\n#define RC_LAST %d\n",i-1; } ' >> comm.h chmod a-w comm.h rm -f comm.cpp screen-5.0.1/NEWS.3.60000664000175000017500000000327415011404317012450 0ustar alexalex ---------------------------- What's new in screen-3.6 ? ---------------------------- * Input translation! This makes the vt100 emulation complete. As an addition it is now possible to bind any command to any (function-) key. See the man page for more details (bindkey command). * Status line support. Each window can have a different status line. Use the ANSI APC string to set the status line, i.e.: _\ (For convenience the xterm sequence is also accepted.) You may want to add termcap * '' ':hs:ts=\E_:fs=\E\\:ds=\E_\E\\:' terminfo * '' ':hs:ts=\E_:fs=\E\\:ds=\E_\E\\:' to your ~/.screenrc to make screen advertise the hardstatus support. * Zombie feature added. Windows now may generate a message (with a timestamp) if they die and stay around until the user presses a key. * New paste syntax: Paste can now concatenate registers and paste either on screen or in another register. This makes the old "ins_reg", "copy_reg" commands obsolete. * More architectures supported. Screen now runs on AIX3.2.5, Solaris, NeXT and some other exotic platforms. * Kanji support added. Screen understands JIS, EUC and SJIS coding. This is an experimental feature. * GR charset switching (ISO 2022) implemented. Can be enabled with the "gr" command. * C1 sequences implemented (see the "c1" command). * Tek support from Xiaoguang Zhang. Apply tek.patch if you want to make screen pass tek sequences. * List of new commands: bindkey, c1, command, defc1, defgr, defkanji, gr, kanji, mapdefault, mapnotnext, maptimeout, pastefont, printcmd, readreg, stuff, zombie * Lots of other bugs fixed. screen-5.0.1/viewport.c0000664000175000017500000000524415011404317013466 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.1/winmsg.c0000664000175000017500000005432415011405274013121 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(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; } } 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.1/COPYING0000664000175000017500000010451715011404317012501 0ustar alexalex GNU GENERAL PUBLIC LICENSE Version 3, 29 June 2007 Copyright (C) 2007 Free Software Foundation, Inc. Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The GNU General Public License is a free, copyleft license for software and other kinds of works. The licenses for most software and other practical works are designed to take away your freedom to share and change the works. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change all versions of a program--to make sure it remains free software for all its users. We, the Free Software Foundation, use the GNU General Public License for most of our software; it applies also to any other work released this way by its authors. You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for them if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs, and that you know you can do these things. To protect your rights, we need to prevent others from denying you these rights or asking you to surrender the rights. Therefore, you have certain responsibilities if you distribute copies of the software, or if you modify it: responsibilities to respect the freedom of others. For example, if you distribute copies of such a program, whether gratis or for a fee, you must pass on to the recipients the same freedoms that you received. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. Developers that use the GNU GPL protect your rights with two steps: (1) assert copyright on the software, and (2) offer you this License giving you legal permission to copy, distribute and/or modify it. For the developers' and authors' protection, the GPL clearly explains that there is no warranty for this free software. For both users' and authors' sake, the GPL requires that modified versions be marked as changed, so that their problems will not be attributed erroneously to authors of previous versions. Some devices are designed to deny users access to install or run modified versions of the software inside them, although the manufacturer can do so. This is fundamentally incompatible with the aim of protecting users' freedom to change the software. The systematic pattern of such abuse occurs in the area of products for individuals to use, which is precisely where it is most unacceptable. Therefore, we have designed this version of the GPL to prohibit the practice for those products. If such problems arise substantially in other domains, we stand ready to extend this provision to those domains in future versions of the GPL, as needed to protect the freedom of users. Finally, every program is threatened constantly by software patents. States should not allow patents to restrict development and use of software on general-purpose computers, but in those that do, we wish to avoid the special danger that patents applied to a free program could make it effectively proprietary. To prevent this, the GPL assures that patents cannot be used to render the program non-free. The precise terms and conditions for copying, distribution and modification follow. TERMS AND CONDITIONS 0. Definitions. "This License" refers to version 3 of the GNU General Public License. "Copyright" also means copyright-like laws that apply to other kinds of works, such as semiconductor masks. "The Program" refers to any copyrightable work licensed under this License. Each licensee is addressed as "you". "Licensees" and "recipients" may be individuals or organizations. To "modify" a work means to copy from or adapt all or part of the work in a fashion requiring copyright permission, other than the making of an exact copy. The resulting work is called a "modified version" of the earlier work or a work "based on" the earlier work. A "covered work" means either the unmodified Program or a work based on the Program. To "propagate" a work means to do anything with it that, without permission, would make you directly or secondarily liable for infringement under applicable copyright law, except executing it on a computer or modifying a private copy. Propagation includes copying, distribution (with or without modification), making available to the public, and in some countries other activities as well. To "convey" a work means any kind of propagation that enables other parties to make or receive copies. Mere interaction with a user through a computer network, with no transfer of a copy, is not conveying. An interactive user interface displays "Appropriate Legal Notices" to the extent that it includes a convenient and prominently visible feature that (1) displays an appropriate copyright notice, and (2) tells the user that there is no warranty for the work (except to the extent that warranties are provided), that licensees may convey the work under this License, and how to view a copy of this License. If the interface presents a list of user commands or options, such as a menu, a prominent item in the list meets this criterion. 1. Source Code. The "source code" for a work means the preferred form of the work for making modifications to it. "Object code" means any non-source form of a work. A "Standard Interface" means an interface that either is an official standard defined by a recognized standards body, or, in the case of interfaces specified for a particular programming language, one that is widely used among developers working in that language. The "System Libraries" of an executable work include anything, other than the work as a whole, that (a) is included in the normal form of packaging a Major Component, but which is not part of that Major Component, and (b) serves only to enable use of the work with that Major Component, or to implement a Standard Interface for which an implementation is available to the public in source code form. A "Major Component", in this context, means a major essential component (kernel, window system, and so on) of the specific operating system (if any) on which the executable work runs, or a compiler used to produce the work, or an object code interpreter used to run it. The "Corresponding Source" for a work in object code form means all the source code needed to generate, install, and (for an executable work) run the object code and to modify the work, including scripts to control those activities. However, it does not include the work's System Libraries, or general-purpose tools or generally available free programs which are used unmodified in performing those activities but which are not part of the work. For example, Corresponding Source includes interface definition files associated with source files for the work, and the source code for shared libraries and dynamically linked subprograms that the work is specifically designed to require, such as by intimate data communication or control flow between those subprograms and other parts of the work. The Corresponding Source need not include anything that users can regenerate automatically from other parts of the Corresponding Source. The Corresponding Source for a work in source code form is that same work. 2. Basic Permissions. All rights granted under this License are granted for the term of copyright on the Program, and are irrevocable provided the stated conditions are met. This License explicitly affirms your unlimited permission to run the unmodified Program. The output from running a covered work is covered by this License only if the output, given its content, constitutes a covered work. This License acknowledges your rights of fair use or other equivalent, as provided by copyright law. You may make, run and propagate covered works that you do not convey, without conditions so long as your license otherwise remains in force. You may convey covered works to others for the sole purpose of having them make modifications exclusively for you, or provide you with facilities for running those works, provided that you comply with the terms of this License in conveying all material for which you do not control copyright. Those thus making or running the covered works for you must do so exclusively on your behalf, under your direction and control, on terms that prohibit them from making any copies of your copyrighted material outside their relationship with you. Conveying under any other circumstances is permitted solely under the conditions stated below. Sublicensing is not allowed; section 10 makes it unnecessary. 3. Protecting Users' Legal Rights From Anti-Circumvention Law. No covered work shall be deemed part of an effective technological measure under any applicable law fulfilling obligations under article 11 of the WIPO copyright treaty adopted on 20 December 1996, or similar laws prohibiting or restricting circumvention of such measures. When you convey a covered work, you waive any legal power to forbid circumvention of technological measures to the extent such circumvention is effected by exercising rights under this License with respect to the covered work, and you disclaim any intention to limit operation or modification of the work as a means of enforcing, against the work's users, your or third parties' legal rights to forbid circumvention of technological measures. 4. Conveying Verbatim Copies. You may convey verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice; keep intact all notices stating that this License and any non-permissive terms added in accord with section 7 apply to the code; keep intact all notices of the absence of any warranty; and give all recipients a copy of this License along with the Program. You may charge any price or no price for each copy that you convey, and you may offer support or warranty protection for a fee. 5. Conveying Modified Source Versions. You may convey a work based on the Program, or the modifications to produce it from the Program, in the form of source code under the terms of section 4, provided that you also meet all of these conditions: a) The work must carry prominent notices stating that you modified it, and giving a relevant date. b) The work must carry prominent notices stating that it is released under this License and any conditions added under section 7. This requirement modifies the requirement in section 4 to "keep intact all notices". c) You must license the entire work, as a whole, under this License to anyone who comes into possession of a copy. This License will therefore apply, along with any applicable section 7 additional terms, to the whole of the work, and all its parts, regardless of how they are packaged. This License gives no permission to license the work in any other way, but it does not invalidate such permission if you have separately received it. d) If the work has interactive user interfaces, each must display Appropriate Legal Notices; however, if the Program has interactive interfaces that do not display Appropriate Legal Notices, your work need not make them do so. A compilation of a covered work with other separate and independent works, which are not by their nature extensions of the covered work, and which are not combined with it such as to form a larger program, in or on a volume of a storage or distribution medium, is called an "aggregate" if the compilation and its resulting copyright are not used to limit the access or legal rights of the compilation's users beyond what the individual works permit. Inclusion of a covered work in an aggregate does not cause this License to apply to the other parts of the aggregate. 6. Conveying Non-Source Forms. You may convey a covered work in object code form under the terms of sections 4 and 5, provided that you also convey the machine-readable Corresponding Source under the terms of this License, in one of these ways: a) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by the Corresponding Source fixed on a durable physical medium customarily used for software interchange. b) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by a written offer, valid for at least three years and valid for as long as you offer spare parts or customer support for that product model, to give anyone who possesses the object code either (1) a copy of the Corresponding Source for all the software in the product that is covered by this License, on a durable physical medium customarily used for software interchange, for a price no more than your reasonable cost of physically performing this conveying of source, or (2) access to copy the Corresponding Source from a network server at no charge. c) Convey individual copies of the object code with a copy of the written offer to provide the Corresponding Source. This alternative is allowed only occasionally and noncommercially, and only if you received the object code with such an offer, in accord with subsection 6b. d) Convey the object code by offering access from a designated place (gratis or for a charge), and offer equivalent access to the Corresponding Source in the same way through the same place at no further charge. You need not require recipients to copy the Corresponding Source along with the object code. If the place to copy the object code is a network server, the Corresponding Source may be on a different server (operated by you or a third party) that supports equivalent copying facilities, provided you maintain clear directions next to the object code saying where to find the Corresponding Source. Regardless of what server hosts the Corresponding Source, you remain obligated to ensure that it is available for as long as needed to satisfy these requirements. e) Convey the object code using peer-to-peer transmission, provided you inform other peers where the object code and Corresponding Source of the work are being offered to the general public at no charge under subsection 6d. A separable portion of the object code, whose source code is excluded from the Corresponding Source as a System Library, need not be included in conveying the object code work. A "User Product" is either (1) a "consumer product", which means any tangible personal property which is normally used for personal, family, or household purposes, or (2) anything designed or sold for incorporation into a dwelling. In determining whether a product is a consumer product, doubtful cases shall be resolved in favor of coverage. For a particular product received by a particular user, "normally used" refers to a typical or common use of that class of product, regardless of the status of the particular user or of the way in which the particular user actually uses, or expects or is expected to use, the product. A product is a consumer product regardless of whether the product has substantial commercial, industrial or non-consumer uses, unless such uses represent the only significant mode of use of the product. "Installation Information" for a User Product means any methods, procedures, authorization keys, or other information required to install and execute modified versions of a covered work in that User Product from a modified version of its Corresponding Source. The information must suffice to ensure that the continued functioning of the modified object code is in no case prevented or interfered with solely because modification has been made. If you convey an object code work under this section in, or with, or specifically for use in, a User Product, and the conveying occurs as part of a transaction in which the right of possession and use of the User Product is transferred to the recipient in perpetuity or for a fixed term (regardless of how the transaction is characterized), the Corresponding Source conveyed under this section must be accompanied by the Installation Information. But this requirement does not apply if neither you nor any third party retains the ability to install modified object code on the User Product (for example, the work has been installed in ROM). The requirement to provide Installation Information does not include a requirement to continue to provide support service, warranty, or updates for a work that has been modified or installed by the recipient, or for the User Product in which it has been modified or installed. Access to a network may be denied when the modification itself materially and adversely affects the operation of the network or violates the rules and protocols for communication across the network. Corresponding Source conveyed, and Installation Information provided, in accord with this section must be in a format that is publicly documented (and with an implementation available to the public in source code form), and must require no special password or key for unpacking, reading or copying. 7. Additional Terms. "Additional permissions" are terms that supplement the terms of this License by making exceptions from one or more of its conditions. Additional permissions that are applicable to the entire Program shall be treated as though they were included in this License, to the extent that they are valid under applicable law. If additional permissions apply only to part of the Program, that part may be used separately under those permissions, but the entire Program remains governed by this License without regard to the additional permissions. When you convey a copy of a covered work, you may at your option remove any additional permissions from that copy, or from any part of it. (Additional permissions may be written to require their own removal in certain cases when you modify the work.) You may place additional permissions on material, added by you to a covered work, for which you have or can give appropriate copyright permission. Notwithstanding any other provision of this License, for material you add to a covered work, you may (if authorized by the copyright holders of that material) supplement the terms of this License with terms: a) Disclaiming warranty or limiting liability differently from the terms of sections 15 and 16 of this License; or b) Requiring preservation of specified reasonable legal notices or author attributions in that material or in the Appropriate Legal Notices displayed by works containing it; or c) Prohibiting misrepresentation of the origin of that material, or requiring that modified versions of such material be marked in reasonable ways as different from the original version; or d) Limiting the use for publicity purposes of names of licensors or authors of the material; or e) Declining to grant rights under trademark law for use of some trade names, trademarks, or service marks; or f) Requiring indemnification of licensors and authors of that material by anyone who conveys the material (or modified versions of it) with contractual assumptions of liability to the recipient, for any liability that these contractual assumptions directly impose on those licensors and authors. All other non-permissive additional terms are considered "further restrictions" within the meaning of section 10. If the Program as you received it, or any part of it, contains a notice stating that it is governed by this License along with a term that is a further restriction, you may remove that term. If a license document contains a further restriction but permits relicensing or conveying under this License, you may add to a covered work material governed by the terms of that license document, provided that the further restriction does not survive such relicensing or conveying. If you add terms to a covered work in accord with this section, you must place, in the relevant source files, a statement of the additional terms that apply to those files, or a notice indicating where to find the applicable terms. Additional terms, permissive or non-permissive, may be stated in the form of a separately written license, or stated as exceptions; the above requirements apply either way. 8. Termination. You may not propagate or modify a covered work except as expressly provided under this License. Any attempt otherwise to propagate or modify it is void, and will automatically terminate your rights under this License (including any patent licenses granted under the third paragraph of section 11). However, if you cease all violation of this License, then your license from a particular copyright holder is reinstated (a) provisionally, unless and until the copyright holder explicitly and finally terminates your license, and (b) permanently, if the copyright holder fails to notify you of the violation by some reasonable means prior to 60 days after the cessation. Moreover, your license from a particular copyright holder is reinstated permanently if the copyright holder notifies you of the violation by some reasonable means, this is the first time you have received notice of violation of this License (for any work) from that copyright holder, and you cure the violation prior to 30 days after your receipt of the notice. Termination of your rights under this section does not terminate the licenses of parties who have received copies or rights from you under this License. If your rights have been terminated and not permanently reinstated, you do not qualify to receive new licenses for the same material under section 10. 9. Acceptance Not Required for Having Copies. You are not required to accept this License in order to receive or run a copy of the Program. Ancillary propagation of a covered work occurring solely as a consequence of using peer-to-peer transmission to receive a copy likewise does not require acceptance. However, nothing other than this License grants you permission to propagate or modify any covered work. These actions infringe copyright if you do not accept this License. Therefore, by modifying or propagating a covered work, you indicate your acceptance of this License to do so. 10. Automatic Licensing of Downstream Recipients. Each time you convey a covered work, the recipient automatically receives a license from the original licensors, to run, modify and propagate that work, subject to this License. You are not responsible for enforcing compliance by third parties with this License. An "entity transaction" is a transaction transferring control of an organization, or substantially all assets of one, or subdividing an organization, or merging organizations. If propagation of a covered work results from an entity transaction, each party to that transaction who receives a copy of the work also receives whatever licenses to the work the party's predecessor in interest had or could give under the previous paragraph, plus a right to possession of the Corresponding Source of the work from the predecessor in interest, if the predecessor has it or can get it with reasonable efforts. You may not impose any further restrictions on the exercise of the rights granted or affirmed under this License. For example, you may not impose a license fee, royalty, or other charge for exercise of rights granted under this License, and you may not initiate litigation (including a cross-claim or counterclaim in a lawsuit) alleging that any patent claim is infringed by making, using, selling, offering for sale, or importing the Program or any portion of it. 11. Patents. A "contributor" is a copyright holder who authorizes use under this License of the Program or a work on which the Program is based. The work thus licensed is called the contributor's "contributor version". A contributor's "essential patent claims" are all patent claims owned or controlled by the contributor, whether already acquired or hereafter acquired, that would be infringed by some manner, permitted by this License, of making, using, or selling its contributor version, but do not include claims that would be infringed only as a consequence of further modification of the contributor version. For purposes of this definition, "control" includes the right to grant patent sublicenses in a manner consistent with the requirements of this License. Each contributor grants you a non-exclusive, worldwide, royalty-free patent license under the contributor's essential patent claims, to make, use, sell, offer for sale, import and otherwise run, modify and propagate the contents of its contributor version. In the following three paragraphs, a "patent license" is any express agreement or commitment, however denominated, not to enforce a patent (such as an express permission to practice a patent or covenant not to sue for patent infringement). To "grant" such a patent license to a party means to make such an agreement or commitment not to enforce a patent against the party. If you convey a covered work, knowingly relying on a patent license, and the Corresponding Source of the work is not available for anyone to copy, free of charge and under the terms of this License, through a publicly available network server or other readily accessible means, then you must either (1) cause the Corresponding Source to be so available, or (2) arrange to deprive yourself of the benefit of the patent license for this particular work, or (3) arrange, in a manner consistent with the requirements of this License, to extend the patent license to downstream recipients. "Knowingly relying" means you have actual knowledge that, but for the patent license, your conveying the covered work in a country, or your recipient's use of the covered work in a country, would infringe one or more identifiable patents in that country that you have reason to believe are valid. If, pursuant to or in connection with a single transaction or arrangement, you convey, or propagate by procuring conveyance of, a covered work, and grant a patent license to some of the parties receiving the covered work authorizing them to use, propagate, modify or convey a specific copy of the covered work, then the patent license you grant is automatically extended to all recipients of the covered work and works based on it. A patent license is "discriminatory" if it does not include within the scope of its coverage, prohibits the exercise of, or is conditioned on the non-exercise of one or more of the rights that are specifically granted under this License. You may not convey a covered work if you are a party to an arrangement with a third party that is in the business of distributing software, under which you make payment to the third party based on the extent of your activity of conveying the work, and under which the third party grants, to any of the parties who would receive the covered work from you, a discriminatory patent license (a) in connection with copies of the covered work conveyed by you (or copies made from those copies), or (b) primarily for and in connection with specific products or compilations that contain the covered work, unless you entered into that arrangement, or that patent license was granted, prior to 28 March 2007. Nothing in this License shall be construed as excluding or limiting any implied license or other defenses to infringement that may otherwise be available to you under applicable patent law. 12. No Surrender of Others' Freedom. If conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot convey a covered work so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not convey it at all. For example, if you agree to terms that obligate you to collect a royalty for further conveying from those to whom you convey the Program, the only way you could satisfy both those terms and this License would be to refrain entirely from conveying the Program. 13. Use with the GNU Affero General Public License. Notwithstanding any other provision of this License, you have permission to link or combine any covered work with a work licensed under version 3 of the GNU Affero General Public License into a single combined work, and to convey the resulting work. The terms of this License will continue to apply to the part which is the covered work, but the special requirements of the GNU Affero General Public License, section 13, concerning interaction through a network will apply to the combination as such. 14. Revised Versions of this License. The Free Software Foundation may publish revised and/or new versions of the GNU General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies that a certain numbered version of the GNU General Public License "or any later version" applies to it, you have the option of following the terms and conditions either of that numbered version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of the GNU General Public License, you may choose any version ever published by the Free Software Foundation. If the Program specifies that a proxy can decide which future versions of the GNU General Public License can be used, that proxy's public statement of acceptance of a version permanently authorizes you to choose that version for the Program. Later license versions may give you additional or different permissions. However, no additional obligations are imposed on any author or copyright holder as a result of your choosing to follow a later version. 15. Disclaimer of Warranty. THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 16. Limitation of Liability. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. 17. Interpretation of Sections 15 and 16. If the disclaimer of warranty and limitation of liability provided above cannot be given local legal effect according to their terms, reviewing courts shall apply local law that most closely approximates an absolute waiver of all civil liability in connection with the Program, unless a warranty or assumption of liability accompanies a copy of the Program in return for a fee. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively state the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) 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 . Also add information on how to contact you by electronic and paper mail. If the program does terminal interaction, make it output a short notice like this when it starts in an interactive mode: Copyright (C) This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, your program's commands might be different; for a GUI interface, you would use an "about box". You should also get your employer (if you work as a programmer) or school, if any, to sign a "copyright disclaimer" for the program, if necessary. For more information on this, and how to apply and follow the GNU GPL, see . The GNU General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License. But first, please read . screen-5.0.1/backtick.h0000664000175000017500000000400115011404317013355 0ustar alexalex/* 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_BACKTICK_H #define SCREEN_BACKTICK_H #include #include "screen.h" typedef struct backtick { struct backtick *next; int num; int tick; int lifespan; time_t bestbefore; char result[MAXSTR]; /* TODO: not re-entrant */ char **cmdv; Event ev; char *buf; int bufi; } Backtick; /* TODO: these still need refactoring */ void setbacktick(int, int, int, char **); char *runbacktick(Backtick *bt, int *tickp, time_t now); /* opaque interface */ Backtick *bt_find_id(int); #endif screen-5.0.1/term.sh0000664000175000017500000000616415011404317012750 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.1/display.h0000664000175000017500000003371015011404317013260 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_DISPLAY_H #define SCREEN_DISPLAY_H #include "layout.h" #include "canvas.h" #include "viewport.h" #include "comm.h" #include "image.h" #include "screen.h" #define KMAP_KEYS (T_OCAPS-T_CAPS) #define KMAP_AKEYS (T_OCAPS-T_CURSOR) #define KMAP_NOTIMEOUT 0x4000 struct kmap_ext { char *str; int fl; struct action um; struct action dm; struct action mm; }; typedef enum { STATUS_OFF = 0, STATUS_ON_WIN = 1, STATUS_ON_HS = 2 } DisplayStatus; typedef enum { HSTATUS_IGNORE = 0, HSTATUS_LASTLINE = 1, HSTATUS_MESSAGE = 2, HSTATUS_HS = 3, HSTATUS_FIRSTLINE = 4, HSTATUS_ALWAYS = (1<<3) } HardStatus; struct statusposstr { int row, col; }; #define STATUS_TOP 1 #define STATUS_BOTTOM 0 #define STATUS_LEFT 0 #define STATUS_RIGHT 1 struct mouse_parse { char sgrmode; /* non-zero if parsing an SGR sequence */ int state; /* current state of parsing */ int params[3]; /* parsed params: button, x, y */ }; typedef struct Display Display; struct Display { Display *d_next; /* linked list */ struct acluser *d_user; /* user who owns that display */ Canvas d_canvas; /* our canvas slice */ Canvas *d_cvlist; /* the canvases of this display */ Canvas *d_forecv; /* current input focus */ Layout *d_layout; /* layout we're using */ void (*d_processinput) (char *, size_t); struct pwdata *d_processinputdata; /* data for processinput */ int d_vpxmin, d_vpxmax; /* min/max used position on display */ Window *d_fore; /* pointer to fore window */ Window *d_other; /* pointer to other window */ int d_nonblock; /* -1 don't block if obufmax reached */ /* >0: block after nonblock secs */ char d_termname[MAXTERMLEN + 1]; /* $TERM */ char *d_tentry; /* buffer for tgetstr */ char d_tcinited; /* termcap inited flag */ int d_width, d_height; /* width/height of the screen */ int d_defwidth, d_defheight; /* default width/height of windows */ int d_top, d_bot; /* scrollregion start/end */ int d_x, d_y; /* cursor position */ struct mchar d_rend; /* current rendition */ char d_atyp; /* current attribute types */ int d_mbcs; /* saved char for multibytes charset */ int d_encoding; /* what encoding type the display is */ int d_decodestate; /* state of our decoder */ int d_realfont; /* real font of terminal */ bool d_insert; /* insert mode flag */ int d_keypad; /* application keypad flag */ int d_cursorkeys; /* application cursorkeys flag */ bool d_revvid; /* reverse video */ int d_curvis; /* cursor visibility */ HardStatus d_has_hstatus; /* display has hardstatus line */ bool d_hstatus; /* hardstatus used */ int d_lp_missing; /* last character on bot line missing */ int d_mouse; /* mouse mode */ int d_extmouse; /* extended mouse mode */ struct mouse_parse d_mouse_parse; /* state of mouse code parsing */ int d_mousetrack; /* set when user wants to use mouse even when the window does not */ int d_bracketed; /* bracketed paste mode */ int d_cursorstyle; /* cursor style */ int d_xtermosc[5]; /* osc used */ struct mchar d_lpchar; /* missing char */ struct timeval d_status_time; /* time of status display */ DisplayStatus d_status; /* is status displayed? */ char d_status_bell; /* is it only a vbell? */ int d_status_len; /* length of status line */ char *d_status_lastmsg; /* last displayed message */ int d_status_buflen; /* last message buffer len */ int d_status_lastx; /* position of the cursor */ int d_status_lasty; /* before status was displayed */ int d_status_obuflen; /* saved obuflen */ int d_status_obuffree; /* saved obuffree */ int d_status_obufpos; /* end of status position in obuf */ Event d_statusev; /* timeout event */ Event d_hstatusev; /* hstatus changed event */ int d_kaablamm; /* display kaablamm msg */ struct action *d_ESCseen; /* Was the last char an ESC (^a) */ pid_t d_userpid; /* pid of attacher */ char d_usertty[MAXPATHLEN]; /* tty we are attached to */ int d_userfd; /* fd of the tty */ Event d_readev; /* userfd read event */ Event d_writeev; /* userfd write event */ Event d_blockedev; /* blocked timeout */ struct mode d_OldMode; /* tty mode when screen was started */ struct mode d_NewMode; /* New tty mode */ int d_flow; /* tty's flow control on/off flag*/ int d_intrc; /* current intr when flow is on */ char *d_obuf; /* output buffer */ int d_obuflen; /* len of buffer */ int d_obufmax; /* len where we are blocking the pty */ int d_obuflenmax; /* len - max */ char *d_obufp; /* pointer in buffer */ int d_obuffree; /* free bytes in buffer */ bool d_auto_nuke; /* autonuke flag */ int d_nseqs; /* number of valid mappings */ int d_aseqs; /* number of allocated mappings */ unsigned char *d_kmaps; /* keymaps */ unsigned char *d_seqp; /* pointer into keymap array */ int d_seql; /* number of parsed chars */ unsigned char *d_seqh; /* last hit */ Event d_mapev; /* timeout event */ int d_dontmap; /* do not map next */ int d_mapdefault; /* do map next to default */ union tcu d_tcs[T_N]; /* terminal capabilities */ char *d_attrtab[NATTR]; /* attrib emulation table */ char d_attrtyp[NATTR]; /* attrib group table */ int d_hascolor; /* do we support color */ char d_c0_tab[256]; /* conversion for C0 */ char ***d_xtable; /* char translation table */ int d_UPcost, d_DOcost, d_LEcost, d_NDcost; int d_CRcost, d_IMcost, d_EIcost, d_NLcost; int d_printfd; /* fd for vt100 print sequence */ #ifdef ENABLE_UTMP slot_t d_loginslot; /* offset, where utmp_logintty belongs */ struct utmpx d_utmp_logintty; /* here the original utmp structure is stored */ int d_loginttymode; #endif int d_blocked; int d_blocked_fuzz; Event d_idleev; /* screen blanker */ pid_t d_blankerpid; Event d_blankerev; Event d_mousetimeoutev; /* mouse sequence timeout event */ }; #define DISPLAY(x) display->x #define D_user DISPLAY(d_user) #define D_username (DISPLAY(d_user) ? DISPLAY(d_user)->u_name : 0) #define D_bracketed DISPLAY(d_bracketed) #define D_cursorstyle DISPLAY(d_cursorstyle) #define D_canvas DISPLAY(d_canvas) #define D_cvlist DISPLAY(d_cvlist) #define D_layout DISPLAY(d_layout) #define D_forecv DISPLAY(d_forecv) #define D_processinput DISPLAY(d_processinput) #define D_processinputdata DISPLAY(d_processinputdata) #define D_vpxmin DISPLAY(d_vpxmin) #define D_vpxmax DISPLAY(d_vpxmax) #define D_fore DISPLAY(d_fore) #define D_other DISPLAY(d_other) #define D_nonblock DISPLAY(d_nonblock) #define D_termname DISPLAY(d_termname) #define D_tentry DISPLAY(d_tentry) #define D_tcinited DISPLAY(d_tcinited) #define D_width DISPLAY(d_width) #define D_height DISPLAY(d_height) #define D_defwidth DISPLAY(d_defwidth) #define D_defheight DISPLAY(d_defheight) #define D_top DISPLAY(d_top) #define D_bot DISPLAY(d_bot) #define D_x DISPLAY(d_x) #define D_y DISPLAY(d_y) #define D_rend DISPLAY(d_rend) #define D_atyp DISPLAY(d_atyp) #define D_mbcs DISPLAY(d_mbcs) #define D_encoding DISPLAY(d_encoding) #define D_decodestate DISPLAY(d_decodestate) #define D_realfont DISPLAY(d_realfont) #define D_insert DISPLAY(d_insert) #define D_keypad DISPLAY(d_keypad) #define D_cursorkeys DISPLAY(d_cursorkeys) #define D_revvid DISPLAY(d_revvid) #define D_curvis DISPLAY(d_curvis) #define D_has_hstatus DISPLAY(d_has_hstatus) #define D_hstatus DISPLAY(d_hstatus) #define D_lp_missing DISPLAY(d_lp_missing) #define D_mouse DISPLAY(d_mouse) #define D_mouse_parse DISPLAY(d_mouse_parse) #define D_extmouse DISPLAY(d_extmouse) #define D_mousetrack DISPLAY(d_mousetrack) #define D_xtermosc DISPLAY(d_xtermosc) #define D_lpchar DISPLAY(d_lpchar) #define D_status DISPLAY(d_status) #define D_status_time DISPLAY(d_status_time) #define D_status_bell DISPLAY(d_status_bell) #define D_status_len DISPLAY(d_status_len) #define D_status_lastmsg DISPLAY(d_status_lastmsg) #define D_status_buflen DISPLAY(d_status_buflen) #define D_status_lastx DISPLAY(d_status_lastx) #define D_status_lasty DISPLAY(d_status_lasty) #define D_status_obuflen DISPLAY(d_status_obuflen) #define D_status_obuffree DISPLAY(d_status_obuffree) #define D_status_obufpos DISPLAY(d_status_obufpos) #define D_statusev DISPLAY(d_statusev) #define D_hstatusev DISPLAY(d_hstatusev) #define D_kaablamm DISPLAY(d_kaablamm) #define D_ESCseen DISPLAY(d_ESCseen) #define D_userpid DISPLAY(d_userpid) #define D_usertty DISPLAY(d_usertty) #define D_userfd DISPLAY(d_userfd) #define D_OldMode DISPLAY(d_OldMode) #define D_NewMode DISPLAY(d_NewMode) #define D_flow DISPLAY(d_flow) #define D_intr DISPLAY(d_intr) #define D_obuf DISPLAY(d_obuf) #define D_obuflen DISPLAY(d_obuflen) #define D_obufmax DISPLAY(d_obufmax) #define D_obuflenmax DISPLAY(d_obuflenmax) #define D_obufp DISPLAY(d_obufp) #define D_obuffree DISPLAY(d_obuffree) #define D_auto_nuke DISPLAY(d_auto_nuke) #define D_nseqs DISPLAY(d_nseqs) #define D_aseqs DISPLAY(d_aseqs) #define D_seqp DISPLAY(d_seqp) #define D_seql DISPLAY(d_seql) #define D_seqh DISPLAY(d_seqh) #define D_dontmap DISPLAY(d_dontmap) #define D_mapdefault DISPLAY(d_mapdefault) #define D_kmaps DISPLAY(d_kmaps) #define D_tcs DISPLAY(d_tcs) #define D_attrtab DISPLAY(d_attrtab) #define D_attrtyp DISPLAY(d_attrtyp) #define D_hascolor DISPLAY(d_hascolor) #define D_c0_tab DISPLAY(d_c0_tab) #define D_xtable DISPLAY(d_xtable) #define D_UPcost DISPLAY(d_UPcost) #define D_DOcost DISPLAY(d_DOcost) #define D_LEcost DISPLAY(d_LEcost) #define D_NDcost DISPLAY(d_NDcost) #define D_CRcost DISPLAY(d_CRcost) #define D_IMcost DISPLAY(d_IMcost) #define D_EIcost DISPLAY(d_EIcost) #define D_NLcost DISPLAY(d_NLcost) #define D_printfd DISPLAY(d_printfd) #define D_loginslot DISPLAY(d_loginslot) #define D_utmp_logintty DISPLAY(d_utmp_logintty) #define D_loginttymode DISPLAY(d_loginttymode) #define D_loginhost DISPLAY(d_loginhost) #define D_readev DISPLAY(d_readev) #define D_writeev DISPLAY(d_writeev) #define D_blockedev DISPLAY(d_blockedev) #define D_mapev DISPLAY(d_mapev) #define D_blocked DISPLAY(d_blocked) #define D_blocked_fuzz DISPLAY(d_blocked_fuzz) #define D_idleev DISPLAY(d_idleev) #define D_blankerev DISPLAY(d_blankerev) #define D_blankerpid DISPLAY(d_blankerpid) #define D_mousetimeoutev DISPLAY(d_mousetimeoutev) #define GRAIN 4096 /* Allocation grain size for output buffer */ #define OBUF_MAX 256 /* default for obuflimit */ #define OUTPUT_BLOCK_SIZE 256 /* Block size of output to tty */ #define AddChar(c) \ do \ { \ if (--D_obuffree <= 0) \ Resize_obuf(); \ *D_obufp++ = (c); \ } \ while (0) Display *MakeDisplay (char *, char *, char *, int, pid_t, struct mode *); void FreeDisplay (void); void DefProcess (char **, size_t *); void DefRedisplayLine (int, int, int, int); void DefClearLine (int, int, int, int); int DefResize (int, int); void DefRestore (void); void AddCStr (char *); void AddCStr2 (char *, int); void InitTerm (int); void FinitTerm (void); void PUTCHAR (uint32_t); void PUTCHARLP (uint32_t); void ClearAll (void); void ClearArea (int, int, int, int, int, int, int, int); void ClearLine (struct mline *, int, int, int, int); void RefreshAll (int); void RefreshArea (int, int, int, int, int); void RefreshLine (int, int, int, int); void Redisplay (int); void RedisplayDisplays (int); void ShowHStatus (char *); void RefreshHStatus (void); void DisplayLine (struct mline *, struct mline *, int, int, int); void GotoPos (int, int); int CalcCost (char *); void ScrollH (int, int, int, int, int, struct mline *); void ScrollV (int, int, int, int, int, int); void PutChar (struct mchar *, int, int); void InsChar (struct mchar *, int, int, int, struct mline *); void WrapChar (struct mchar *, int, int, int, int, int, int, bool); void ChangeScrollRegion (int, int); void InsertMode (bool); void KeypadMode (int); void CursorkeysMode (int); void ReverseVideo (bool); void CursorVisibility (int); void MouseMode (int); void ExtMouseMode (int); void BracketedPasteMode (bool); void CursorStyle (int); void SetRendition (struct mchar *); void SetRenditionMline (struct mline *, int); void MakeStatus (char *); void RemoveStatus (void); int ResizeDisplay (int, int); void AddStr (char *); void AddStrn (char *, int); void Flush (int); void freetty (void); void Resize_obuf (void); void NukePending (void); void ClearAllXtermOSC (void); void SetXtermOSC (int, char *, char *); void ResetIdle (void); void RunBlanker (char **); void KillBlanker (void); void DisplaySleep1000 (int, int); void ClearScrollbackBuffer (void); /* global variables */ extern bool defautonuke; extern int captionalways; extern int captiontop; extern int defmousetrack; extern int defnonblock; extern int defobuflimit; extern int focusminheight; extern int focusminwidth; extern int hardstatusemu; extern Display *display, *displays; extern const struct LayFuncs BlankLf; extern struct statusposstr statuspos; #endif /* SCREEN_DISPLAY_H */ screen-5.0.1/logfile.h0000664000175000017500000000663715011404317013244 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 appropriatly 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.1/list_license.c0000664000175000017500000001352015011404317014260 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 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.1/comm.c0000664000175000017500000002243515011404317012543 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 "comm.h" /* Must be in alpha order ! */ struct comm comms[RC_LAST + 1] = { { "acladd", ARGS_1234, {NULL} }, { "aclchg", ARGS_23, {NULL} }, { "acldel", ARGS_1, {NULL} }, { "aclgrp", ARGS_12, {NULL} }, { "aclumask", ARGS_1|ARGS_ORMORE, {NULL} }, { "activity", ARGS_1, {NULL} }, { "addacl", ARGS_1234, {NULL} }, { "allpartial", NEED_DISPLAY|ARGS_1, {NULL} }, { "altscreen", ARGS_01, {NULL} }, { "at", ARGS_2|ARGS_ORMORE, {NULL} }, { "auth", ARGS_1, {NULL} }, { "autodetach", ARGS_1, {NULL} }, { "autonuke", NEED_DISPLAY|ARGS_1, {NULL} }, { "backtick", ARGS_1|ARGS_ORMORE, {NULL} }, { "bce", NEED_FORE|ARGS_01, {NULL} }, { "bell", ARGS_01, {NULL} }, { "bell_msg", ARGS_01, {NULL} }, { "bind", ARGS_1|ARGS_ORMORE, {NULL} }, { "bindkey", ARGS_0|ARGS_ORMORE, {NULL} }, { "blanker", NEED_DISPLAY|ARGS_0, {NULL} }, { "blankerprg", ARGS_0|ARGS_ORMORE, {NULL} }, { "break", NEED_FORE|ARGS_01, {NULL} }, { "breaktype", NEED_FORE|ARGS_01, {NULL} }, { "bufferfile", ARGS_01, {NULL} }, { "bumpleft", NEED_FORE|ARGS_0, {NULL} }, { "bumpright", NEED_FORE|ARGS_0, {NULL} }, { "c1", NEED_FORE|ARGS_01, {NULL} }, { "caption", ARGS_123, {NULL} }, { "chacl", ARGS_23, {NULL} }, { "charset", NEED_FORE|ARGS_1, {NULL} }, { "chdir", ARGS_01, {NULL} }, { "cjkwidth", ARGS_01, {NULL} }, { "clear", NEED_FORE|ARGS_0, {NULL} }, { "collapse", ARGS_0, {NULL} }, { "colon", NEED_LAYER|ARGS_01, {NULL} }, { "command", NEED_DISPLAY|ARGS_02, {NULL} }, { "compacthist", ARGS_01, {NULL} }, { "console", NEED_FORE|ARGS_01, {NULL} }, { "copy", NEED_FORE|NEED_DISPLAY|ARGS_0, {NULL} }, { "crlf", ARGS_01, {NULL} }, { "defautonuke", ARGS_1, {NULL} }, { "defbce", ARGS_1, {NULL} }, { "defbreaktype", ARGS_01, {NULL} }, { "defc1", ARGS_1, {NULL} }, { "defcharset", ARGS_01, {NULL} }, { "defdynamictitle", ARGS_1, {NULL} }, { "defencoding", ARGS_1, {NULL} }, { "defescape", ARGS_1, {NULL} }, { "defflow", ARGS_12, {NULL} }, { "defgr", ARGS_1, {NULL} }, { "defhstatus", ARGS_01, {NULL} }, { "defkanji", ARGS_1, {NULL} }, { "deflog", ARGS_1, {NULL} }, #if defined(ENABLE_UTMP) { "deflogin", ARGS_1, {NULL} }, #endif { "defmode", ARGS_1, {NULL} }, { "defmonitor", ARGS_1, {NULL} }, { "defmousetrack", ARGS_1, {NULL} }, { "defnonblock", ARGS_1, {NULL} }, { "defobuflimit", ARGS_1, {NULL} }, { "defscrollback", ARGS_1, {NULL} }, { "defshell", ARGS_1, {NULL} }, { "defsilence", ARGS_1, {NULL} }, { "defslowpaste", ARGS_1, {NULL} }, { "defutf8", ARGS_1, {NULL} }, { "defwrap", ARGS_1, {NULL} }, { "defwritelock", ARGS_1, {NULL} }, { "detach", NEED_DISPLAY|ARGS_01, {NULL} }, { "digraph", NEED_LAYER|ARGS_012, {NULL} }, { "dinfo", NEED_DISPLAY|ARGS_0, {NULL} }, { "displays", NEED_LAYER|ARGS_0, {NULL} }, { "dumptermcap", NEED_FORE|ARGS_0, {NULL} }, { "dynamictitle", ARGS_1, {NULL} }, { "echo", CAN_QUERY|ARGS_12, {NULL} }, { "encoding", ARGS_12, {NULL} }, { "escape", ARGS_1, {NULL} }, { "eval", ARGS_1|ARGS_ORMORE, {NULL} }, { "exec", ARGS_0|ARGS_ORMORE, {NULL} }, { "fit", NEED_DISPLAY|ARGS_0, {NULL} }, { "flow", NEED_FORE|ARGS_01, {NULL} }, { "focus", NEED_DISPLAY|ARGS_01, {NULL} }, { "focusminsize", ARGS_02, {NULL} }, { "gr", NEED_FORE|ARGS_01, {NULL} }, { "group", NEED_FORE|ARGS_01, {NULL} }, { "hardcopy", NEED_FORE|ARGS_012, {NULL} }, { "hardcopy_append", ARGS_1, {NULL} }, { "hardcopydir", ARGS_01, {NULL} }, { "hardstatus", ARGS_012, {NULL} }, { "height", ARGS_0123, {NULL} }, { "help", NEED_LAYER|ARGS_02, {NULL} }, { "history", NEED_DISPLAY|NEED_FORE|ARGS_0, {NULL} }, { "hstatus", NEED_FORE|ARGS_1, {NULL} }, { "idle", ARGS_0|ARGS_ORMORE, {NULL} }, { "ignorecase", ARGS_01, {NULL} }, { "info", CAN_QUERY|NEED_LAYER|ARGS_0, {NULL} }, { "kanji", NEED_FORE|ARGS_12, {NULL} }, { "kill", NEED_FORE|ARGS_01, {NULL} }, { "lastmsg", CAN_QUERY|NEED_DISPLAY|ARGS_0, {NULL} }, { "layout", ARGS_1|ARGS_ORMORE, {NULL} }, { "license", NEED_LAYER|ARGS_0, {NULL} }, { "lockscreen", NEED_DISPLAY|ARGS_0, {NULL} }, { "log", NEED_FORE|ARGS_01, {NULL} }, { "logfile", ARGS_012, {NULL} }, #if defined(ENABLE_UTMP) { "login", NEED_FORE|ARGS_01, {NULL} }, #endif { "logtstamp", ARGS_012, {NULL} }, { "mapdefault", NEED_DISPLAY|ARGS_0, {NULL} }, { "mapnotnext", NEED_DISPLAY|ARGS_0, {NULL} }, { "maptimeout", ARGS_01, {NULL} }, { "markkeys", ARGS_1, {NULL} }, { "meta", NEED_LAYER|ARGS_0, {NULL} }, { "monitor", NEED_FORE|ARGS_01, {NULL} }, { "mousetrack", NEED_DISPLAY | ARGS_01, {NULL} }, { "msgminwait", ARGS_1, {NULL} }, { "msgwait", ARGS_1, {NULL} }, { "multiinput", ARGS_01, {NULL} }, { "multiuser", ARGS_1, {NULL} }, { "next", ARGS_0, {NULL} }, { "nonblock", NEED_DISPLAY|ARGS_01, {NULL} }, { "number", CAN_QUERY|NEED_FORE|ARGS_01, {NULL} }, { "obuflimit", NEED_DISPLAY|ARGS_01, {NULL} }, { "only", NEED_DISPLAY|ARGS_0, {NULL} }, { "other", ARGS_0, {NULL} }, { "parent", ARGS_0, {NULL} }, { "partial", NEED_FORE|ARGS_01, {NULL} }, { "paste", NEED_LAYER|ARGS_012, {NULL} }, { "pastefont", ARGS_01, {NULL} }, { "pow_break", NEED_FORE|ARGS_01, {NULL} }, { "pow_detach", NEED_DISPLAY|ARGS_01, {NULL} }, { "pow_detach_msg", ARGS_01, {NULL} }, { "prev", ARGS_0, {NULL} }, { "printcmd", ARGS_01, {NULL} }, { "process", NEED_DISPLAY|ARGS_01, {NULL} }, { "quit", ARGS_01, {NULL} }, { "readbuf", ARGS_0123, {NULL} }, { "readreg", ARGS_0|ARGS_ORMORE, {NULL} }, { "redisplay", NEED_DISPLAY|ARGS_0, {NULL} }, { "register", ARGS_24, {NULL} }, { "remove", NEED_DISPLAY|ARGS_0, {NULL} }, { "removebuf", ARGS_0, {NULL} }, { "rendition", ARGS_2, {NULL} }, { "reset", NEED_FORE|ARGS_0, {NULL} }, { "resize", NEED_DISPLAY|ARGS_0|ARGS_ORMORE,{NULL} }, { "screen", ARGS_0|ARGS_ORMORE, {NULL} }, { "scrollback", NEED_FORE|ARGS_1, {NULL} }, { "select", CAN_QUERY|ARGS_01, {NULL} }, { "sessionname", ARGS_01, {NULL} }, { "setenv", ARGS_012, {NULL} }, { "setsid", ARGS_1, {NULL} }, { "shell", ARGS_1, {NULL} }, { "shelltitle", ARGS_1, {NULL} }, { "silence", NEED_FORE|ARGS_01, {NULL} }, { "silencewait", ARGS_1, {NULL} }, { "sleep", ARGS_1, {NULL} }, { "slowpaste", NEED_FORE|ARGS_01, {NULL} }, { "sorendition", ARGS_012, {NULL} }, { "sort", ARGS_0, {NULL} }, { "source", ARGS_1, {NULL} }, { "split", NEED_DISPLAY|ARGS_01, {NULL} }, { "startup_message", ARGS_1, {NULL} }, { "status", ARGS_12, {NULL} }, { "stuff", NEED_LAYER|ARGS_012, {NULL} }, { "su", NEED_DISPLAY|ARGS_012, {NULL} }, { "suspend", NEED_DISPLAY|ARGS_0, {NULL} }, { "term", ARGS_1, {NULL} }, { "termcap", ARGS_23, {NULL} }, { "termcapinfo", ARGS_23, {NULL} }, { "terminfo", ARGS_23, {NULL} }, { "title", CAN_QUERY|NEED_FORE|ARGS_01, {NULL} }, { "truecolor", ARGS_1, {NULL} }, { "umask", ARGS_1|ARGS_ORMORE, {NULL} }, { "unbindall", ARGS_0, {NULL} }, { "unsetenv", ARGS_1, {NULL} }, { "utf8", NEED_FORE|ARGS_012, {NULL} }, { "vbell", ARGS_01, {NULL} }, { "vbell_msg", ARGS_01, {NULL} }, { "vbellwait", ARGS_1, {NULL} }, { "verbose", ARGS_01, {NULL} }, { "version", ARGS_0, {NULL} }, { "wall", NEED_DISPLAY|ARGS_1, {NULL} }, { "width", ARGS_0123, {NULL} }, { "windowlist", ARGS_012, {NULL} }, { "windows", CAN_QUERY|ARGS_01, {NULL} }, { "wrap", NEED_FORE|ARGS_01, {NULL} }, { "writebuf", ARGS_0123, {NULL} }, { "writelock", NEED_FORE|ARGS_01, {NULL} }, { "xoff", NEED_LAYER|ARGS_0, {NULL} }, { "xon", NEED_LAYER|ARGS_0, {NULL} }, { "zmodem", ARGS_012, {NULL} }, { "zombie", ARGS_012, {NULL} }, { "zombie_timeout", ARGS_1, {NULL} } }; screen-5.0.1/pty.h0000664000175000017500000000024515011404317012424 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.1/fileio.h0000664000175000017500000000072515011404317013062 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.1/input.c0000664000175000017500000003170215011404317012744 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 editible 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.1/utf8encodings/0000775000175000017500000000000015011404317014216 5ustar alexalexscreen-5.0.1/utf8encodings/a10000664000175000017500000000103015011404317014434 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.1/utf8encodings/020000664000175000017500000006563615011404317014402 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.1/utf8encodings/a30000664000175000017500000000103015011404317014436 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.1/utf8encodings/c30000664000175000017500000000021415011404317014443 0ustar alexalexScreenI2UTF8ÃISO-8859-3¡&¢ئ$©0ª^«¬4¯{±'¶%¹1º_»¼5¿|Å ÆÕ ØÝlÞ\å æ õ!øýmþ]ÿÙscreen-5.0.1/utf8encodings/c80000664000175000017500000000005015011404317014446 0ustar alexalexScreenI2UTF8ÈISO-8859-8ß àЀúêscreen-5.0.1/utf8encodings/040000664000175000017500000005735615011404317014404 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.1/utf8encodings/030000664000175000017500000010023615011404317014365 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.1/utf8encodings/d60000664000175000017500000000032415011404317014451 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.1/utf8encodings/c70000664000175000017500000000006415011404317014452 0ustar alexalexScreenI2UTF8ÇISO-8859-6¬ »¿€Ú:à@€òRscreen-5.0.1/utf8encodings/c60000664000175000017500000000010415011404317014444 0ustar alexalexScreenI2UTF8Æ ISO-8859-7¡½¢¼¯ ´„€¶†¸ˆ€ºмŒ¾Ž€ÿÏscreen-5.0.1/utf8encodings/c20000664000175000017500000000040015011404317014437 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.1/utf8encodings/190000664000175000017500000027304015011404317014400 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.1/utf8encodings/cc0000664000175000017500000000010415011404317014521 0ustar alexalexScreenI2UTF8Ì ISO-8859-5¡€¬ ®€ïOð!ñQ€ü\ý§þ^ÿ_screen-5.0.1/utf8encodings/c40000664000175000017500000000034415011404317014450 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.1/utf8encodings/010000664000175000017500000007216015011404317014367 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.1/utf8encodings/180000664000175000017500000015311615011404317014400 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.1/utf8encodings/bf0000664000175000017500000000035015011404317014526 0ustar alexalexScreenI2UTF8¿4CP-1251€‚ ƒS„ … &† ‡ !ˆ ¬‰ 0Š ‹ 9Œ  Ž R‘ ’ “ ” • "– — ˜ ™!"šY› :œZ\ž[Ÿ_¡¢^£¥¨©©ª¯²³V´‘¸Q¹!ºT¼X½¾U¿WÀ€ÿOscreen-5.0.1/utf8encodings/cd0000664000175000017500000000006415011404317014527 0ustar alexalexScreenI2UTF8ÍISO-8859-9ÐÝ0Þ^ðý1þ_screen-5.0.1/ChangeLog0000664000175000017500000005247615011404317013226 0ustar alexalexVersion 5.0.1 (12/05/25): * Fixes: - CVE-2025-46805: do NOT send signals with root privileges - CVE-2025-46804: avoid file existence test information leaks - CVE-2025-46803: apply safe PTY default mode of 0620 - CVE-2025-46802: prevent temporary 0666 mode on PTYs in attacher - CVE-2025-23395: reintroduce lf_secreopen() for logfile - buffer overflow due bad strncpy() - uninitialized variables warnings - typos - combining char handling that could lead to a segfault Version 5.0.0 (28/08/24): * Rewritten authentication mechanism * Add escape %T to show current tty for window * Add escape %O to show number of currently open windows * Use wcwdith() instead of UTF-8 hard-coded tables * New commands: - auth [on|off] Provides password protection - status [top|up|down|bottom] [left|right] The status window by default is in bottom-left corner. This command can move status messages to any corner of the screen. - truecolor [on|off] - multiinput Input to multiple windows at the same time * Removed commands: - time - debug - password - maxwin - nethack * Fixes: - Screen buffers ESC keypresses indefinitely - Crashes after passing through a zmodem transfer - Fix double -U issue Version 4.9.1 (20/08/2023): * Support stop/parity bits on serial port (#23952) * Add needed system headers in checks and return values for implicit function declarations * Fixes: - Avoid zombies after shell exit (#25089) - Missed signal sending permission check on failed query messages (CVE-2023-24626) - manpage fixes - source code fixes during cleanup - UTF-8 encoding can emit invalid UTF-8 sequences for out of range unicode values (#62097) Version 4.9.0 (30/01/2022): * Hardstatus option for used encoding (escape string '%e') * OpenBSD uses native openpty() from its utils.h * Fixes: - fix combining char handling that could lead to a segfault - CVE-2021-26937: possible denial of service via a crafted UTF-8 character sequence (bug #60030) - make screen exit code be 0 when checking --help - session names limit is 80 symbols (bug #61534) - option -X ignores specified user in multiuser env (bug #37437) - a lot of reformations/fixes/cleanups (man page and source code) Version 4.8.0 (05/02/2020): * Improve startup time by only polling for files to close * Fixes: - Fix for segfault if termcap doesn't have Km entry - Make screen exit code be 0 when checking --version - Fix potential memory corruption when using OSC 49 Version 4.7.0 (02/10/2019): * Add support for SGR (1006) mouse mode * Add support for OSC 11 * Update Unicode ambiguous and wide tables to 12.1.0 * Fixes: - cross-compilation support (bug #43223) - a lot of manpage fixes and cleanups Version 4.6.2 (23/10/2017): * Fixes: - revert changes to cursor position restore behavour (bug #51832) - set freed pointer to NULL (bug #52133) - documentation fixes - fix windowlist crashes (bug #43054 & #51500) Version 4.6.1 (10/07/2017): * Fixes: - problems with starting session in some cases - parallel make install - segfault when querying info on nonUTF locale (bug #51402) Version 4.6.0 (28/06/2017): * Update Unicode wide tables to 9.0 (bug #50044) * Support more serial speeds * Improved namespaces support * Migrate from fifos to sockets * Start viewing scrollback at first line of output (bug #49377) Version 4.5.1 (25/02/2017): * Fixes: - logfile permissions problem (CVE-2017-5618) - SunOS build problem (bug #50089) - FreeBSD core dumps (bug #50143) Version 4.5.0 (10/12/2016): * Allow specifying logfile's name via command line parameter '-L' * Fixes: - broken handling of "bind u digraph U+" (bug #48691) - crash with long $TERM (bug #48983) - crash when bumping blank window - build for AIX (bug #49149) - %x improperly separating arguments - install with custom DESTDIR (bug #48370) Version 4.4.0 (19/06/2016): * Support up to 24 function keys * Fix runtime issues * 'logfile' command, starts logging into new file upon changing Version 4.3.1 (28/06/2015): * Fix resize bug Version 4.3.0 (13/06/2015): * Introduce Xx string escape showing the executed command of a window * Implement dead/zombie window polling, allowing for auto reconnecting * Allow setting hardstatus on first line * New Commands: - 'sort' command sorting windows by title - 'bumpleft', 'bumpright' - manually move windows on window list - 'collapse' removing numbering 'gaps' between windows, by renumbering - 'windows' command now accepts arguments for use with querying Version 4.2.1 (28/04/2014): * allow for terminal with long $TERM (up to 32 characters) * allow to use long logins * documentation fixes * runtime fixes Version 4.2.0 (17/04/2014): New Commands: * 'unbindall' to unbind all commands * 'up', 'down', 'left', 'right' sub-commands for 'focus' * 'rendition' to specify rendition to use in caption/hardstatus for window-names that have bell/monitor/silence/so turned on. * 'layout', with the following sub-commands - 'title' - 'number' - 'autosave' ('autosave on' or 'autosave off') - 'new' - 'save' ('save ') - 'select' - 'next' - 'prev' - 'attach' - 'show' - 'remove' - 'dump' * 'group' for moving window(s) into a group. * 'defmousetrack' and 'mousetrack', to turn on/off mouse-tracking for displays. It's turned off by default. With mouse-tracking turned on, it's possible to switch to a region ('focus') using mouse clicks. It's also possible to select a text region in copy-mode using a mouse click to place a mark and the scroll wheel to scroll through the buffer. Additional features might be to allow clicking on window-titles in the caption to switch to that window. * All commands prefixed '@' are treated as 'quiet', i.e. '@'-prefixed commands do not trigger any display messages. Changed Commands: * '-v' parameter to 'split' command for vertical splits. * 'sorendition' deprecated in favour of 'rendition so'. * 'digraph' can take a second parameter to specify custom digraphs. For example, 'digraph >= ≥' or 'digraph >= U+2265' Using '0' as the second parameter will remove the digraph. * 'stuff' will prompt for input if there's nothing to stuff. * The argument to ":number" can be prefixed with '+' or '-' to use it as a relative argument. * '-g' parameter to 'windowlist' to show nested list of windows. * '//group' parameter to 'screen' to create a grouped window. * 'blankerprg' shows the currently set command on no argument. * 'maxwin' can now be used to increase the number of maximum windows. .screenrc: * $PID expands to the PID of the screen session. * $PWD expands to the current working directory of the session. * $STY expands to the session name. * Tilde-expansion in pathnames (e.g. for the 'source' command) * C-style escapes can be used (e.g. "\n" to get a newline with 'stuff') * '%p' in caption/hardstatus string expands to the PID of the backend, and '%+p' expands to the PID of the frontend (display). * '%S' in caption/hardstatus string expands to the session name. * '%P' in the caption string evaluates to true if the region is in copy mode. * '%E' in the caption string evaluates to true if the escape character has currently been pressed. Window List: * Nested views when there are window groups (with 'windowlist -g'). * Press 'm' to toggle the most-recent view. * Press 'g' to toggle nestedness. * Press 'a' to view all windows in the list. * Press '/' to search in the list. * Press ',' and '.' to re-order windows in the list. * Press 'K' to kill a window (requires confirmation). Display List: * Press 'd' to detach a display, 'D' to power-detach. Others: * Start using 'ChangeLog' for logging changes again. * Terminfo update for 256-color support. * Multiple input history (partially from Romain Francoise). * vi-like fFtT;, searching in copy mode. * In copy mode, search in reverse direction when 'N' is pressed. * Tab-completion for command input. * Some more readline-like bindings in input mode (e.g. ^W, ^D, ^P, ^N etc.) * Fix displaying unicode characters in the caption/hardstatus on UTF8 locale. * A revamped displays list (for 'displays' command) * Increased default maximum number of windows from 40 to 100. * Increased number color/attribute changes in caption/hardstatus string from 16 to 256. * Some commands can be remotely queried using the -Q command-line flag. In-Progress: * Scripting support (thanks to Google Summer of Code 2009 project by Rui Guo) Developers: * Alexander Naumov * Amadeusz SÅ‚awiÅ„ski * Juergen Weigert * Michael Schroeder * Micah Cowan * Sadrul Habib Chowdhury Contributors: * Clavelito * Dick * Gabriel * Benjamin Andresen * Takeshi Banse * Maarten Billemont * Curtis Brown * Cyril Brulebois * Trent W Buck * Stephane Chazelas * Kees Cook * Thomas Dickey * Christian Ebert * Geraint Edwards * Romain Francoise * Alexander Gattin * Emanuele Giaquinta * Yi-Hsuan Hsin * Kipling Inscore * Chris Jones * Max Kalashnikov * Steve Kemp * Ryan Niebur * Jan Christoph Nordholz * William Pursell * Michael Scherer * Enrico Scholz * Peter Teichman 30.10.94 This is a quick overview of screen's life story. But it is not up to date. You'll find more details about the revision history in patchlevel.h and newer changes are only documented there. 31.7.93 -- 3.5.1 ================ * writelock, number, paste with arg, at, zombie and wall commands added. * Access Control Lists and more multi-user support added. * select and setenv commands enhanced. * socket.c: motorola bugfix. * configure.in: --srcdir support. * configure.in: recognize alpha and SUNOS3 correctly. * doc/screen.texinfo: Documentation by Jason Merrill. 13.05.93 -- 3.3.3 ================= * defautonuke, silence commands added. * exec command added. * hardcopydir, logdir commands added. * Made a superb configure script. * BROKEN_PIPE, SOCK_NOT_IN_FS added for braindamaged systems. * multi display, multi user support. * process command. CS, CE switch cursorkeycap in application mode. * lockprg pow_detaches on SIGHUP * ins_reg copy_reg commands. * new screenrc syntax. * split up screen.c and ansi.c 21.10.92 -- 3.2.9 ================ * ChangeLog: replaces CHANGES and is in GNUish format. * Makefile (CFLAGS, M_CFLAGS, LIBS, OPTIONS): moved user config here, merged all Makefiles, GNUified * socket.c (FindSocket): ignoring bad files in $SCREENDIR * config/config.linux: ported. * utmp.c, exec.c, loadav.c: split apart from screen.c/fileio.c 15.07.92 -- 3.2.8 ================= * ansi.c (WriteString): automatic character set switching for 8bit support 3.2.3-3.2.7 =========== * concept changes: Display structure, Multi attacher ... 3.2.2 ===== * screen.c (main): -m option, "_M_ake always new session", ignore $STY * screen.c (main): -Ssessionname * fileio.c (RcLine): ^A:sessionname give your session a nicer name. * screen.c (main): supporting detached startup via screen -d -m -Ssockname * fileio.c (stripdev): moved, could not compile * overlay.h: "stackable overlay concept" * search.c: vi-like / and ? search AND emacs-like ^S and ^R incremental search in scrollback * mark.c: I meant BSDI not BSD * concept change: struct display and struct newwin introduced. * screen.c (main): -v option prints version. * screen.c (MakeWindow): ^A:screen /dev/ttya opens a character device instead of forking ShellProg with a pty pair. 3.2.0 ===== Ultrix port Irix 3.3 SGI port shadow password suite supported data loss on stdin overflow fixed "refresh off" keyword added. 3.1.1 ------ Screen is now under the GNU copyleft license. See file COPYING. command line option -A. $LINES, $COLUMNS improved. C-A : vbellwait XENIX support (Ronald Khoo) SYSV has uname() instead of gethostname(). hpux has setresuid. ClearScreen now saves image to scrollback buffer. mips has setenv. numerous bugfixes. 3.1 finally released version. ============================= 3.0.99: last minute changes: ---------------------------- MIPS support (J{rvinen Markku) SVR4 support (Marc Boucher) secopen() secfopen() calls replace stat/access/open. C-a : echo improved. 'register int' Changes up to Screen 3.0 Patchlevel 7 ===================================== Better terminfo support: Screen now checks if a termcap/info entry which the name "screen.$TERM" does exist. Look in the "VIRTUAL TERMINAL" section of the manual for more details. Many security improvements. ScrollRegion() bug fixed which caused slow scrolling if AL or DL was used. Pyramid and Ultrix support added. (Tim and Larry) ENVIRONMENT support. /local/etc/screenrc checks for $SYSSCREENRC $HOME/.screenrc checks for $ISCREENRC and $SCREENRC /local/screens checks for $ISCREENDIR and $SCREENDIR .screenrc understands ${VAR} and $VAR . screen 3.0 Patchlevel 6 ======================= .screenrc: screen now only opens the windows you explicitly ask for. If you specify none, you still get one window, of course. screen 3.0. Patchlevel 5 ======================== Ansi prototyping by Christos. copy mode: CTRL-U / CTRL-D exchanged. code cleanup. changes to screen 3.0 patchlevel 4 ================================== markkeys "string" allows to rebind the keys used in copy/history mode. string is made up of pairs "=" which are separated by a colon. Oldchar and newchar are either single ascii characters, or the two character sequence ^x, where x is an ascii character, or a 3 digit octal value prepended with '\'. the string "\040=.:^M=q" rebinds '.' to set marks, and the return key will abort copy mode. set scrollback 100 resizes the scrollback history buffer to 100 lines. a default of 50 is installed. A Howard Chu like scrollback history is installed. Many vi-like keys are added to the copy mode. The '?' key reports on cursor position. screen 3.0 Patchlevel 3 ======================= WriteString fixed, it did kill the display variable. Yet another LP bugfix. non vt100 semi-graphics character support. waynes patch fixed screen 3.0 Patchlevel 2 ======================= wayne patches cursor motion outside scrollregions. .screenrc monitor on|off changes in Screen 3.0 Patchlevel 1 ================================== screen -wipe ^A : set vbell_msg "Wuff Wuff" Thousand enhancements: help resizable, copy'n'paste in main socket loop, and no more '\0' hackin'. :WS=\E8;%d;%dt: screen can now resize windows under sunview. ^A : set crlf on|off effects markroutine join. screen learned about sized windows under X screen -ls (-d) -q quiet option. We count the number of detached (attached) sessions and set a return value of 10+n. The -q option inhibits all startup warnings/messages. i.e. screen -R -q may return with code 12 or higher or start a new/old session. pow_detach_msg "text string" new command, allows messages, terminal reset, etc. on logout caused by pow_detach. ^A : learned a new keyword "set": commands like "login on" , "vbell off", ... affect the default for windows to be created. But commands like "set login off" affect the actual setting of this window. and not the default. such commands may be bound to keys. example: bind 'O' set login off is valid in your .screenrc as well as typed at the ':' prompt. a bonus is ":set all" which is synonym to ":help". At the Colon prompt also KeyNames can be entered, although that makes not always sense. ^A x uses a builtin lockprg, if a) we don't find our lockprg, or b) user supplies us with the environment variable LOCKPRG set to "builtin" the builtin locks until your login password is typed. on systems using "shadow password files" you are prompted for a password. markroutine can append joined. screen removes the "controlling tty" from utmp while ptys are attached. markroutine performs CR+NL when '\n' is pressed screen may die quietly, when no TERMCAP entry for "screen" is found, and screen is run under X-windows _SEQUENT_ marks sequent386_ptx screen runs now under SunOS4.1.1 (we need setsid()!). bug in SetForeWindow fixed. rare markroutine bug fixed. we don't open every file the attacher tells us. we have now our wonderful "Wuff, Wuff" visual_bell we have now the interprocess-communication-buffer. secure version. '^A =' removes the interprocess-communication-buffer. markroutine as in 2.1 markroutine: 'a' toggles append mode, '>' like ' ', but immediately WriteFile(DUMP_EXCHANGE) then. 'A' like ' ', but first switch to append mode. .screenrc understands "screen 2:faui09 rlogin faui09 -l jnweiger" and "password none" and "vbell [on|off]" '^A :' allows .screenrc commands "online". screen now receives new $TERM from attacher, when it is reattached MakeClientSocket() fifo version does now test for access. .screenrc learns "hardstatus {on|off}" termcap's VB is used for vbell if available. Attach() code rewritten: screen now lists socket directory, if it does not find a suitable socket screen -d [host.tty] detaches a running screen. screen -[ls|list] list all sockets that we find in our sockdir when the socket has been removed, send a SIGCHLD to the poor SCREEN process and it will try to recover. then try a 'screen -r' again. all the socket stuff lives now in an extra file. Major changes in version 2.4: ============================= * Test version that presents the erlangen extensions from 2.0 in a 2.3 screen. * window resize support * screen locking C-a x * support for SYSV * password protection * copy & paste across screens * remote detach and power detach Major changes in version 2.3: * Terminal emulation has been significantly enhanced and bugfixed. * We now fully update the last character on the screen for true auto- margin terminals, though there may be some delay before the character can be safely added to the screen. If your terminal has character insert it will be used to shorten the delay. * Added the "termcap" .screenrc command to tweak your terminal's termcap entry AND to customize the termcap generated for the virtual terminals. See also the -L and -O command-line options, and the SCREENCAP environ- ment variable. * Fixed screen's character handling when detached or suspended to NOT block the child processes in their windows -- output continues to be processed in the background. * Added a.k.a.s (window-name aliases) that allow you to customize the window-information line, including being able to change the name on- the-fly to reflect what's currently running in the window (see the -k option, shellaka command, and ALSO KNOWN AS discussion in the doc). * Added the ability to log the output of a window to a file (see the "C-a H" (log) command). * Flow-control can now be set for each window and switched interactively (see the "flow" command, -f option, and FLOW CONTROL discussion). * Individual windows can be included or excluded from mention in the /etc/utmp file (see the "login" command and -l option). * Added an activity monitor, which allows you to have a window watched for the start of any output and alert you when it occurs (see the "C-a M" (monitor) command). * Enhanced the information in the window-information line to keep track of windows that have: logging turned on '(L)'; beeped in the background '!'; became active while being monitored '@' (see the "C-a w" (windows) command). * Added an on-line help display that lists all the commands and their key bindings (see the "C-a ?" (help) command). * Extended handling of the beep message (and also the new activity message) to allow '~' to specify a literal beep (see the "beep" and "activity" .screenrc commands). * You can now set the default action on receipt of a hangup signal: detach or terminate (see the "autodetach" .screenrc command). * Routing of characters to their virtual terminals has been enhanced to not drop characters nor (in rare circumstances) hang up screen. * The NFS compatibility has been enhanced. Major changes in version 2.0a: * Screen allows you to `detach' the "screen" session from the physical terminal and resume it at a later point in time (possibly on a different terminal or in a different login session). To get an impression of this functionality do the following: - call "screen" and create a couple of windows - type Control-A Control-D (screen terminates; you are back in the shell) - call "screen -r" to resume the detached screen * Screen supports multiple character sets and the ISO 2022 control functions to designate and switch between character sets. This allows you, for instance, to make use of the VT100 graphics character set or national character sets. screen-5.0.1/logfile.c0000664000175000017500000001421615011404317013227 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 reffered 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.1/help.h0000664000175000017500000000056715011404317012547 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.1/viewport.h0000664000175000017500000000366615011404317013501 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.1/resize.h0000664000175000017500000000101215011404317013102 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.1/configure0000775000175000017500000053302315011405517013356 0ustar alexalex#! /bin/sh # Guess values for system-dependent variables and create Makefiles. # Generated by GNU Autoconf 2.71 for GNU Screen 5.0.1. # # Report bugs to . # # # Copyright (C) 1992-1996, 1998-2017, 2020-2021 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 as_nop=: 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 $as_nop case `(set -o) 2>/dev/null` in #( *posix*) : set -o posix ;; #( *) : ;; 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="as_nop=: 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 \$as_nop case \`(set -o) 2>/dev/null\` in #( *posix*) : set -o posix ;; #( *) : ;; 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 \$as_nop exitcode=1; echo positional parameters were not saved. 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 $as_nop as_have_required=no fi if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null then : else $as_nop 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 $as_nop 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 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 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_nop # --------- # Do nothing but, unlike ":", preserve the value of $?. as_fn_nop () { return $? } as_nop=as_fn_nop # 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 $as_nop as_fn_append () { eval $1=\$$1\$2 } 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 $as_nop as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } fi # as_fn_arith # as_fn_nop # --------- # Do nothing but, unlike ":", preserve the value of $?. as_fn_nop () { return $? } as_nop=as_fn_nop # 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 ' 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_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" 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.1' PACKAGE_STRING='GNU Screen 5.0.1' 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.1 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.1:";; 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.1 generated by GNU Autoconf 2.71 Copyright (C) 2021 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 $as_nop printf "%s\n" "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 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 $as_nop 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 $as_nop eval "$3=no" fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext 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 $as_nop printf "%s\n" "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 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 $as_nop 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 (); 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 (); /* 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 $as_nop eval "$3=no" fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext 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.1, which was generated by GNU Autoconf 2.71. 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 (p, i) 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; } /* 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 #include extern int puts (const char *); extern int printf (const char *, ...); extern int dprintf (int, const char *, ...); extern void *malloc (size_t); // 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) { // See if C++-style comments work. // 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; // 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 $as_nop as_fn_error $? "cannot find required auxiliary files:$ac_missing_aux_files" "$LINENO" 5 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 $as_nop 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 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 $as_nop 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 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 $as_nop 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 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 $as_nop 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 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 $as_nop 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 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 $as_nop 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 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 $as_nop 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 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 $as_nop 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 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 $as_nop ac_file='' 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 $as_nop { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 printf "%s\n" "yes" >&6; } 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 $as_nop { { 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; } 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"); 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.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 $as_nop 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 $as_nop 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; } fi rm -f conftest.$ac_cv_objext conftest.$ac_ext 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 $as_nop 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 $as_nop ac_compiler_gnu=no fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ac_cv_c_compiler_gnu=$ac_compiler_gnu 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 $as_nop 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 $as_nop 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 $as_nop 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 fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ac_c_werror_flag=$ac_save_c_werror_flag 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 $as_nop 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 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 $as_nop 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 $as_nop { 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" fi ac_cv_prog_cc_stdc=$ac_cv_prog_cc_c11 ac_prog_cc_stdc=c11 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 $as_nop 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 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 $as_nop 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 $as_nop { 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" fi ac_cv_prog_cc_stdc=$ac_cv_prog_cc_c99 ac_prog_cc_stdc=c99 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 $as_nop 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 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 $as_nop 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 $as_nop { 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" fi ac_cv_prog_cc_stdc=$ac_cv_prog_cc_c89 ac_prog_cc_stdc=c89 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 $as_nop 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 $as_nop ac_cv_safe_to_define___extensions__=no fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext 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 $as_nop 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 $as_nop 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 fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext fi 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_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 $as_nop MINIX= 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 $as_nop 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 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 $as_nop 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 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 $as_nop 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 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 $as_nop 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 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 $as_nop 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 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 $as_nop 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 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 $as_nop 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 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 $as_nop 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 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 $as_nop 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 $as_nop ac_compiler_gnu=no fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ac_cv_c_compiler_gnu=$ac_compiler_gnu 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 $as_nop 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 $as_nop 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 $as_nop 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 fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ac_c_werror_flag=$ac_save_c_werror_flag 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 $as_nop 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 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 $as_nop 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 $as_nop { 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" fi ac_cv_prog_cc_stdc=$ac_cv_prog_cc_c11 ac_prog_cc_stdc=c11 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 $as_nop 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 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 $as_nop 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 $as_nop { 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" fi ac_cv_prog_cc_stdc=$ac_cv_prog_cc_c99 ac_prog_cc_stdc=c99 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 $as_nop 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 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 $as_nop 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 $as_nop { 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" fi ac_cv_prog_cc_stdc=$ac_cv_prog_cc_c89 ac_prog_cc_stdc=c89 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 $as_nop 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 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 $as_nop 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 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 $as_nop 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. */ char tgetent (); 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 $as_nop ac_cv_search_tgetent=no fi rm conftest.$ac_ext LIBS=$ac_func_search_save_LIBS 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 $as_nop as_fn_error $? "unable to find tgetent() function" "$LINENO" 5 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 $as_nop 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. */ char crypt (); 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 $as_nop ac_cv_search_crypt=no fi rm conftest.$ac_ext LIBS=$ac_func_search_save_LIBS 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 $as_nop as_fn_error $? "unable to find crypt() function" "$LINENO" 5 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 $as_nop 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. */ char openpty (); 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 $as_nop ac_cv_search_openpty=no fi rm conftest.$ac_ext LIBS=$ac_func_search_save_LIBS 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 $as_nop as_fn_error $? "unable to find openpty() function" "$LINENO" 5 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 $as_nop 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. */ char socket (); 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 $as_nop ac_cv_search_socket=no fi rm conftest.$ac_ext LIBS=$ac_func_search_save_LIBS 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 $as_nop as_fn_error $? "unable to find socket() function" "$LINENO" 5 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 $as_nop enable_pam=yes fi # Check whether --enable-utmp was given. if test ${enable_utmp+y} then : enableval=$enable_utmp; enable_utmp=$enableval else $as_nop enable_utmp=no fi # Check whether --enable-telnet was given. if test ${enable_telnet+y} then : enableval=$enable_telnet; enable_telnet=$enableval else $as_nop enable_telnet=no fi # Check whether --enable-socket-dir was given. if test ${enable_socket_dir+y} then : enableval=$enable_socket_dir; enable_socket_dir=$enableval else $as_nop enable_socket_dir=no fi # Check whether --with-system_screenrc was given. if test ${with_system_screenrc+y} then : withval=$with_system_screenrc; with_system_screenrc=$withval else $as_nop with_system_screenrc=/etc/screenrc fi # Check whether --with-pty-mode was given. if test ${with_pty_mode+y} then : withval=$with_pty_mode; with_pty_mode=$withval else $as_nop with_pty_mode=0620 fi # Check whether --with-pty-group was given. if test ${with_pty_group+y} then : withval=$with_pty_group; with_pty_group=$withval else $as_nop with_pty_group=5 fi # Check whether --with-pty-rofs was given. if test ${with_pty_rofs+y} then : withval=$with_pty_rofs; with_pty_rofs=$withval else $as_nop with_pty_rofs=no 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 $as_nop as_fn_error $? "no" "$LINENO" 5;LIBS="$oldlibs" 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 $as_nop have_utmpx=no 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 $as_nop have_utempter=no 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 $as_nop { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } 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 $as_nop { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } 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 as_nop=: 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 $as_nop case `(set -o) 2>/dev/null` in #( *posix*) : set -o posix ;; #( *) : ;; 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 $as_nop as_fn_append () { eval $1=\$$1\$2 } 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 $as_nop as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } 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_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" 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.1, which was generated by GNU Autoconf 2.71. 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.1 configured by $0, generated by GNU Autoconf 2.71, with options \\"\$ac_cs_config\\" Copyright (C) 2021 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.1/encoding.c0000664000175000017500000010542315011404317013375 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.1/telnet.h0000664000175000017500000000064715011404317013111 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 *, size_t *, 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.1/canvas.h0000664000175000017500000000677515011404317013101 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_CANVAS_H #define SCREEN_CANVAS_H #include "layer.h" #include "sched.h" #define SLICE_UNKN 0 #define SLICE_VERT (1 << 0) #define SLICE_HORI (1 << 1) #define SLICE_THIS (1 << 2) /* used in equal test */ #define SLICE_GLOBAL (1 << 3) typedef struct Display Display; typedef struct Viewport Viewport; typedef struct Window Window; typedef struct Canvas Canvas; struct Canvas { Canvas *c_next; /* next canvas on display */ Display *c_display; /* back pointer to display */ Canvas *c_slnext; /* next canvas in display slice */ Canvas *c_slprev; /* prev canvas in display slice */ Canvas *c_slperp; /* perpendicular slice */ Canvas *c_slback; /* perpendicular slice back pointer */ int c_slorient; /* our slice orientation */ int c_slweight; /* size ratio */ Viewport *c_vplist; Layer *c_layer; /* layer on this canvas */ Canvas *c_lnext; /* next canvas that displays layer */ Layer c_blank; /* bottom layer, always blank */ int c_xoff; /* canvas x offset on display */ int c_yoff; /* canvas y offset on display */ int c_xs; int c_xe; int c_ys; int c_ye; Event c_captev; /* caption changed event */ }; void SetCanvasWindow (Canvas *, Window *); void SetForeCanvas (Display *, Canvas *); Canvas *FindCanvas (int, int); int MakeDefaultCanvas (void); int AddCanvas (int); void RemCanvas (void); void OneCanvas (void); void FreeCanvas (Canvas *); int CountCanvas (Canvas *); void ResizeCanvas (Canvas *); void RecreateCanvasChain (void); void RethinkViewportOffsets (Canvas *); int CountCanvasPerp (Canvas *); void EqualizeCanvas (Canvas *, bool); void DupLayoutCv (Canvas *, Canvas *, bool); void PutWindowCv (Canvas *); #define CV_CALL(cv, cmd) \ { \ Display *olddisplay = display; \ Layer *oldflayer = flayer; \ Layer *l = cv->c_layer; \ Canvas *cvlist = l->l_cvlist; \ Canvas *cvlnext = cv->c_lnext; \ flayer = l; \ l->l_cvlist = cv; \ cv->c_lnext = NULL; \ cmd; \ flayer = oldflayer; \ l->l_cvlist = cvlist; \ cv->c_lnext = cvlnext; \ display = olddisplay; \ } #endif /* SCREEN_CANVAS_H */ screen-5.0.1/doc/0000775000175000017500000000000015011405274012206 5ustar alexalexscreen-5.0.1/doc/FAQ0000664000175000017500000003340715011404317012544 0ustar alexalex jw 21.10.93 05.05.94 screen: frequently asked questions -- known problems -- unimplemented bugs =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- Q: Why is it impossible to download a file with Kermit/sz/rz when screen is running? Do I need to set some special variables? A: Screen always interprets control-sequences sent by the applications and translates/optimizes them for the current terminal type. Screen always parses the user input for its escape character (CTRL-A). Both are basic screen features and cannot be switched off. Even if it were possible to switch screen into a completely transparent mode, you could never switch between windows, while kermit/sz/rz is downloading a file. You must wait till the end as kermit/sz/rz will not transmit your input during a file transfer and as kermit/sz/rz would be very confused if screen switched away the window containing the other kermit/sz/rz. Simply detach your screen session for each file transfer and start the transfer program only from the shell where you started screen. Q: I am using screen with a YYY terminal, which supports the XXX graphic language. I am very happy with it, except one thing: I cannot render graphics into screen windows. A: You are out of luck there. Screen provides a fixed set of escape sequences in order to make it possible to switch terminal types. Screen has to know exactly what the escape sequences do to the terminal because it must hold an image in memory. Otherwise screen could not restore the image if you switch to another window. Because of this you have to change screens escape sequence parser (ansi.c) to pass the XXX graphics sequences to the terminal. Of course the graphics will be lost if you switch to another window. Screen will only honour graphics sequences that are demanded by an overwhelming majority. Q: For some unknown reason, the fifo in /tmp/screens/S-myname is gone, and i can't resume my screen session. Is there a way to recreate the fifo? A: Screen checks the fifo/socket whenever it receives a SIGCHLD signal. If missing, the fifo/socket is recreated then. If screen is running non set-uid the user can issue a 'kill -CHLD screenpid' directly (it is -CHILD on some systems). Screenpid is the process-id of the screen process found in a 'ps -x' listing. But usually this won't work, as screen should be installed set- uid root. In this case you will not be able to send it a signal, but the kernel will. It does so, whenever a child of screen changes its state. Find the process-id (shellpid below) of the "least important" shell running inside screen. The try 'kill -STOP shellpid'. If the fifo/socket does not reappear, destroy the shell process. You sacrify one shell to save the rest. If nothing works, please do not forget to remove all processes running in the lost screen session. Q: When you start "screen" a page of text comes up to start you off. Is there a way to get rid of this text as a command line argument or by using a switch of some sort. A: Just put the following line in your ~/.screenrc: startup_message off Many people ask this, although it is in the man page, too :-) Q: Start "screen emacs" and run emacs function suspend-emacs (ctrl-z). The window containing emacs vanishes. A: This is a known bug. Unfortunatly there is no easy fix because this is specified in the POSIX standard. When a new window is created Screen opens up a new session because the window has to get the pty as a controlling terminal (a session can only have one controlling terminal). With the setsid() call the process also creates a new process group. This process group is orphaned, because there is no process in the session which is not in the process group. Now if the process group leader (i.e. your program) gets a TTIN/TTOU/TSTP, POSIX states that the kernel must send a KILL signal to the process group because there is no one left to continue the process. Even if screen would try to restart the program, that would be after it received the KILL signal which cannot be caught or ignored. tromey@klab.caltech.edu (Tom Tromey): I've noticed this exact same problem. I put this in my .emacs file. It seems to work: ;; If running under screen, disable C-z. (if (and (getenv "STY") (not window-system)) (global-unset-key "\C-z")) Q: Screen gets the terminal size wrong and messes up. A: Before you start screen: Check with 'stty -a' what the terminal driver thinks about rows and columns. Check the environment variables LINES and COLUMNS. Then from within screen check with the info command (CTRL-A i) what size screen thinks your terminal is. If correcting tty driver setting and environment variables does not help, look up the terminal capability definition. First the TERMCAP environment variable. If this is not set, look up the terminals name as defined in the environment variable TERM in /etc/termcap or in the terminfo database with untic or infocmp. There may be :li=...: and :co=...: or even :ll=...: entries (cols#... and lines#... when it's terminfo) defined incorrectly. Either construct your own TERMCAP environment variables with correct settings, use screens terminfo/termcap command in your .screenrc file or have the database corrected by the system administrator. Q: Screen messes up the terminal output when I use my favourite ap- plication. Setting the terminal size does not help. A: Probably you got the termcap/terminfo entries wrong. Fixing this is a three stage procedure. First, find out if terminfo or termcap is used. If your system only has /etc/termcap, but not /usr/lib/terminfo/... then you are using termcap. Easy. But if your system has both, then it depends how the appli- cation and how screen were linked. Beware, if your applica- tion runs on another host via rlogin, telnet or the like, you should check the terminfo/termcap databases there. If you cannot tell if terminfo or termcap is used (or you just want to be save), the do all steps in stage 3 in parallel for both systems (on all involved hosts). Second: Understand the basic rules how screen does its terminal emulation. When screen is started or reattached, it relies on the TERM environment variable to correctly reflect the terminal type you have physically in front of you. And the entry should either exist in the system terminfo/termcap database or be specified via the TERMCAP en- vironment variable (if screen is using the termcap system). On the other end, screen understands one set of control codes. It relies on the application using these codes. This means applica- tions that run under screen must be able to adapt their con- trol codes to screen. The application should use the TERM vari- able and termcap or terminfo library to find out how to drive its terminal. When running under screen, the terminal is virtual and is only defined by the set of control codes that screen understands. The TERM variable is automatically set to "screen" and the "screen"-entries should exist in the data- bases. If your application uses hardcoded control codes rather than a database, you are on your own. Hint: The codes under- stood by screen are a superset of the very common definition named "vt100". Look at the documentation of screen. The codes are listed there. Third: Have the entry "screen" in- stalled on all hosts or make sure you can live with "vt100". Check the codes sent by your application, when the TERM variable is set to "screen". Do not try to set the TERM variable inside screen to anything other than "screen" or "vt100" or compati- ble. Thus your application can drive screen correctly. Also take care that a good entry is installed for your physical terminal that screen has to drive. Even if the entry was good enough for your application to drive the terminal directly, screen may find flaws, as it tries to use other capabilities while op- timizing the screen output. The screenrc commands "termcap" and/or "terminfo" may help to fine-tune capabilities without calling the supervisor to change the database. Q: I cannot configure screen. Sed does not work. A: The regular expressions used in our configure script are too complicated for GNU sed version 2.03. In this regard it is bug compatible with Ultrix 3.1 "sed": GNU sed version 2.03 dumps core with our configure script. Try an older release. E.g. from ftp.uni-erlangen.de:/pub/utilities/screen/sed-2.02b.tar.gz Q: When reattaching a session from a different Workstation, the DISPLAY environment variable should be updated. Even ``CTLR-A : setenv DISPLAY newhost:0'' does not work as expected. A: Under unix every process has its own environment. The environ- ment of the SCREEN process can be changed with the `setenv' com- mand. This however cannot affect the environment of the shells or applications already running under screen. Subsequently spawned processes will reflect the changes. One should be aware of this problem when running applications from very old shells. Screen is a means for keeping processes alive. Q: About once every 5 times I ran the program, rather than getting a "screen," I got someone elses IRC output/input. A: What probably happened is that an IRC process was left running on a pseudo tty in such a way that the kernel thought the tty was available for reallocation. You can fix this behaviour by applying the SunOS 4.1.x tty jumbo patch (100513-04). Q: Screen compiled on SunOS 5.3 cannot reattach a detached session. A: You are using /usr/ucb/cc, this compiler is wrong. Actually it links with a C-library that mis-interprets dirent. Try again with /opt/SUNWspro/bin/cc! Q: The "talk" command does not work when Screen is active. A: Talk and several other programs rely on entries in the Utmp- Database (/etc/utmp). On some systems this Database is world writable, on others it is not. If it is not, screen must be installed with the appropriate permissions (user or group s-bit) just like any program that uses PTYs (rlogin, xterm, ...). When screen cannot write to utmp, you will see messages on you display which do not belong to any screen window. When screen can update utmp, it is not guaranteed that it does as you expect. First this depends on the config.h file defining ENABLE_UTMP, LOGINDEFAULT, and perhaps CAREFULUTMP. Second it depends on the screenrc files (system wide and per user), if utmp entries are done. Third, you can control whether windows are logged in with screens ``login'' command. Q: Seteuid() does not work as expected in AIX. Attempting a multi- user-attach results in a screen-panic: "seteuid: not owner". A: This is not a screen problem. According to Kay Nettle (pkn@cs.utexas.edu) you need the AIX patch PTF 423674. Q: When I type cd directory (any directory or just blank) from within one of the windows in screen, the whole thing just freezes up. A: You display the current working directory in xterm's title bar, This may be caused by hardcoded ESC-sequences in the shell prompt or in an cd alias. In Xterm the coding is ESC ] n ; string_to_display ^G where n = 1, 2, 3 selects the location of the displayed string. Screen misinterprets this as the ansi operating system comment sequence: ESC ] osc_string and waits (according to ansi) for the string terminator ESC \ Screen versions after 3.5.12 may provide a workaround. Q: Mesg or biff cannot be turned on or off while running screen. A: Screen failed to change the owner of the pty it uses. You need to install screen setuid-root. See the file INSTALL for details. Q: The cursor left key deletes the characters instead of just moving the cursor. A redisplay (^Al) brings everything back. A: Your terminal emulator treats the backspace as "destructive". You can probably change this somewhere in the setup. We can't think of a reason why anybody would want a destructive backspace, but if you really must have it, add the lines termcap 'bc@:bs@' terminfo 'bc@:bs@' to your ~/.screenrc (replace with the terminal type your emulator uses). Q: I have an old SysV OS (like Motorola SysV68) and sometimes screen doesn't reset the attributes correctly. A redisplay (^Al) doesn't make things better. A: The libcurses library has a bug if attributes are cleared with the special ue/se capabilities. As a workaround (other than upgrading your system) modify 'rmul' (and 'rmso'?) in screen's terminfo entry: rmul=\E[m, rmso=\E[m screen-5.0.1/doc/window_to_display.ps0000664000175000017500000011253715011404317016316 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.1/doc/screen.texinfo0000664000175000017500000070426015011405274015074 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.1 @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-2025 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 Screen @subtitle The virtual terminal manager @subtitle for Version @value{version} @subtitle May 2025 @page @vskip 0pt plus 1filll Copyright @copyright{} 1993-2025 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 @shortcontents @contents @node Top, Overview, (dir), (dir) @ifinfo @top Screen This file documents the @code{Screen} virtual terminal manager, version @value{version}. @end ifinfo @menu * Overview:: Preliminary information. * 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. * Installation:: Getting @code{screen} running on your system. * Concept Index:: Index of concepts. * Command Index:: Index of all @code{screen} commands. * Keystroke Index:: Index of default key bindings. @end menu @node Overview, Getting Started, Top, Top @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}. @node Getting Started, Invoking Screen, Overview, Top @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. @node Invoking Screen, Customization, Getting Started, Top @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 using the specified @emph{term} as opposed to the default setting of @code{screen}. @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 @node Customization, Commands, Invoking Screen, Top @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, Source, , Customization @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, Colon, Startup Files, Customization @section Source @deffn Command source file (none)@* 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, , Source, Customization @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 @node Commands, New Window, Customization, Top @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, Command Summary, , Commands @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, , Default Key Bindings, Commands @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 Display 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} Display a message on startup. @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}] Display 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 Display 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} Controll 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 Display @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 @node New Window, Selecting, Commands, Top @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, Screen Command, , New Window @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, Setenv, Chdir, New Window @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, Shell, Screen Command, New Window @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, Term, Setenv, New Window @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, Window Types , Shell, New Window @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, Window Groups, Term, New Window @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, , Window Types, New Window @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. Afterwhich, switching between groups can be as easy as switching layouts. @node Selecting, Session Management, New Window, Top @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, Other Window, , Selecting @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, Select, Next and Previous, Selecting @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, Windowlist, Other Window, Selecting @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, , Select, Selecting @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 @node Session Management, Regions, Selecting, Top @chapter Session Management Commands 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, Power Detach, , Session Management @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, Lock, Detach, Session Management @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, Multiuser Session, Power Detach, Session Management @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, Session Name, Lock, Session Management @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, Acladd, , Multiuser Session @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, Aclchg, Multiuser, Multiuser Session @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, Acldel, Acladd, Multiuser Session @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, Aclgrp, Aclchg, Multiuser Session @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, Displays, Acldel, Multiuser Session @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, Umask, Aclgrp, Multiuser Session @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, Wall, Displays, Multiuser Session @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, Writelock, Umask, Multiuser Session @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, Su , Wall, Multiuser Session @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, , Writelock, Multiuser Session @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, Suspend, Multiuser Session, Session Management @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, Quit, Session Name, Session Management @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, , Suspend, Session Management @section Quit @kindex \ @deffn Command quit (@kbd{C-a \})@* Kill all windows and terminate @code{screen}. (@pxref{Key Binding}). @end deffn @node Regions, Window Settings, Session Management, Top @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, Focus, , Regions @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, Only, Split, Regions @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. @xref{Split} for more information about layers. 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, Remove, Focus, Regions @section Only @kindex Q @deffn Command only (@kbd{C-a Q})@* Kill all regions but the current one. @end deffn @node Remove, Resize, Only, Regions @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, Caption, Remove, Regions @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, Fit, Resize, Regions @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, Focusminsize, Caption, Regions @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, Layout, Fit, Regions @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, , Focusminsize, Regions @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 siutation. 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 @node Window Settings, Virtual Terminal, Regions, Top @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 @end menu @node Naming Windows, Console, , Window Settings @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, Dynamic Titles, , Naming Windows @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, Title Prompts, Title Command, Naming Windows @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, Title Screenrc, Dynamic Titles, Naming Windows @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, , Title Prompts, Naming Windows @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, Kill, Naming Windows, Window Settings @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, Login, Console, Window Settings @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, Mode, Kill, Window Settings @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, Monitor, Login, Window Settings @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, Windows, Mode, Window Settings @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, Hardstatus, Monitor, Window Settings @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, Mousetrack, Windows, Window Settings @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, , Hardstatus, Window Settings @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 @node Virtual Terminal, Copy and Paste, Window Settings, Top @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, Input Translation, , Virtual Terminal @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, Digraph, Control Sequences, Virtual Terminal @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, Bell, Input Translation, Virtual Terminal @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, Clear, Digraph, Virtual Terminal @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, Info, Bell, Virtual Terminal @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, Redisplay, Clear, Virtual Terminal @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, Wrap, Info, Virtual Terminal @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, Reset, Redisplay, Virtual Terminal @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, Window Size, Wrap, Virtual Terminal @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, Character Processing, Reset, Virtual Terminal @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, ,Window Size, Virtual Terminal @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 ambiguoous 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 @node Copy and Paste, Subprocess Execution, Virtual Terminal, Top @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, Paste, , Copy and Paste @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, Scrollback, , Copy @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, Copy Mode Keys, Line Termination, Copy @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, Movement, Scrollback, Copy @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, Marking, Copy Mode Keys, Copy @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 occurence 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, Repeat count, Movement, Copy @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, Searching, Marking, Copy @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, Specials, Repeat count, Copy @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, , Searching, Copy @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, Registers, Copy, Copy and 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, Screen Exchange, Paste, Copy and Paste @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, History, Registers, Copy and Paste @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, , Screen Exchange, Copy and Paste @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 @node Subprocess Execution, Key Binding, Copy and Paste, Top @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, Using Exec, , Subprocess Execution @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, , Exec, Subprocess Execution @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 @node Key Binding, Flow Control, Subprocess Execution, Top @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, Bind Examples, , Key Binding @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, Command Character, Bind, Key Binding @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. @node Command Character, Help, Bind Examples, Key Binding @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, Bindkey, Command Character, Key Binding @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, Bindkey Examples, Help, Key Binding @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, Bindkey Control,Bindkey, Key Binding @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, , Bindkey Examples, Key Binding @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 @node Flow Control, Termcap, Key Binding, Top @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, Flow, , Flow Control @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, XON/XOFF, Flow Control Summary, Flow Control @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, , Flow, Flow Control @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 @node Termcap, Message Line, Flow Control, Top @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, Dump Termcap, , 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, Termcap Syntax, Window Termcap, 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, Termcap Examples, Dump Termcap, Termcap @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, Special Capabilities, Termcap Syntax, Termcap @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, Autonuke, Termcap Examples, Termcap @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, Obuflimit, Special Capabilities, Termcap @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, Character Translation, Autonuke, Termcap @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, , Obuflimit, Termcap @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{