hscurses-1.4.1.2/0000755000000000000000000000000012024055722011701 5ustar0000000000000000hscurses-1.4.1.2/ChangeLog0000644000000000000000000000047012024055722013454 0ustar00000000000000001.4.1.0 (2011-09-11) - support for GHC 7.2 (thanks to thoughtpolice) - support for windows (thanks to José Romildo Malaquias) 1.4.0.0 (2011-02-02) - support for GHC 7 - dropped support for GHC 6.10 - re-added support for unicode - use new exception API - proper version constraints in .cabal file hscurses-1.4.1.2/configure0000644000000000000000000042654612024055722013626 0ustar0000000000000000#! /bin/sh # Guess values for system-dependent variables and create Makefiles. # Generated by GNU Autoconf 2.68. # # # Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001, # 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 Free Software # Foundation, Inc. # # # This configure script is free software; the Free Software Foundation # gives unlimited permission to copy, distribute and modify it. ## -------------------- ## ## M4sh Initialization. ## ## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi as_nl=' ' export as_nl # Printing a long string crashes Solaris 7 /usr/bin/printf. as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo # Prefer a ksh shell builtin over an external printf program on Solaris, # but without wasting forks for bash or zsh. if test -z "$BASH_VERSION$ZSH_VERSION" \ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='print -r --' as_echo_n='print -rn --' elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='printf %s\n' as_echo_n='printf %s' else if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' as_echo_n='/usr/ucb/echo -n' else as_echo_body='eval expr "X$1" : "X\\(.*\\)"' as_echo_n_body='eval arg=$1; case $arg in #( *"$as_nl"*) expr "X$arg" : "X\\(.*\\)$as_nl"; arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; esac; expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" ' export as_echo_n_body as_echo_n='sh -c $as_echo_n_body as_echo' fi export as_echo_body as_echo='sh -c $as_echo_body as_echo' fi # The user is always right. if test "${PATH_SEPARATOR+set}" != set; 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 # IFS # We need space, tab and new line, in precisely that order. Quoting is # there to prevent editors from complaining about space-tab. # (If _AS_PATH_WALK were called with IFS unset, it would disable word # splitting by setting IFS to empty value.) IFS=" "" $as_nl" # 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 test -z "$as_dir" && as_dir=. 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 $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # Unset variables that we do not need and which cause bugs (e.g. in # pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" # suppresses any "Segmentation fault" message there. '((' could # trigger a bug in pdksh 5.2.14. for as_var in BASH_ENV ENV MAIL MAILPATH do eval test x\${$as_var+set} = xset \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # CDPATH. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH if test "x$CONFIG_SHELL" = x; then as_bourne_compatible="if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which # is contrary to our usage. Disable this feature. alias -g '\${1+\"\$@\"}'='\"\$@\"' setopt NO_GLOB_SUBST else case \`(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 exitcode=1; echo positional parameters were not saved. fi test x\$exitcode = x0 || 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 test \$(( 1 + 1 )) = 2 || exit 1" if (eval "$as_required") 2>/dev/null; then : as_have_required=yes else as_have_required=no fi if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null; then : else 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 test -z "$as_dir" && as_dir=. 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_echo "$as_bourne_compatible""$as_required" | as_run=a "$as_shell"; } 2>/dev/null; then : CONFIG_SHELL=$as_shell as_have_required=yes if { $as_echo "$as_bourne_compatible""$as_suggested" | as_run=a "$as_shell"; } 2>/dev/null; then : break 2 fi fi done;; esac as_found=false done $as_found || { if { test -f "$SHELL" || test -f "$SHELL.exe"; } && { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$SHELL"; } 2>/dev/null; then : CONFIG_SHELL=$SHELL as_have_required=yes fi; } IFS=$as_save_IFS if test "x$CONFIG_SHELL" != x; then : # 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 export CONFIG_SHELL 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+"$@"} fi if test x$as_have_required = xno; then : $as_echo "$0: This script requires a shell more modern than all" $as_echo "$0: the shells that I found on your system." if test x${ZSH_VERSION+set} = xset ; then $as_echo "$0: In particular, zsh $ZSH_VERSION has bugs and should" $as_echo "$0: be upgraded to zsh 4.3.4 or later." else $as_echo "$0: Please tell bug-autoconf@gnu.org about your system, $0: 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_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=`$as_echo "$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 || $as_echo 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_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_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_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } fi # as_fn_arith # as_fn_error STATUS ERROR [LINENO LOG_FD] # ---------------------------------------- # Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are # provided, also output the error to LOG_FD, referencing LINENO. Then exit the # script with STATUS, using 1 if that was 0. as_fn_error () { as_status=$1; test $as_status -eq 0 && as_status=1 if test "$4"; then as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi $as_echo "$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 || $as_echo 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" || { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; } # 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 } 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 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 -p'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -p' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -p' fi else as_ln_s='cp -p' 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 if test -x / >/dev/null 2>&1; then as_test_x='test -x' else if ls -dL / >/dev/null 2>&1; then as_ls_L_option=L else as_ls_L_option= fi as_test_x=' eval sh -c '\'' if test -d "$1"; then test -d "$1/."; else case $1 in #( -*)set "./$1";; esac; case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in #(( ???[sx]*):;;*)false;;esac;fi '\'' sh ' fi as_executable_p=$as_test_x # 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= PACKAGE_TARNAME= PACKAGE_VERSION= PACKAGE_STRING= PACKAGE_BUGREPORT= PACKAGE_URL= ac_unique_file="UI/HSCurses/Curses.hsc" # Factoring default headers for most tests. ac_includes_default="\ #include #ifdef HAVE_SYS_TYPES_H # include #endif #ifdef HAVE_SYS_STAT_H # include #endif #ifdef STDC_HEADERS # include # include #else # ifdef HAVE_STDLIB_H # include # endif #endif #ifdef HAVE_STRING_H # if !defined STDC_HEADERS && defined HAVE_MEMORY_H # include # endif # include #endif #ifdef HAVE_STRINGS_H # include #endif #ifdef HAVE_INTTYPES_H # include #endif #ifdef HAVE_STDINT_H # include #endif #ifdef HAVE_UNISTD_H # include #endif" ac_subst_vars='LTLIBOBJS LIBOBJS current_directory SYMS EGREP GREP CPP CURSES ICONV 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 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 with_compiler ' ac_precious_vars='build_alias host_alias target_alias CC CFLAGS LDFLAGS LIBS CPPFLAGS CPP' # 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' includedir='${prefix}/include' oldincludedir='/usr/include' docdir='${datarootdir}/doc/${PACKAGE}' 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 # Accept the important Cygnus configure options, so we can diagnose typos. 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=`$as_echo "$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=`$as_echo "$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 ;; -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=`$as_echo "$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=`$as_echo "$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. $as_echo "$as_me: WARNING: you should use --build, --host, --target" >&2 expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && $as_echo "$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" ;; *) $as_echo "$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 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 $as_echo "$as_me: WARNING: if you wanted to set the --build type, don't use --host. If a cross compiler is detected then cross compile mode will be used" >&2 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 || $as_echo 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 this package 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] --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/PACKAGE] --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 cat <<\_ACEOF Optional Packages: --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) --with-hc=ARG ignored 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 CPP C preprocessor 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 the package provider. _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=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`$as_echo "$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 guested configure. 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 $as_echo "$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 configure generated by GNU Autoconf 2.68 Copyright (C) 2010 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 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\"" $as_echo "$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 $as_echo "$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_echo "$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_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$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\"" $as_echo "$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 $as_echo "$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 || $as_test_x conftest$ac_exeext }; then : ac_retval=0 else $as_echo "$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 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else 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. Prefer to if __STDC__ is defined, since exists even on freestanding compilers. */ #ifdef __STDC__ # include #else # include #endif #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 () { return $2 (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : eval "$3=yes" else eval "$3=no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_func # ac_fn_c_try_cpp LINENO # ---------------------- # Try to preprocess conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_cpp () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if { { ac_try="$ac_cpp conftest.$ac_ext" 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\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_cpp conftest.$ac_ext") 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 $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } > conftest.i && { test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || test ! -s conftest.err }; then : ac_retval=0 else $as_echo "$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_cpp # ac_fn_c_check_header_mongrel LINENO HEADER VAR INCLUDES # ------------------------------------------------------- # Tests whether HEADER exists, giving a warning if it cannot be compiled using # the include files in INCLUDES and setting the cache variable VAR # accordingly. ac_fn_c_check_header_mongrel () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if eval \${$3+:} false; then : { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } else # Is the header compilable? { $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 usability" >&5 $as_echo_n "checking $2 usability... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 #include <$2> _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_header_compiler=yes else ac_header_compiler=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_compiler" >&5 $as_echo "$ac_header_compiler" >&6; } # Is the header present? { $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 presence" >&5 $as_echo_n "checking $2 presence... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include <$2> _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : ac_header_preproc=yes else ac_header_preproc=no fi rm -f conftest.err conftest.i conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_preproc" >&5 $as_echo "$ac_header_preproc" >&6; } # So? What about this header? case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in #(( yes:no: ) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&5 $as_echo "$as_me: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 $as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} ;; no:yes:* ) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: present but cannot be compiled" >&5 $as_echo "$as_me: WARNING: $2: present but cannot be compiled" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: check for missing prerequisite headers?" >&5 $as_echo "$as_me: WARNING: $2: check for missing prerequisite headers?" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: see the Autoconf documentation" >&5 $as_echo "$as_me: WARNING: $2: see the Autoconf documentation" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&5 $as_echo "$as_me: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 $as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else eval "$3=\$ac_header_compiler" fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_header_mongrel # ac_fn_c_try_run LINENO # ---------------------- # Try to link conftest.$ac_ext, and return whether this succeeded. Assumes # that executables *can* be run. ac_fn_c_try_run () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack 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\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { ac_try='./conftest$ac_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\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; }; then : ac_retval=0 else $as_echo "$as_me: program exited with status $ac_status" >&5 $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=$ac_status fi 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_run # 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 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else 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 eval "$3=no" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_header_compile 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 $as_me, which was generated by GNU Autoconf 2.68. Invocation command line was $ $0 $@ _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 test -z "$as_dir" && as_dir=. $as_echo "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=`$as_echo "$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=$? # Save into config.log some information that might help in debugging. { echo $as_echo "## ---------------- ## ## 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_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 $as_echo "$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 $as_echo "## ----------------- ## ## Output variables. ## ## ----------------- ##" echo for ac_var in $ac_subst_vars do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac $as_echo "$ac_var='\''$ac_val'\''" done | sort echo if test -n "$ac_subst_files"; then $as_echo "## ------------------- ## ## File substitutions. ## ## ------------------- ##" echo for ac_var in $ac_subst_files do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac $as_echo "$ac_var='\''$ac_val'\''" done | sort echo fi if test -s confdefs.h; then $as_echo "## ----------- ## ## confdefs.h. ## ## ----------- ##" echo cat confdefs.h echo fi test "$ac_signal" != 0 && $as_echo "$as_me: caught signal $ac_signal" $as_echo "$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 $as_echo "/* confdefs.h */" > confdefs.h # Predefined preprocessor variables. cat >>confdefs.h <<_ACEOF #define PACKAGE_NAME "$PACKAGE_NAME" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_TARNAME "$PACKAGE_TARNAME" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_VERSION "$PACKAGE_VERSION" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_STRING "$PACKAGE_STRING" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_URL "$PACKAGE_URL" _ACEOF # Let the site file select an alternate cache file if it wants to. # Prefer an explicitly selected file to automatically selected ones. ac_site_file1=NONE ac_site_file2=NONE if test -n "$CONFIG_SITE"; then # We do not want a PATH search for config.site. case $CONFIG_SITE in #(( -*) ac_site_file1=./$CONFIG_SITE;; */*) ac_site_file1=$CONFIG_SITE;; *) ac_site_file1=./$CONFIG_SITE;; esac elif test "x$prefix" != xNONE; then ac_site_file1=$prefix/share/config.site ac_site_file2=$prefix/etc/config.site else ac_site_file1=$ac_default_prefix/share/config.site ac_site_file2=$ac_default_prefix/etc/config.site fi for ac_site_file in "$ac_site_file1" "$ac_site_file2" do test "x$ac_site_file" = xNONE && continue if test /dev/null != "$ac_site_file" && test -r "$ac_site_file"; then { $as_echo "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5 $as_echo "$as_me: loading site script $ac_site_file" >&6;} sed 's/^/| /' "$ac_site_file" >&5 . "$ac_site_file" \ || { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$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 { $as_echo "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5 $as_echo "$as_me: loading cache $cache_file" >&6;} case $cache_file in [\\/]* | ?:[\\/]* ) . "$cache_file";; *) . "./$cache_file";; esac fi else { $as_echo "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5 $as_echo "$as_me: creating cache $cache_file" >&6;} >$cache_file 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,) { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 $as_echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} ac_cache_corrupted=: ;; ,set) { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5 $as_echo "$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 { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5 $as_echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} ac_cache_corrupted=: else { $as_echo "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5 $as_echo "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;} eval $ac_var=\$ac_old_val fi { $as_echo "$as_me:${as_lineno-$LINENO}: former value: \`$ac_old_val'" >&5 $as_echo "$as_me: former value: \`$ac_old_val'" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: current value: \`$ac_new_val'" >&5 $as_echo "$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=`$as_echo "$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 { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5 $as_echo "$as_me: error: changes in the environment can compromise the build" >&2;} as_fn_error $? "run \`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 # Prepare to generate the config.h.in file ac_config_headers="$ac_config_headers cbits/config.h" # this is arbitrary # Check whether --with-compiler was given. if test "${with_compiler+set}" = set; then : withval=$with_compiler; true else true fi # # Curses. If you don't have wchar_t-aware ncurses (Debian package: # libncursesw5-dev), uncomment the first line and comment-out the # two later. # # The shell variables should be added to, e.g., $LIBS # 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 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else 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 test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_CC="${ac_tool_prefix}gcc" $as_echo "$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 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "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 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CC+:} false; then : $as_echo_n "(cached) " >&6 else 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 test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_CC="gcc" $as_echo "$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 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$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 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else 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 test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_CC="${ac_tool_prefix}cc" $as_echo "$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 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "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 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else 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 test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$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" $as_echo "$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 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "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 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else 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 test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_CC="$ac_tool_prefix$ac_prog" $as_echo "$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 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "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 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CC+:} false; then : $as_echo_n "(cached) " >&6 else 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 test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_CC="$ac_prog" $as_echo "$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 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "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:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi fi fi test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$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. $as_echo "$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; 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\"" $as_echo "$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 $as_echo "$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 () { ; 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. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler works" >&5 $as_echo_n "checking whether the C compiler works... " >&6; } ac_link_default=`$as_echo "$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\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link_default") 2>&5 ac_status=$? $as_echo "$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+set}" = set && 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 ac_file='' fi if test -z "$ac_file"; then : { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$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_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler default output file name" >&5 $as_echo_n "checking for C compiler default output file name... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5 $as_echo "$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 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5 $as_echo_n "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\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$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_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$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 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5 $as_echo "$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 () { 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. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5 $as_echo_n "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\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$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\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$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 { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot run C compiled programs. If you meant to cross compile, use \`--host'. See \`config.log' for more details" "$LINENO" 5; } fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5 $as_echo "$cross_compiling" >&6; } rm -f conftest.$ac_ext conftest$ac_cv_exeext conftest.out ac_clean_files=$ac_clean_files_save { $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5 $as_echo_n "checking for suffix of object files... " >&6; } if ${ac_cv_objext+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; 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\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>&5 ac_status=$? $as_echo "$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_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$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 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5 $as_echo "$ac_cv_objext" >&6; } OBJEXT=$ac_cv_objext ac_objext=$OBJEXT { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5 $as_echo_n "checking whether we are using the GNU C compiler... " >&6; } if ${ac_cv_c_compiler_gnu+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { #ifndef __GNUC__ choke me #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_compiler_gnu=yes else ac_compiler_gnu=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_c_compiler_gnu=$ac_compiler_gnu fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5 $as_echo "$ac_cv_c_compiler_gnu" >&6; } if test $ac_compiler_gnu = yes; then GCC=yes else GCC= fi ac_test_CFLAGS=${CFLAGS+set} ac_save_CFLAGS=$CFLAGS { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5 $as_echo_n "checking whether $CC accepts -g... " >&6; } if ${ac_cv_prog_cc_g+:} false; then : $as_echo_n "(cached) " >&6 else 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 () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_g=yes else CFLAGS="" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : else ac_c_werror_flag=$ac_save_c_werror_flag CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; 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.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_c_werror_flag=$ac_save_c_werror_flag fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5 $as_echo "$ac_cv_prog_cc_g" >&6; } if test "$ac_test_CFLAGS" = set; 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 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5 $as_echo_n "checking for $CC option to accept ISO C89... " >&6; } if ${ac_cv_prog_cc_c89+:} false; then : $as_echo_n "(cached) " >&6 else ac_cv_prog_cc_c89=no ac_save_CC=$CC cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include #include /* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ struct buf { int x; }; FILE * (*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 don't provoke an error unfortunately, instead are silently treated as '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's necessary to write '\x00'==0 to get something that's 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 **, FILE *(*)(struct buf *, struct stat *, int), int, int); int argc; char **argv; int main () { return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; ; return 0; } _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 test "x$ac_cv_prog_cc_c89" != "xno" && break done rm -f conftest.$ac_ext CC=$ac_save_CC fi # AC_CACHE_VAL case "x$ac_cv_prog_cc_c89" in x) { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 $as_echo "none needed" >&6; } ;; xno) { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 $as_echo "unsupported" >&6; } ;; *) CC="$CC $ac_cv_prog_cc_c89" { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 $as_echo "$ac_cv_prog_cc_c89" >&6; } ;; esac if test "x$ac_cv_prog_cc_c89" != xno; then : 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 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for addnstr in -lcurses" >&5 $as_echo_n "checking for addnstr in -lcurses... " >&6; } if ${ac_cv_lib_curses_addnstr+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lcurses $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. */ #ifdef __cplusplus extern "C" #endif char addnstr (); int main () { return addnstr (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_curses_addnstr=yes else ac_cv_lib_curses_addnstr=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_curses_addnstr" >&5 $as_echo "$ac_cv_lib_curses_addnstr" >&6; } if test "x$ac_cv_lib_curses_addnstr" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_LIBCURSES 1 _ACEOF LIBS="-lcurses $LIBS" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for addnstr in -lncurses" >&5 $as_echo_n "checking for addnstr in -lncurses... " >&6; } if ${ac_cv_lib_ncurses_addnstr+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lncurses $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. */ #ifdef __cplusplus extern "C" #endif char addnstr (); int main () { return addnstr (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_ncurses_addnstr=yes else ac_cv_lib_ncurses_addnstr=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_ncurses_addnstr" >&5 $as_echo "$ac_cv_lib_ncurses_addnstr" >&6; } if test "x$ac_cv_lib_ncurses_addnstr" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_LIBNCURSES 1 _ACEOF LIBS="-lncurses $LIBS" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for waddnwstr in -lncursesw" >&5 $as_echo_n "checking for waddnwstr in -lncursesw... " >&6; } if ${ac_cv_lib_ncursesw_waddnwstr+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lncursesw $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. */ #ifdef __cplusplus extern "C" #endif char waddnwstr (); int main () { return waddnwstr (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_ncursesw_waddnwstr=yes else ac_cv_lib_ncursesw_waddnwstr=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_ncursesw_waddnwstr" >&5 $as_echo "$ac_cv_lib_ncursesw_waddnwstr" >&6; } if test "x$ac_cv_lib_ncursesw_waddnwstr" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_LIBNCURSESW 1 _ACEOF LIBS="-lncursesw $LIBS" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for addnstr in -lpdcurses" >&5 $as_echo_n "checking for addnstr in -lpdcurses... " >&6; } if ${ac_cv_lib_pdcurses_addnstr+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lpdcurses $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. */ #ifdef __cplusplus extern "C" #endif char addnstr (); int main () { return addnstr (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_pdcurses_addnstr=yes else ac_cv_lib_pdcurses_addnstr=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_pdcurses_addnstr" >&5 $as_echo "$ac_cv_lib_pdcurses_addnstr" >&6; } if test "x$ac_cv_lib_pdcurses_addnstr" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_LIBPDCURSES 1 _ACEOF LIBS="-lpdcurses $LIBS" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for waddnwstr in -lpdcursesw" >&5 $as_echo_n "checking for waddnwstr in -lpdcursesw... " >&6; } if ${ac_cv_lib_pdcursesw_waddnwstr+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lpdcursesw $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. */ #ifdef __cplusplus extern "C" #endif char waddnwstr (); int main () { return waddnwstr (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_pdcursesw_waddnwstr=yes else ac_cv_lib_pdcursesw_waddnwstr=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_pdcursesw_waddnwstr" >&5 $as_echo "$ac_cv_lib_pdcursesw_waddnwstr" >&6; } if test "x$ac_cv_lib_pdcursesw_waddnwstr" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_LIBPDCURSESW 1 _ACEOF LIBS="-lpdcursesw $LIBS" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for iconv in -liconv" >&5 $as_echo_n "checking for iconv in -liconv... " >&6; } if ${ac_cv_lib_iconv_iconv+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-liconv $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. */ #ifdef __cplusplus extern "C" #endif char iconv (); int main () { return iconv (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_iconv_iconv=yes else ac_cv_lib_iconv_iconv=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_iconv_iconv" >&5 $as_echo "$ac_cv_lib_iconv_iconv" >&6; } if test "x$ac_cv_lib_iconv_iconv" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_LIBICONV 1 _ACEOF LIBS="-liconv $LIBS" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for libiconv in -liconv" >&5 $as_echo_n "checking for libiconv in -liconv... " >&6; } if ${ac_cv_lib_iconv_libiconv+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-liconv $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. */ #ifdef __cplusplus extern "C" #endif char libiconv (); int main () { return libiconv (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_iconv_libiconv=yes else ac_cv_lib_iconv_libiconv=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_iconv_libiconv" >&5 $as_echo "$ac_cv_lib_iconv_libiconv" >&6; } if test "x$ac_cv_lib_iconv_libiconv" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_LIBICONV 1 _ACEOF LIBS="-liconv $LIBS" fi # Bit weird. On OpenBSD you need the 'lib' suffix to iconv functions, it seems for ac_func in libiconv do : ac_fn_c_check_func "$LINENO" "libiconv" "ac_cv_func_libiconv" if test "x$ac_cv_func_libiconv" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_LIBICONV 1 _ACEOF $as_echo "#define ICONV_LIB_PREFIX 1" >>confdefs.h fi done # On linux we need to call doupdate() after endwin() to restore the term if uname -s | grep Linux > /dev/null 2>&1 ; then $as_echo "#define NCURSES_UPDATE_AFTER_END 1" >>confdefs.h fi # some special libs need to be set for package.conf files if echo "$LIBS" | grep iconv > /dev/null 2>&1 ; then ICONV=iconv fi if (echo "$LIBS" | grep ncursesw) >/dev/null 2>&1 ; then CURSES=ncursesw elif (echo "$LIBS" | grep ncurses) >/dev/null 2>&1 ; then CURSES=ncurses elif (echo "$LIBS" | grep pdcursesw) >/dev/null 2>&1 ; then CURSES=pdcursesw elif (echo "$LIBS" | grep pdcurses) >/dev/null 2>&1 ; then CURSES=pdcurses else CURSES=curses fi # # Specific headers to check for # 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 { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C preprocessor" >&5 $as_echo_n "checking how to run the C preprocessor... " >&6; } # On Suns, sometimes $CPP names a directory. if test -n "$CPP" && test -d "$CPP"; then CPP= fi if test -z "$CPP"; then if ${ac_cv_prog_CPP+:} false; then : $as_echo_n "(cached) " >&6 else # Double quotes because CPP needs to be expanded for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp" do ac_preproc_ok=false for ac_c_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : else # Broken: fails on valid input. continue fi rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.i conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok; then : break fi done ac_cv_prog_CPP=$CPP fi CPP=$ac_cv_prog_CPP else ac_cv_prog_CPP=$CPP fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CPP" >&5 $as_echo "$CPP" >&6; } ac_preproc_ok=false for ac_c_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : else # Broken: fails on valid input. continue fi rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.i conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok; then : else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "C preprocessor \"$CPP\" fails sanity check See \`config.log' for more details" "$LINENO" 5; } 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 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5 $as_echo_n "checking for grep that handles long lines and -e... " >&6; } if ${ac_cv_path_GREP+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$GREP"; then ac_path_GREP_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in grep ggrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext" { test -f "$ac_path_GREP" && $as_test_x "$ac_path_GREP"; } || continue # Check for GNU ac_path_GREP and select it if it is found. # Check for GNU $ac_path_GREP case `"$ac_path_GREP" --version 2>&1` in *GNU*) ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo 'GREP' >> "conftest.nl" "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_GREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_GREP_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_GREP"; then as_fn_error $? "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 fi else ac_cv_path_GREP=$GREP fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP" >&5 $as_echo "$ac_cv_path_GREP" >&6; } GREP="$ac_cv_path_GREP" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5 $as_echo_n "checking for egrep... " >&6; } if ${ac_cv_path_EGREP+:} false; then : $as_echo_n "(cached) " >&6 else if echo a | $GREP -E '(a|b)' >/dev/null 2>&1 then ac_cv_path_EGREP="$GREP -E" else if test -z "$EGREP"; then ac_path_EGREP_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in egrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext" { test -f "$ac_path_EGREP" && $as_test_x "$ac_path_EGREP"; } || continue # Check for GNU ac_path_EGREP and select it if it is found. # Check for GNU $ac_path_EGREP case `"$ac_path_EGREP" --version 2>&1` in *GNU*) ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo 'EGREP' >> "conftest.nl" "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_EGREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_EGREP_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_EGREP"; then as_fn_error $? "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 fi else ac_cv_path_EGREP=$EGREP fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5 $as_echo "$ac_cv_path_EGREP" >&6; } EGREP="$ac_cv_path_EGREP" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5 $as_echo_n "checking for ANSI C header files... " >&6; } if ${ac_cv_header_stdc+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include #include int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_header_stdc=yes else ac_cv_header_stdc=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext if test $ac_cv_header_stdc = yes; then # SunOS 4.x string.h does not declare mem*, contrary to ANSI. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "memchr" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "free" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. if test "$cross_compiling" = yes; then : : else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #if ((' ' & 0x0FF) == 0x020) # define ISLOWER(c) ('a' <= (c) && (c) <= 'z') # define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) #else # define ISLOWER(c) \ (('a' <= (c) && (c) <= 'i') \ || ('j' <= (c) && (c) <= 'r') \ || ('s' <= (c) && (c) <= 'z')) # define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c)) #endif #define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) int main () { int i; for (i = 0; i < 256; i++) if (XOR (islower (i), ISLOWER (i)) || toupper (i) != TOUPPER (i)) return 2; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : else ac_cv_header_stdc=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5 $as_echo "$ac_cv_header_stdc" >&6; } if test $ac_cv_header_stdc = yes; then $as_echo "#define STDC_HEADERS 1" >>confdefs.h fi # On IRIX 5.3, sys/types and inttypes.h are conflicting. for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \ inttypes.h stdint.h unistd.h do : as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default " if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done for ac_header in iconv.h curses.h ncurses.h ncursesw/ncurses.h locale.h langinfo.h wchar.h limits.h signal.h do : as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default" if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done current_directory=`pwd` ac_config_files="$ac_config_files hscurses.buildinfo" 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_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 $as_echo "$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+set}" = set || &/ 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 { $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5 $as_echo "$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 { $as_echo "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5 $as_echo "$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=`$as_echo "$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" { $as_echo "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5 $as_echo "$as_me: creating $CONFIG_STATUS" >&6;} as_write_fail=0 cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1 #! $SHELL # Generated by $as_me. # Run this file to recreate the current configuration. # Compiler output produced by configure, useful for debugging # configure, is in config.log if it exists. debug=false ac_cs_recheck=false ac_cs_silent=false SHELL=\${CONFIG_SHELL-$SHELL} export SHELL _ASEOF cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1 ## -------------------- ## ## M4sh Initialization. ## ## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi as_nl=' ' export as_nl # Printing a long string crashes Solaris 7 /usr/bin/printf. as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo # Prefer a ksh shell builtin over an external printf program on Solaris, # but without wasting forks for bash or zsh. if test -z "$BASH_VERSION$ZSH_VERSION" \ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='print -r --' as_echo_n='print -rn --' elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='printf %s\n' as_echo_n='printf %s' else if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' as_echo_n='/usr/ucb/echo -n' else as_echo_body='eval expr "X$1" : "X\\(.*\\)"' as_echo_n_body='eval arg=$1; case $arg in #( *"$as_nl"*) expr "X$arg" : "X\\(.*\\)$as_nl"; arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; esac; expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" ' export as_echo_n_body as_echo_n='sh -c $as_echo_n_body as_echo' fi export as_echo_body as_echo='sh -c $as_echo_body as_echo' fi # The user is always right. if test "${PATH_SEPARATOR+set}" != set; 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 # IFS # We need space, tab and new line, in precisely that order. Quoting is # there to prevent editors from complaining about space-tab. # (If _AS_PATH_WALK were called with IFS unset, it would disable word # splitting by setting IFS to empty value.) IFS=" "" $as_nl" # 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 test -z "$as_dir" && as_dir=. 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 $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # Unset variables that we do not need and which cause bugs (e.g. in # pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" # suppresses any "Segmentation fault" message there. '((' could # trigger a bug in pdksh 5.2.14. for as_var in BASH_ENV ENV MAIL MAILPATH do eval test x\${$as_var+set} = xset \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # CDPATH. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH # 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 $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi $as_echo "$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_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_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 || $as_echo 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 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 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 -p'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -p' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -p' fi else as_ln_s='cp -p' 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=`$as_echo "$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 || $as_echo 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 if test -x / >/dev/null 2>&1; then as_test_x='test -x' else if ls -dL / >/dev/null 2>&1; then as_ls_L_option=L else as_ls_L_option= fi as_test_x=' eval sh -c '\'' if test -d "$1"; then test -d "$1/."; else case $1 in #( -*)set "./$1";; esac; case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in #(( ???[sx]*):;;*)false;;esac;fi '\'' sh ' fi as_executable_p=$as_test_x # 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 $as_me, which was generated by GNU Autoconf 2.68. 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 the package provider." _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" ac_cs_version="\\ config.status configured by $0, generated by GNU Autoconf 2.68, with options \\"\$ac_cs_config\\" Copyright (C) 2010 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' 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 ) $as_echo "$ac_cs_version"; exit ;; --config | --confi | --conf | --con | --co | --c ) $as_echo "$ac_cs_config"; exit ;; --debug | --debu | --deb | --de | --d | -d ) debug=: ;; --file | --fil | --fi | --f ) $ac_shift case $ac_optarg in *\'*) ac_optarg=`$as_echo "$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=`$as_echo "$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 ) $as_echo "$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 \$as_echo "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 $as_echo "$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 "cbits/config.h") CONFIG_HEADERS="$CONFIG_HEADERS cbits/config.h" ;; "hscurses.buildinfo") CONFIG_FILES="$CONFIG_FILES hscurses.buildinfo" ;; *) 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+set}" = set || CONFIG_FILES=$config_files test "${CONFIG_HEADERS+set}" = set || 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=`$as_echo "$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 '` $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g' `' by configure.' if test x"$ac_file" != x-; then configure_input="$ac_file. $configure_input" { $as_echo "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5 $as_echo "$as_me: creating $ac_file" >&6;} fi # Neutralize special characters interpreted by sed in replacement strings. case $configure_input in #( *\&* | *\|* | *\\* ) ac_sed_conf_input=`$as_echo "$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 || $as_echo 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=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`$as_echo "$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 # _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@*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 $as_echo "$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 $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"; } && { $as_echo "$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 $as_echo "$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 { $as_echo "/* $configure_input */" \ && 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 { $as_echo "$as_me:${as_lineno-$LINENO}: $ac_file is unchanged" >&5 $as_echo "$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 $as_echo "/* $configure_input */" \ && 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 { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5 $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;} fi hscurses-1.4.1.2/configure.ac0000644000000000000000000000375512024055722014201 0ustar0000000000000000# use autoreconf to generate configure script and cbits/config.h # sanity AC_INIT(UI/HSCurses/Curses.hsc) # Prepare to generate the config.h.in file AC_CONFIG_HEADERS([cbits/config.h]) # this is arbitrary AC_PREREQ([2.52]) AC_ARG_WITH(compiler, [AC_HELP_STRING([--with-hc=ARG], [ignored])], true, true) # # Curses. If you don't have wchar_t-aware ncurses (Debian package: # libncursesw5-dev), uncomment the first line and comment-out the # two later. # # The shell variables should be added to, e.g., $LIBS # AC_CHECK_LIB(curses, addnstr) AC_CHECK_LIB(ncurses, addnstr) AC_CHECK_LIB(ncursesw, waddnwstr) AC_CHECK_LIB(pdcurses, addnstr) AC_CHECK_LIB(pdcursesw, waddnwstr) AC_CHECK_LIB(iconv, iconv) AC_CHECK_LIB(iconv, libiconv) # Bit weird. On OpenBSD you need the 'lib' suffix to iconv functions, it seems AC_CHECK_FUNCS(libiconv, AC_DEFINE( [ICONV_LIB_PREFIX],[1], [Define to 1 if you need a 'lib' prefix to iconv functions])) # On linux we need to call doupdate() after endwin() to restore the term if uname -s | grep Linux > /dev/null 2>&1 ; then AC_DEFINE( [NCURSES_UPDATE_AFTER_END],[1], [Define to 1 if you need to call doupdate after endwin]) fi # some special libs need to be set for package.conf files if echo "$LIBS" | grep iconv > /dev/null 2>&1 ; then ICONV=iconv fi if (echo "$LIBS" | grep ncursesw) >/dev/null 2>&1 ; then CURSES=ncursesw elif (echo "$LIBS" | grep ncurses) >/dev/null 2>&1 ; then CURSES=ncurses elif (echo "$LIBS" | grep pdcursesw) >/dev/null 2>&1 ; then CURSES=pdcursesw elif (echo "$LIBS" | grep pdcurses) >/dev/null 2>&1 ; then CURSES=pdcurses else CURSES=curses fi AC_SUBST(ICONV) AC_SUBST(CURSES) # # Specific headers to check for # AC_CHECK_HEADERS([iconv.h curses.h ncurses.h ncursesw/ncurses.h locale.h langinfo.h wchar.h limits.h signal.h ]) AC_SUBST(SYMS) current_directory=`pwd` AC_SUBST(current_directory) AC_CONFIG_FILES([hscurses.buildinfo]) AC_OUTPUT hscurses-1.4.1.2/hscurses.buildinfo.in0000644000000000000000000000003212024055722016035 0ustar0000000000000000extra-libraries: @CURSES@ hscurses-1.4.1.2/hscurses.cabal0000644000000000000000000000405512024055722014530 0ustar0000000000000000Name: hscurses Version: 1.4.1.2 License: LGPL License-file: LICENSE Author: John Meacham Tuomo Valkonen Don Stewart Stefan Wehr Copyright: Stefan Wehr 2004 - 2011 Don Stewart 2004 Tuomo Valkonen 2004 John Meacham 2002-2004 Maintainer: Stefan Wehr Stability: Stable Category: User-interface Synopsis: NCurses bindings for Haskell Description: Binding to NCurses, a library of functions that manage an application's display on character-cell terminals. Additionally, it contains some basic widgets such as a text input widget and a table widget. Homepage: https://github.com/skogsbaer/hscurses Cabal-version: >= 1.6 Build-Type: Configure Tested-with: GHC==7.0.4, GHC==7.2.1, GHC==7.4.2, GHC==7.6.1 Data-files: README, TODO, ChangeLog, example/contacts2, example/Setup.hs, example/ContactManager.hs, example/cm.cabal, example/contacts, cbits/config.h.in configure, configure.ac, hscurses.buildinfo.in, cbits/HSCurses.h, cbits/HSCursesUtils.h Source-Repository head Type: git Location: git://github.com/skogsbaer/hscurses.git Library Build-depends: base == 4.*, mtl, old-time < 1.2, old-locale == 1.0.* if !os(windows) Build-depends: unix >= 2.4 && < 2.7 Exposed-modules: UI.HSCurses.Curses, UI.HSCurses.CursesHelper, UI.HSCurses.Widgets, UI.HSCurses.MonadException, UI.HSCurses.Logging Other-modules: UI.HSCurses.CWString, UI.HSCurses.IConv C-sources: cbits/HSCursesUtils.c Includes: HSCurses.h, HSCursesUtils.h Extensions: CPP, ForeignFunctionInterface, GeneralizedNewtypeDeriving, ScopedTypeVariables, ExistentialQuantification Include-dirs: cbits . Ghc-options: -funbox-strict-fields -Wall -fno-warn-unused-do-bind -fno-warn-name-shadowing hscurses-1.4.1.2/LICENSE0000644000000000000000000006215112024055722012713 0ustar0000000000000000 GNU LESSER GENERAL PUBLIC LICENSE Version 2.1, February 1999 Copyright (C) 1991, 1999 Free Software Foundation, Inc. 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. [This is the first released version of the Lesser GPL. It also counts as the successor of the GNU Library Public License, version 2, hence the version number 2.1.] Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public Licenses are intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This license, the Lesser General Public License, applies to some specially designated software packages--typically libraries--of the Free Software Foundation and other authors who decide to use it. You can use it too, but we suggest you first think carefully about whether this license or the ordinary General Public License is the better strategy to use in any particular case, based on the explanations below. When we speak of free software, we are referring to freedom of use, 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 this service if you wish); that you receive source code or can get it if you want it; that you can change the software and use pieces of it in new free programs; and that you are informed that you can do these things. To protect your rights, we need to make restrictions that forbid distributors to deny you these rights or to ask you to surrender these rights. These restrictions translate to certain responsibilities for you if you distribute copies of the library or if you modify it. For example, if you distribute copies of the library, whether gratis or for a fee, you must give the recipients all the rights that we gave you. You must make sure that they, too, receive or can get the source code. If you link other code with the library, you must provide complete object files to the recipients, so that they can relink them with the library after making changes to the library and recompiling it. And you must show them these terms so they know their rights. We protect your rights with a two-step method: (1) we copyright the library, and (2) we offer you this license, which gives you legal permission to copy, distribute and/or modify the library. To protect each distributor, we want to make it very clear that there is no warranty for the free library. Also, if the library is modified by someone else and passed on, the recipients should know that what they have is not the original version, so that the original author's reputation will not be affected by problems that might be introduced by others. Finally, software patents pose a constant threat to the existence of any free program. We wish to make sure that a company cannot effectively restrict the users of a free program by obtaining a restrictive license from a patent holder. Therefore, we insist that any patent license obtained for a version of the library must be consistent with the full freedom of use specified in this license. Most GNU software, including some libraries, is covered by the ordinary GNU General Public License. This license, the GNU Lesser General Public License, applies to certain designated libraries, and is quite different from the ordinary General Public License. We use this license for certain libraries in order to permit linking those libraries into non-free programs. When a program is linked with a library, whether statically or using a shared library, the combination of the two is legally speaking a combined work, a derivative of the original library. The ordinary General Public License therefore permits such linking only if the entire combination fits its criteria of freedom. The Lesser General Public License permits more lax criteria for linking other code with the library. We call this license the "Lesser" General Public License because it does Less to protect the user's freedom than the ordinary General Public License. It also provides other free software developers Less of an advantage over competing non-free programs. These disadvantages are the reason we use the ordinary General Public License for many libraries. However, the Lesser license provides advantages in certain special circumstances. For example, on rare occasions, there may be a special need to encourage the widest possible use of a certain library, so that it becomes a de-facto standard. To achieve this, non-free programs must be allowed to use the library. A more frequent case is that a free library does the same job as widely used non-free libraries. In this case, there is little to gain by limiting the free library to free software only, so we use the Lesser General Public License. In other cases, permission to use a particular library in non-free programs enables a greater number of people to use a large body of free software. For example, permission to use the GNU C Library in non-free programs enables many more people to use the whole GNU operating system, as well as its variant, the GNU/Linux operating system. Although the Lesser General Public License is Less protective of the users' freedom, it does ensure that the user of a program that is linked with the Library has the freedom and the wherewithal to run that program using a modified version of the Library. The precise terms and conditions for copying, distribution and modification follow. Pay close attention to the difference between a "work based on the library" and a "work that uses the library". The former contains code derived from the library, whereas the latter must be combined with the library in order to run. GNU LESSER GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License Agreement applies to any software library or other program which contains a notice placed by the copyright holder or other authorized party saying it may be distributed under the terms of this Lesser General Public License (also called "this License"). Each licensee is addressed as "you". A "library" means a collection of software functions and/or data prepared so as to be conveniently linked with application programs (which use some of those functions and data) to form executables. The "Library", below, refers to any such software library or work which has been distributed under these terms. A "work based on the Library" means either the Library or any derivative work under copyright law: that is to say, a work containing the Library or a portion of it, either verbatim or with modifications and/or translated straightforwardly into another language. (Hereinafter, translation is included without limitation in the term "modification".) "Source code" for a work means the preferred form of the work for making modifications to it. For a library, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the library. Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running a program using the Library is not restricted, and output from such a program is covered only if its contents constitute a work based on the Library (independent of the use of the Library in a tool for writing it). Whether that is true depends on what the Library does and what the program that uses the Library does. 1. You may copy and distribute verbatim copies of the Library's complete source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and distribute a copy of this License along with the Library. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Library or any portion of it, thus forming a work based on the Library, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) The modified work must itself be a software library. b) You must cause the files modified to carry prominent notices stating that you changed the files and the date of any change. c) You must cause the whole of the work to be licensed at no charge to all third parties under the terms of this License. d) If a facility in the modified Library refers to a function or a table of data to be supplied by an application program that uses the facility, other than as an argument passed when the facility is invoked, then you must make a good faith effort to ensure that, in the event an application does not supply such function or table, the facility still operates, and performs whatever part of its purpose remains meaningful. (For example, a function in a library to compute square roots has a purpose that is entirely well-defined independent of the application. Therefore, Subsection 2d requires that any application-supplied function or table used by this function must be optional: if the application does not supply it, the square root function must still compute square roots.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Library, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Library, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Library. In addition, mere aggregation of another work not based on the Library with the Library (or with a work based on the Library) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may opt to apply the terms of the ordinary GNU General Public License instead of this License to a given copy of the Library. To do this, you must alter all the notices that refer to this License, so that they refer to the ordinary GNU General Public License, version 2, instead of to this License. (If a newer version than version 2 of the ordinary GNU General Public License has appeared, then you can specify that version instead if you wish.) Do not make any other change in these notices. Once this change is made in a given copy, it is irreversible for that copy, so the ordinary GNU General Public License applies to all subsequent copies and derivative works made from that copy. This option is useful when you wish to copy part of the code of the Library into a program that is not a library. 4. You may copy and distribute the Library (or a portion or derivative of it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange. If distribution of object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place satisfies the requirement to distribute the source code, even though third parties are not compelled to copy the source along with the object code. 5. A program that contains no derivative of any portion of the Library, but is designed to work with the Library by being compiled or linked with it, is called a "work that uses the Library". Such a work, in isolation, is not a derivative work of the Library, and therefore falls outside the scope of this License. However, linking a "work that uses the Library" with the Library creates an executable that is a derivative of the Library (because it contains portions of the Library), rather than a "work that uses the library". The executable is therefore covered by this License. Section 6 states terms for distribution of such executables. When a "work that uses the Library" uses material from a header file that is part of the Library, the object code for the work may be a derivative work of the Library even though the source code is not. Whether this is true is especially significant if the work can be linked without the Library, or if the work is itself a library. The threshold for this to be true is not precisely defined by law. If such an object file uses only numerical parameters, data structure layouts and accessors, and small macros and small inline functions (ten lines or less in length), then the use of the object file is unrestricted, regardless of whether it is legally a derivative work. (Executables containing this object code plus portions of the Library will still fall under Section 6.) Otherwise, if the work is a derivative of the Library, you may distribute the object code for the work under the terms of Section 6. Any executables containing that work also fall under Section 6, whether or not they are linked directly with the Library itself. 6. As an exception to the Sections above, you may also combine or link a "work that uses the Library" with the Library to produce a work containing portions of the Library, and distribute that work under terms of your choice, provided that the terms permit modification of the work for the customer's own use and reverse engineering for debugging such modifications. You must give prominent notice with each copy of the work that the Library is used in it and that the Library and its use are covered by this License. You must supply a copy of this License. If the work during execution displays copyright notices, you must include the copyright notice for the Library among them, as well as a reference directing the user to the copy of this License. Also, you must do one of these things: a) Accompany the work with the complete corresponding machine-readable source code for the Library including whatever changes were used in the work (which must be distributed under Sections 1 and 2 above); and, if the work is an executable linked with the Library, with the complete machine-readable "work that uses the Library", as object code and/or source code, so that the user can modify the Library and then relink to produce a modified executable containing the modified Library. (It is understood that the user who changes the contents of definitions files in the Library will not necessarily be able to recompile the application to use the modified definitions.) b) Use a suitable shared library mechanism for linking with the Library. A suitable mechanism is one that (1) uses at run time a copy of the library already present on the user's computer system, rather than copying library functions into the executable, and (2) will operate properly with a modified version of the library, if the user installs one, as long as the modified version is interface-compatible with the version that the work was made with. c) Accompany the work with a written offer, valid for at least three years, to give the same user the materials specified in Subsection 6a, above, for a charge no more than the cost of performing this distribution. d) If distribution of the work is made by offering access to copy from a designated place, offer equivalent access to copy the above specified materials from the same place. e) Verify that the user has already received a copy of these materials or that you have already sent this user a copy. For an executable, the required form of the "work that uses the Library" must include any data and utility programs needed for reproducing the executable from it. However, as a special exception, the materials to be distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. It may happen that this requirement contradicts the license restrictions of other proprietary libraries that do not normally accompany the operating system. Such a contradiction means you cannot use both them and the Library together in an executable that you distribute. 7. You may place library facilities that are a work based on the Library side-by-side in a single library together with other library facilities not covered by this License, and distribute such a combined library, provided that the separate distribution of the work based on the Library and of the other library facilities is otherwise permitted, and provided that you do these two things: a) Accompany the combined library with a copy of the same work based on the Library, uncombined with any other library facilities. This must be distributed under the terms of the Sections above. b) Give prominent notice with the combined library of the fact that part of it is a work based on the Library, and explaining where to find the accompanying uncombined form of the same work. 8. You may not copy, modify, sublicense, link with, or distribute the Library except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense, link with, or distribute the Library is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 9. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Library or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Library (or any work based on the Library), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Library or works based on it. 10. Each time you redistribute the Library (or any work based on the Library), the recipient automatically receives a license from the original licensor to copy, distribute, link with or modify the Library subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties with this License. 11. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), 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 distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Library at all. For example, if a patent license would not permit royalty-free redistribution of the Library by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Library. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply, and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 12. If the distribution and/or use of the Library is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Library under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 13. The Free Software Foundation may publish revised and/or new versions of the Lesser 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 Library specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Library does not specify a license version number, you may choose any version ever published by the Free Software Foundation. 14. If you wish to incorporate parts of the Library into other free programs whose distribution conditions are incompatible with these, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE LIBRARY "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 LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE LIBRARY 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 LIBRARY (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 LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS ------------------------------------------------------------------------ The ncurses binding was originally written by John Meacham, and is available under the license: Unless otherwise stated the following licence applies: Copyright (c) 2002-2004 John Meacham (john at repetae dot net) Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.hscurses-1.4.1.2/README0000644000000000000000000000411012024055722012555 0ustar0000000000000000 hscurses -- A Haskell Binding to ncurses =+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+ hscurses is a Haskell binding to the ncurses library, a library of functions that manage an application's display on character-cell terminals. hscurses also provides some basic widgets implemented on top of the ncurses binding, such as a text input widget and a table widget. The hscurses library has been reported to work on Linux x86 using GHC 6.12.1, 7.0.3 and 7.2.1. Building and installing the hscurses library with GHC ----------------------------------------------------- Requirements: - GNU m4 - GHC >= 6.8 - ncurses Build and installation steps: runhaskell Setup.hs configure runhaskell Setup.hs build runhaskell Setup.hs install In order to generate the API documentation, you need haddock (http://www.haskell.org/haddock). The command is then: runhaskell Setup.hs haddock Using the hscurses library: --------------------------- Just add the flag `-package hscurses' to the compiler flags. At the moment, user documentation is only available through Haddock API documentation. Windows support: ---------------- Windows support relies on pdcurses (http://pdcurses.sourceforge.net/), which is already packaged for MinGW (http://sourceforge.net/projects/mingw/files/MinGW/PDCurses/PDCurses-3.4-1/) and can be installed with mingw-get. Thanks to José Romildo Malaquias (malaquias@gmail.com) for porting hscurses to the windows platform! Copyright: ---------- John Meacham , 2002-2004. Tuomo Valkonen , 2004. Don Stewart , 2004. Stefan Wehr , 2004-2011. History: -------- John Meacham started the binding for his chat client Ginsu (http://repetae.net/john/computer/ginsu/). Tuomo Valkonen integrated to code into Riot (http://modeemi.fi/~tuomov/riot/), with minor modifications. Don Stewart improved the code for the Yi editor (http://www.cse.unsw.edu.au/~dons/yi.html). Stefan Wehr turned the binding into a standalone library. He also added some basic widgets. hscurses-1.4.1.2/Setup.hs0000644000000000000000000000011112024055722013326 0ustar0000000000000000import Distribution.Simple main = defaultMainWithHooks autoconfUserHooks hscurses-1.4.1.2/TODO0000644000000000000000000000056112024055722012373 0ustar0000000000000000* Examples: - find proper connection between application-specific and generic widgets - `add' command for contact manager * Keys: - ENTER returns (KeyChar '\r'), but what is KeyEnter good for? (**) - TAB returns (KeyChar '\t') * Widgets: - export list for module (**) - autowrap for text widget (low priority) - border widget (**) - selection widget hscurses-1.4.1.2/cbits/0000755000000000000000000000000012024055722013005 5ustar0000000000000000hscurses-1.4.1.2/cbits/config.h.in0000644000000000000000000000527012024055722015034 0ustar0000000000000000/* cbits/config.h.in. Generated from configure.ac by autoheader. */ /* Define to 1 if you have the header file. */ #undef HAVE_CURSES_H /* Define to 1 if you have the header file. */ #undef HAVE_ICONV_H /* Define to 1 if you have the header file. */ #undef HAVE_INTTYPES_H /* Define to 1 if you have the header file. */ #undef HAVE_LANGINFO_H /* Define to 1 if you have the `curses' library (-lcurses). */ #undef HAVE_LIBCURSES /* Define to 1 if you have the `libiconv' function. */ #undef HAVE_LIBICONV /* Define to 1 if you have the `ncurses' library (-lncurses). */ #undef HAVE_LIBNCURSES /* Define to 1 if you have the `ncursesw' library (-lncursesw). */ #undef HAVE_LIBNCURSESW /* Define to 1 if you have the `pdcurses' library (-lpdcurses). */ #undef HAVE_LIBPDCURSES /* Define to 1 if you have the `pdcursesw' library (-lpdcursesw). */ #undef HAVE_LIBPDCURSESW /* Define to 1 if you have the header file. */ #undef HAVE_LIMITS_H /* Define to 1 if you have the header file. */ #undef HAVE_LOCALE_H /* Define to 1 if you have the header file. */ #undef HAVE_MEMORY_H /* Define to 1 if you have the header file. */ #undef HAVE_NCURSESW_NCURSES_H /* Define to 1 if you have the header file. */ #undef HAVE_NCURSES_H /* Define to 1 if you have the header file. */ #undef HAVE_SIGNAL_H /* Define to 1 if you have the header file. */ #undef HAVE_STDINT_H /* Define to 1 if you have the header file. */ #undef HAVE_STDLIB_H /* Define to 1 if you have the header file. */ #undef HAVE_STRINGS_H /* Define to 1 if you have the header file. */ #undef HAVE_STRING_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_STAT_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_TYPES_H /* Define to 1 if you have the header file. */ #undef HAVE_UNISTD_H /* Define to 1 if you have the header file. */ #undef HAVE_WCHAR_H /* Define to 1 if you need a 'lib' prefix to iconv functions */ #undef ICONV_LIB_PREFIX /* Define to 1 if you need to call doupdate after endwin */ #undef NCURSES_UPDATE_AFTER_END /* Define to the address where bug reports for this package should be sent. */ #undef PACKAGE_BUGREPORT /* Define to the full name of this package. */ #undef PACKAGE_NAME /* Define to the full name and version of this package. */ #undef PACKAGE_STRING /* Define to the one symbol short name of this package. */ #undef PACKAGE_TARNAME /* Define to the version of this package. */ #undef PACKAGE_VERSION /* Define to 1 if you have the ANSI C header files. */ #undef STDC_HEADERS hscurses-1.4.1.2/cbits/HSCurses.h0000644000000000000000000000143612024055722014661 0ustar0000000000000000#ifndef HSCURSES_H #define HSCURSES_H #ifndef GHC_CONFIG_INCLUDED #define GHC_CONFIG_INCLUDED #undef PACKAGE_NAME #undef PACKAGE_STRING #undef PACKAGE_TARNAME #undef PACKAGE_VERSION #include "ghcconfig.h" #endif #ifndef CONFIG_INCLUDED #define CONFIG_INCLUDED #include "config.h" #endif #if HAVE_NCURSESW_NCURSES_H #include #elif HAVE_NCURSES_H #include #else #include #endif #if defined(initscr) #undef initscr #endif #if defined(cbreak) #undef cbreak #endif #if defined(clrtoeol) #undef clrtoeol #endif #if defined(touchwin) #undef touchwin #endif #if defined(beep) #undef beep #endif #if defined(flash) #undef flash #endif #if defined(wattr_set) #undef wattr_set #endif #if defined(wattr_get) #undef wattr_get #endif #endif // HSCURSES_H hscurses-1.4.1.2/cbits/HSCursesUtils.c0000644000000000000000000000075312024055722015676 0ustar0000000000000000 #include "HSCursesUtils.h" /* * A non-macro version of getyx(3), to make writing a Haskell binding * easier. Called in UI/HSCurses/Curses.hsc */ void hscurses_nomacro_getyx(WINDOW *win, int *y, int *x) { getyx(win, *y, *x); } chtype hs_curses_color_pair(HsInt pair) { return COLOR_PAIR (pair); } HsInt hs_get_mb_cur_max() { return MB_CUR_MAX; } #if defined(HAVE_LIBPDCURSES) || defined (HAVE_LIBPDCURSESW) int hscurses_nomacro_getch(void) { return getch(); } #endif hscurses-1.4.1.2/cbits/HSCursesUtils.h0000644000000000000000000000062012024055722015674 0ustar0000000000000000#ifndef HSCURSESUTILS_H #define HSCURSESUTILS_H #include "HSCurses.h" #include "HsFFI.h" #include extern void hscurses_nomacro_getyx(WINDOW *win, int *y, int *x ); extern chtype hs_curses_color_pair(HsInt pair ); extern HsInt hs_get_mb_cur_max(); #if defined(HAVE_LIBPDCURSES) || defined (HAVE_LIBPDCURSESW) extern int hscurses_nomacro_getch(void); #endif #endif // HSCURSESUTILS_H hscurses-1.4.1.2/example/0000755000000000000000000000000012024055722013334 5ustar0000000000000000hscurses-1.4.1.2/example/cm.cabal0000644000000000000000000000062512024055722014722 0ustar0000000000000000Name: contact-manager Synopsis: Primitive addressbook Version: 0.1 License: GPL License-file: ../LICENSE Author: Stefan Wehr Build-Depends: base>3, hscurses >= 1.2, mtl, pretty Build-Type: Simple Executable: cm Main-Is: ContactManager.hs ghc-options: -funbox-strict-fields -threaded hscurses-1.4.1.2/example/ContactManager.hs0000644000000000000000000003637212024055722016571 0ustar0000000000000000-- Copyright (c) 2005-2011 Stefan Wehr (http://www.stefanwehr.de) -- -- Permission is hereby granted, free of charge, to any person obtaining a -- copy of this software and associated documentation files (the -- "Software"), to deal in the Software without restriction, including -- without limitation the rights to use, copy, modify, merge, publish, -- distribute, sublicense, and/or sell copies of the Software, and to -- permit persons to whom the Software is furnished to do so, subject to -- the following conditions: -- -- The above copyright notice and this permission notice shall be included -- in all copies or substantial portions of the Software. -- -- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -- OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -- IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -- CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, -- TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE -- SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -- Simple addressbook application to show the capabilities of the hscurses -- library, especially its widget set. module Main where {- TODO: * save * add -} import Control.Exception import Control.Monad.State import Data.List ( sort ) import System.Environment (getArgs, getProgName) import System.Exit (exitFailure) import Text.PrettyPrint.HughesPJ import UI.HSCurses.Logging import UI.HSCurses.Widgets import qualified UI.HSCurses.Curses as Curses import qualified UI.HSCurses.CursesHelper as CursesH type Name = String type Email = String type Address = String type ZIPCode = String type City = String type Province = String type Country = String type PhoneNumber = String data Contact = Contact { lastName :: Name , firstName :: Name , emailAddress :: Email , address :: Address , zipCode :: ZIPCode , city :: City , province :: Province , country :: Country , phoneNumber :: PhoneNumber } deriving (Show,Read,Eq,Ord) emptyContact = Contact { lastName = "" , firstName = "" , emailAddress = "" , address = "" , zipCode = "" , city = "" , province = "" , country = "" , phoneNumber = "" } pprContact c = pprLine (combine (lastName c) ", " (firstName c)) $ pprLine (address c) $ pprLine (combine (zipCode c) " " (city c)) $ pprLine (province c) $ pprLine (country c) $ pprLine (phoneNumber c) $ pprLine (emailAddress c) $ empty where pprLine :: String -> Doc -> Doc pprLine [] = (<>) empty pprLine s = ($$) (text s) combine [] _ s2 = s2 combine s1 _ [] = s1 combine s1 delim s2 = s1 ++ delim ++ s2 contactToLabelValueList :: Contact -> [(String, String)] contactToLabelValueList c = [ ("Last Name", lastName c) , ("First Name", firstName c) , ("Email", emailAddress c) , ("Address", address c) , ("ZIP Code", zipCode c) , ("City", city c) , ("State/Province", province c) , ("Country", country c) , ("Phone", phoneNumber c) ] readContacts :: FilePath -> IO [Contact] readContacts f = do s <- readFile f case reads s of [(contacts, [])] -> return (sort contacts) _ -> error ("corrupt contact file: " ++ f) writeContacts :: FilePath -> [Contact] -> IO () writeContacts f contacts = writeFile f (show contacts) sampleContacts = [ emptyContact { lastName = "Wehr" , firstName = "Stefan" , emailAddress = "mail AT stefanwehr DOT de" , address = "28 Loch Maree St" , zipCode = "2032" , city = "Kingsford" , province = "NSW" , country = "Australia" } , emptyContact { lastName = "Thorpe" , firstName = "Ian" , emailAddress = "ian@aol7.com.au" , city = "Perth" , country = "Australia" } , emptyContact { lastName = "Gates" , firstName = "Bill" , emailAddress = "billy@microsoft.com" } , emptyContact { lastName = "Stewart" , firstName = "Don" , address = "CSE, UNSW, 501-16, k17 building" , city = "Sydney" , country = "Australia" } ] title = "contact-manager" help = "q:quit, d:delete, a:add" data CMState = CMState { cm_styles :: [CursesH.CursesStyle] , cm_contacts :: [Contact] } type CM = StateT CMState IO runCM :: [CursesH.CursesStyle] -> [Contact] -> CM a -> IO a runCM stys contacts cm = evalStateT cm (CMState { cm_styles = stys , cm_contacts = contacts }) nthStyle :: Int -> CM CursesH.CursesStyle nthStyle n = do cs <- gets cm_styles return $ cs !! n getSize = liftIO $ Curses.scrSize styles = [ CursesH.defaultStyle , CursesH.AttributeStyle [CursesH.Bold] CursesH.GreenF CursesH.DarkBlueB ] defStyle = nthStyle 0 lineStyle = nthStyle 1 lineDrawingStyle = do sty <- lineStyle return $ mkDrawingStyle sty lineOptions = do sz <- getSize ds <- lineDrawingStyle return $ TWOptions { twopt_size = TWSizeFixed (1, getWidth sz), twopt_style = ds, twopt_halign = AlignLeft } type ToplineWidget = TextWidget type MidlineWidget = TextWidget type BotlineWidget = TextWidget type MsglineWidget = TableWidget type ContactListWidget = TableWidget type ContactDetailsWidget = TextWidget type ContactEditWidget = TableWidget mkToplineWidget = do opts <- lineOptions return $ newTextWidget (opts { twopt_halign = AlignCenter }) title mkMidlineWidget :: ContactListWidget -> CM MidlineWidget mkMidlineWidget listWidget = do opts <- lineOptions contacts <- gets cm_contacts let s = case tbw_pos listWidget of Nothing -> show (length contacts) Just (row, _) -> show (1+row) ++ "/" ++ show (length contacts) return $ newTextWidget (opts { twopt_halign = AlignRight }) s mkBotlineWidget = do opts <- lineOptions return $ newTextWidget opts help -- We need to insert a dummy widget at the lower-right corner of the window, -- i.e. at the lower-right corner of the message line. Otherwise, an -- error occurs because drawing a character to this position moves the -- cursor to the next line, which doesn't exist. mkMsglineWidget = do sz <- getSize let width = getWidth sz opts = TWOptions { twopt_size = TWSizeFixed (1, width - 1), twopt_style = defaultDrawingStyle, twopt_halign = AlignLeft } tw = newTextWidget opts "msgline" row = [TableCell tw, TableCell $ EmptyWidget (1,1)] tabOpts = defaultTBWOptions { tbwopt_minSize = (1, width) } return $ newTableWidget tabOpts [row] nlines = 4 contactListHeight (h, _) = (h - nlines) `div` 2 contactDetailsHeight (h, _) = let n = h - nlines in n `div` 2 + (n `mod` 2) contactListOptions = do sz <- getSize return $ TBWOptions { tbwopt_fillCol = Nothing, tbwopt_fillRow = None, tbwopt_activeCols = [0], tbwopt_minSize = (contactListHeight sz, getWidth sz) } contactDetailsOptions = do sz <- getSize return $ TWOptions { twopt_size = TWSizeFixed (contactDetailsHeight sz, getWidth sz), twopt_style = defaultDrawingStyle, twopt_halign = AlignLeft } mkContactListWidget :: CM ContactListWidget mkContactListWidget = do contacts <- gets cm_contacts sz <- getSize let lines = alignRows (map contactLine contacts) ' ' " " rows = map (contactRow $ getWidth sz) lines opts <- contactListOptions return $ newTableWidget opts rows where contactLine c = [lastName c, firstName c, emailAddress c] contactRow w s = [TableCell $ newTextWidget (defaultTWOptions { twopt_size = TWSizeFixed (1, w) }) s] lastRow = [TableCell (EmptyWidget (0,0))] mkContactDetailsWidget :: ContactListWidget -> CM ContactDetailsWidget mkContactDetailsWidget listWidget = do contacts <- gets cm_contacts let contact = case tbw_pos listWidget of Nothing -> "" Just (row, _) -> let c = contacts !! row in show $ pprContact c opts <- contactDetailsOptions return $ newTextWidget opts contact mkContactEditWidget :: Contact -> CM ContactEditWidget mkContactEditWidget contact = let l = contactToLabelValueList contact rows = map mkRow l in do sz <- getSize let opts = TBWOptions { tbwopt_fillCol = Just 1, tbwopt_fillRow = None, tbwopt_activeCols = [1], tbwopt_minSize = (getHeight sz - 3, getWidth sz) } return $ newTableWidget opts rows where mkRow (label, value) = let labelW = newTextWidget defaultTWOptions label valueW = newEditWidget defaultEWOptions value in [TableCell labelW, ActiveTableCell valueW] mkMainEditWidget contact = do tlw <- mkToplineWidget blw <- mkBotlineWidget msglw <- mkMsglineWidget ew <- mkContactEditWidget contact return $ MainEditWidget tlw blw msglw ew data MainEditWidget = MainEditWidget { toplineEditWidget :: ToplineWidget , botlineEditWidget :: BotlineWidget , msglineEditWidget :: MsglineWidget , contactEditWidget :: ContactEditWidget } mkMainWidget = do tlw <- mkToplineWidget clw <- mkContactListWidget mlw <- mkMidlineWidget clw cdw <- mkContactDetailsWidget clw blw <- mkBotlineWidget msglw <- mkMsglineWidget return $ MainWidget tlw mlw blw msglw clw cdw instance Widget MainEditWidget where draw pos sz hint w = draw pos sz hint (mkRealMainEditWidget (Just sz) w) minSize w = minSize (mkRealMainEditWidget Nothing w) mkRealMainEditWidget :: (Maybe Size) -> MainEditWidget -> TableWidget mkRealMainEditWidget msz w = let cells = [ TableCell $ toplineEditWidget w , TableCell $ contactEditWidget w , TableCell $ botlineEditWidget w , TableCell $ msglineEditWidget w ] rows = map singletonRow cells opts = case msz of Nothing -> defaultTBWOptions Just sz -> defaultTBWOptions { tbwopt_minSize = sz } in newTableWidget opts rows data MainWidget = MainWidget { toplineWidget :: ToplineWidget , midlineWidget :: MidlineWidget , botlineWidget :: BotlineWidget , msglineWidget :: MsglineWidget , contactListWidget :: ContactListWidget , contactDetailsWidget :: ContactDetailsWidget } instance Widget MainWidget where draw pos sz hint w = draw pos sz hint (mkRealMainWidget (Just sz) w) minSize w = minSize (mkRealMainWidget Nothing w) mkRealMainWidget msz w = let cells = [ TableCell $ toplineWidget w , TableCell $ contactListWidget w , TableCell $ midlineWidget w , TableCell $ contactDetailsWidget w , TableCell $ botlineWidget w , TableCell $ msglineWidget w ] rows = map singletonRow cells opts = case msz of Nothing -> defaultTBWOptions Just sz -> defaultTBWOptions { tbwopt_minSize = sz } in newTableWidget opts rows updateStateDependentWidgets :: MainWidget -> ContactListWidget -> CM MainWidget updateStateDependentWidgets w listWidget = do detailsWidget <- mkContactDetailsWidget listWidget midlineWidget <- mkMidlineWidget listWidget return $ w { contactListWidget = listWidget , contactDetailsWidget = detailsWidget , midlineWidget = midlineWidget } move :: Direction -> MainWidget -> CM MainWidget move dir w = do sz <- getSize let listWidget = tableWidgetMove dir sz (contactListWidget w) updateStateDependentWidgets w listWidget delete w = let lw = contactListWidget w in case tbw_pos lw of Nothing -> return w Just (row,_) -> let lw' = tableWidgetDeleteRow row lw in do modify (\s -> s { cm_contacts = deleteAt row (cm_contacts s) }) updateStateDependentWidgets w lw' {- editEventloop w ewm = do k <- CursesH.getKey (resize mkMainEditWidget) case k of Curses.KeyChar 'q' -> return w Curses.KeyChar '\r' -> do debug "editing..." sz <- getSize let ewm' = mkRealMainEditWidget (Just sz) ewm (epos, esz) = getCellInfo (0,0) sz ewm' (1,0) ew = contactEditWidget ewm (ew', res) <- tableWidgetActivateCurrent (redraw ewm) epos esz DHFocus ew editEventloop w ewm _ -> editEventloop w ewm -} edit w = let lw = contactListWidget w in case tbw_pos lw of Nothing -> return w Just (row,_) -> do contacts <- gets cm_contacts let c = contacts !! row ew <- mkMainEditWidget c redraw ew return w --editEventloop w ew resize :: Widget w => CM w -> CM () resize f = do liftIO $ do Curses.endWin Curses.resetParams Curses.cursSet Curses.CursorInvisible Curses.refresh w <- f redraw w redraw :: Widget w => w -> CM () redraw w = do sz <- getSize liftIO $ draw (0, 0) sz DHNormal w liftIO $ Curses.refresh eventloop w = do k <- CursesH.getKey (resize mkMainWidget) case k of Curses.KeyChar 'q' -> return () Curses.KeyChar 'd' -> process $ delete w Curses.KeyChar 'e' -> process $ edit w Curses.KeyUp -> process $ move DirUp w Curses.KeyDown -> process $ move DirDown w _ -> eventloop w where process f = do w' <- f redraw w' eventloop w' cmMain :: CM () cmMain = do w <- mkMainWidget redraw w eventloop w main :: IO () main = do args <- getArgs contacts <- if length args /= 1 then do p <- getProgName putStrLn ("Usage: " ++ p ++ " contact-file") exitFailure else readContacts (args!!0) runCurses contacts `finally` CursesH.end where runCurses contacts = do CursesH.start cstyles <- CursesH.convertStyles styles Curses.cursSet Curses.CursorInvisible runCM cstyles contacts cmMain hscurses-1.4.1.2/example/contacts0000644000000000000000000000141312024055722015074 0ustar0000000000000000[Contact {lastName = "Wehr", firstName = "Stefan", emailAddress = "mail AT stefanwehr DOT de", address = "28 Loch Maree St", zipCode = "2032", city = "Kingsford", province = "NSW", country = "Australia", phoneNumber = ""},Contact {lastName = "Thorpe", firstName = "Ian", emailAddress = "ian@aol7.com.au", address = "", zipCode = "", city = "Perth", province = "", country = "Australia", phoneNumber = ""},Contact {lastName = "Gates", firstName = "Bill", emailAddress = "billy@microsoft.com", address = "", zipCode = "", city = "", province = "", country = "", phoneNumber = ""},Contact {lastName = "Stewart", firstName = "Don", emailAddress = "", address = "CSE, UNSW, 501-16, k17 building", zipCode = "", city = "Sydney", province = "", country = "Australia", phoneNumber = ""}]hscurses-1.4.1.2/example/contacts20000644000000000000000000000141312024055722015156 0ustar0000000000000000[Contact {lastName = "Wehr", firstName = "Stefan", emailAddress = "mail AT stefanwehr DOT de", address = "28 Loch Maree St", zipCode = "2032", city = "Kingsford", province = "NSW", country = "Australia", phoneNumber = ""},Contact {lastName = "Thorpe", firstName = "Ian", emailAddress = "ian@aol7.com.au", address = "", zipCode = "", city = "Perth", province = "", country = "Australia", phoneNumber = ""},Contact {lastName = "Gates", firstName = "Bill", emailAddress = "billy@microsoft.com", address = "", zipCode = "", city = "", province = "", country = "", phoneNumber = ""},Contact {lastName = "Stewart", firstName = "Don", emailAddress = "", address = "CSE, UNSW, 501-16, k17 building", zipCode = "", city = "Sydney", province = "", country = "Australia", phoneNumber = ""}]hscurses-1.4.1.2/example/Setup.hs0000644000000000000000000000014112024055722014764 0ustar0000000000000000#!/usr/bin/env runhaskell import Distribution.Simple main = defaultMainWithHooks simpleUserHooks hscurses-1.4.1.2/UI/0000755000000000000000000000000012024055722012216 5ustar0000000000000000hscurses-1.4.1.2/UI/HSCurses/0000755000000000000000000000000012024055722013715 5ustar0000000000000000hscurses-1.4.1.2/UI/HSCurses/Curses.hsc0000644000000000000000000013722412024055722015671 0ustar0000000000000000{-# LANGUAGE ForeignFunctionInterface, GeneralizedNewtypeDeriving #-} -- glaexts needed for newtype deriving -- Copyright (c) 2002-2004 John Meacham (john at repetae dot net) -- Copyright (c) 2004 Don Stewart - http://www.cse.unsw.edu.au/~dons -- Copyright (c) 2005-2011 Stefan Wehr - http://www.stefanwehr.de -- -- This library is free software; you can redistribute it and/or -- modify it under the terms of the GNU Lesser General Public -- License as published by the Free Software Foundation; either -- version 2.1 of the License, or (at your option) any later version. -- -- This library 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 -- Lesser General Public License for more details. -- -- You should have received a copy of the GNU Lesser General Public -- License along with this library; if not, write to the Free Software -- Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA -- -- | Binding to the [wn]curses library. From the ncurses man page: -- -- > The curses library routines give the user a terminal-inde- -- > pendent method of updating character screens with reason- -- > able optimization. -- -- Sections of the quoted documentation are from the OpenBSD man pages, which -- are distributed under a BSD license. -- -- A useful reference is: -- /Writing Programs with NCURSES/, by Eric S. Raymond and Zeyd -- M. Ben-Halim, -- -- N.B attrs don't work with Irix curses.h. This should be fixed. -- module UI.HSCurses.Curses ( -- * Basic Functions stdScr, -- :: Window initScr, -- :: IO Window initCurses, -- :: IO () resetParams, endWin, -- :: IO () scrSize, -- :: IO (Int, Int) -- * Windows and Pads Window, -- data Window deriving Eq Border(..), -- data Border touchWin, newPad, pRefresh, delWin, newWin, wRefresh, wBorder, defaultBorder, -- * Refresh Routines refresh, -- :: IO () update, resizeTerminal, timeout, -- :: Int -> IO () noqiflush, -- :: IO () -- * Navigation move, -- :: Int -> Int -> IO () getYX, -- * Input getCh, getch, decodeKey, ungetCh, keyResizeCode, -- * Input Options cBreak, -- :: Bool -> IO () raw, -- :: Bool -> IO () echo, -- :: Bool -> IO () intrFlush, -- :: Bool -> IO () keypad, -- :: Window -> Bool -> IO () noDelay, -- :: Window -> Bool -> IO () -- * Output wAddStr, -- :: Window -> String -> IO () addLn, -- :: IO () mvWAddStr, mvAddCh, -- :: Int -> Int -> ChType -> IO () wMove, bkgrndSet, -- :: Attr -> Pair -> IO () erase, -- :: IO () wclear, -- :: Window -> IO () clrToEol, -- :: IO () wClrToEol, beep, waddch, waddchnstr, -- :: Window -> CString -> CInt -> IO CInt -- * Output Options clearOk, leaveOk, nl, -- :: Bool -> IO () -- * Cursor Routines CursorVisibility(..), cursSet, -- * Color Support hasColors, -- :: IO Bool startColor, -- :: IO () useDefaultColors, -- :: IO () Pair(..), -- newtype Pair = Pair Int deriving (Eq, Ord, Ix) colorPairs, -- :: IO Int Color(..), -- newtype Color = Color Int deriving (Eq, Ord, Ix) colors, -- :: IO Int color, -- :: String -> Maybe Color -- black, red, green, yellow, blue, magenta, cyan, white, -- :: Color initPair, -- :: Pair -> Color -> Color -> IO () pairContent, -- :: Pair -> IO (Color, Color) canChangeColor, -- :: IO Bool initColor, -- :: Color -> (Int, Int, Int) -> IO () colorContent, -- :: Color -> IO (Int, Int, Int) defaultBackground, defaultForeground, -- * Attributes attrPlus, Attr, attr0, -- :: Attr isAltCharset, isBlink, isBold, isDim, isHorizontal, isInvis, isLeft, isLow, isProtect, isReverse, isRight, isStandout, isTop, isUnderline, isVertical, -- :: Attr -> Bool setAltCharset, setBlink, setBold, setDim, setHorizontal, setInvis, setLeft, setLow, setProtect, setReverse, setRight, setStandout, setTop, setUnderline, setVertical, -- :: Attr -> Bool -> Attr attrSet, -- :: Attr -> Pair -> IO () attrOn, attrOff, standout,standend, attrDim, attrBold, attrDimOn, attrDimOff, attrBoldOn, attrBoldOff, wAttrOn, wAttrOff, wAttrSet, wAttrGet, -- * Mouse Routines withMouseEventMask, ButtonEvent(..), MouseEvent(..), -- * Keys Key(..), cERR, cKEY_UP, cKEY_DOWN, cKEY_LEFT, cKEY_RIGHT, cTRUE, -- cACS_BLOCK, -- * Lines vline, ulCorner, llCorner, urCorner, lrCorner, rTee, lTee, bTee, tTee, hLine, vLine, plus, s1, s9, diamond, ckBoard, degree, plMinus, bullet, lArrow, rArrow, dArrow, uArrow, board, lantern, block, s3, s7, lEqual, gEqual, pi, nEqual, sterling, -- * Signals cursesSigWinch, -- * Misc cursesTest, throwIfErr, throwIfErr_, errI, -- :: IO CInt -> IO () flushinp, recognize, ChType, NBool ) where #include #if HAVE_SIGNAL_H # include #endif import UI.HSCurses.CWString ( withLCStringLen ) import UI.HSCurses.Logging import Prelude hiding ( pi ) import Data.Char import Data.List import Data.Ix ( Ix ) import System.IO.Unsafe ( unsafePerformIO ) import Control.Monad ( when, liftM, void ) import Control.Monad.Trans import Control.Concurrent import Foreign hiding ( unsafePerformIO, void ) import Foreign.C.String import Foreign.C.Types import Foreign.C.Error #ifndef mingw32_HOST_OS import System.Posix.Signals #endif #if __GLASGOW_HASKELL__ < 603 import Data.Bits #endif ------------------------------------------------------------------------ -- -- | @initCurses fn@ does all initialization necessary for a Curses -- application. -- initCurses :: IO () initCurses = do initScr b <- hasColors when b $ startColor >> useDefaultColors resetParams :: IO () resetParams = do raw True -- raw mode please echo False nl False intrFlush True leaveOk False keypad stdScr True #ifdef NCURSES_EXT_FUNCS defineKey (#const KEY_UP) "\x1b[1;2A" defineKey (#const KEY_DOWN) "\x1b[1;2B" defineKey (#const KEY_SLEFT) "\x1b[1;2D" defineKey (#const KEY_SRIGHT) "\x1b[1;2C" defineKey (#const KEY_B2) "\x1b[E" -- xterm seems to emit B2, not BEG defineKey (#const KEY_END) "\x1b[F" defineKey (#const KEY_END) "\x1b[4~" defineKey (#const KEY_HOME) "\x1b[H" defineKey (#const KEY_HOME) "\x1b[1~" #endif ------------------------------------------------------------------------ fi :: (Integral a, Num b) => a -> b fi = fromIntegral throwIfErr :: (Eq a, Show a, Num a) => String -> IO a -> IO a --throwIfErr name act = do -- res <- act -- if res == (cERR) -- then ioError (userError ("Curses: "++name++" failed")) -- else return res throwIfErr s = throwIf (== (#const ERR)) (\a -> "Curses[" ++ show a ++ "]:" ++ s) throwIfErr_ :: (Eq a, Show a, Num a) => String -> IO a -> IO () throwIfErr_ name act = void $ throwIfErr name act errI :: IO CInt -> IO () errI f = do r <- f if r == cERR then do _ <- endwin error "curses returned an error" else return () ------------------------------------------------------------------------ type WindowTag = () type Window = Ptr WindowTag type ChType = #type chtype type NBool = #type bool -- -- | The standard screen -- stdScr :: Window stdScr = unsafePerformIO (peek stdscr) foreign import ccall "static HSCurses.h &stdscr" stdscr :: Ptr Window -- -- | initscr is normally the first curses routine to call when -- initializing a program. curs_initscr(3): -- -- > To initialize the routines, the routine initscr or newterm -- > must be called before any of the other routines that deal -- > with windows and screens are used. -- -- > The initscr code determines the terminal type and initial- -- > izes all curses data structures. initscr also causes the -- > first call to refresh to clear the screen. If errors -- > occur, initscr writes an appropriate error message to -- > standard error and exits; otherwise, a pointer is returned -- > to stdscr. -- initScr :: IO Window initScr = throwIfNull "initscr" initscr foreign import ccall unsafe "HSCurses.h initscr" initscr :: IO Window -- -- | > The cbreak routine -- > disables line buffering and erase/kill character-process- -- > ing (interrupt and flow control characters are unaf- -- > fected), making characters typed by the user immediately -- > available to the program. The nocbreak routine returns -- > the terminal to normal (cooked) mode. -- cBreak :: Bool -> IO () cBreak True = throwIfErr_ "cbreak" cbreak cBreak False = throwIfErr_ "nocbreak" nocbreak foreign import ccall unsafe "HSCurses.h cbreak" cbreak :: IO CInt foreign import ccall unsafe "HSCurses.h nocbreak" nocbreak :: IO CInt -- -- |> The raw and noraw routines place the terminal into or out -- > of raw mode. Raw mode is similar to cbreak mode, in that -- > characters typed are immediately passed through to the -- > user program. The differences are that in raw mode, the -- > interrupt, quit, suspend, and flow control characters are -- > all passed through uninterpreted, instead of generating a -- > signal. The behavior of the BREAK key depends on other -- > bits in the tty driver that are not set by curses. -- raw :: Bool -> IO () raw False = throwIfErr_ "noraw" noraw raw True = throwIfErr_ "raw" raw_c foreign import ccall unsafe "HSCurses.h noraw" noraw :: IO CInt foreign import ccall unsafe "HSCurses.h raw" raw_c :: IO CInt -- -- |> The echo and noecho routines control whether characters -- > typed by the user are echoed by getch as they are typed. -- > Echoing by the tty driver is always disabled, but ini- -- > tially getch is in echo mode, so characters typed are -- > echoed. Authors of most interactive programs prefer to do -- > their own echoing in a controlled area of the screen, or -- > not to echo at all, so they disable echoing by calling -- > noecho. [See curs_getch(3) for a discussion of how these -- > routines interact with cbreak and nocbreak.] -- > -- echo :: Bool -> IO () echo False = throwIfErr_ "noecho" noecho echo True = throwIfErr_ "echo" echo_c foreign import ccall unsafe "HSCurses.h noecho" noecho :: IO CInt foreign import ccall unsafe "HSCurses.h echo" echo_c :: IO CInt -- -- |> The nl and nonl routines control whether the underlying -- > display device translates the return key into newline on -- > input, and whether it translates newline into return and -- > line-feed on output (in either case, the call addch('\n') -- > does the equivalent of return and line feed on the virtual -- > screen). Initially, these translations do occur. If you -- > disable them using nonl, curses will be able to make bet- -- > ter use of the line-feed capability, resulting in faster -- > cursor motion. Also, curses will then be able to detect -- > the return key. -- > nl :: Bool -> IO () nl True = throwIfErr_ "nl" nl_c nl False = throwIfErr_ "nonl" nonl foreign import ccall unsafe "HSCurses.h nl" nl_c :: IO CInt foreign import ccall unsafe "HSCurses.h nonl" nonl :: IO CInt -- |> If the intrflush option is enabled, (bf is TRUE), when an -- > interrupt key is pressed on the keyboard (interrupt, -- > break, quit) all output in the tty driver queue will be -- > flushed, giving the effect of faster response to the -- > interrupt, but causing curses to have the wrong idea of -- > what is on the screen. Disabling (bf is FALSE), the -- > option prevents the flush. -- > intrFlush :: Bool -> IO () intrFlush bf = throwIfErr_ "intrflush" $ intrflush stdScr (if bf then 1 else 0) foreign import ccall unsafe "HSCurses.h intrflush" intrflush :: Window -> (#type bool) -> IO CInt -- -- | Enable the keypad of the user's terminal. -- keypad :: Window -> Bool -> IO () keypad win bf = throwIfErr_ "keypad" $ keypad_c win (if bf then 1 else 0) foreign import ccall unsafe "HSCurses.h keypad" keypad_c :: Window -> (#type bool) -> IO CInt noDelay :: Window -> Bool -> IO () noDelay win bf = throwIfErr_ "nodelay" $ nodelay win (if bf then 1 else 0) foreign import ccall unsafe "HSCurses.h nodelay" nodelay :: Window -> (#type bool) -> IO CInt -- -- | Normally, the hardware cursor is left at the location of -- the window cursor being refreshed. The leaveok option -- allows the cursor to be left wherever the update happens -- to leave it. It is useful for applications where the cur- -- sor is not used, since it reduces the need for cursor -- motions. If possible, the cursor is made invisible when -- this option is enabled. -- leaveOk :: Bool -> IO CInt leaveOk True = leaveok_c stdScr 1 leaveOk False = leaveok_c stdScr 0 foreign import ccall unsafe "HSCurses.h leaveok" leaveok_c :: Window -> (#type bool) -> IO CInt clearOk :: Bool -> IO CInt clearOk True = clearok_c stdScr 1 clearOk False = clearok_c stdScr 0 foreign import ccall unsafe "HSCurses.h clearok" clearok_c :: Window -> (#type bool) -> IO CInt ------------------------------------------------------------------------ foreign import ccall unsafe "HSCurses.h use_default_colors" useDefaultColors :: IO () defaultBackground, defaultForeground :: Color defaultBackground = Color (-1) defaultForeground = Color (-1) ------------------------------------------------------------------------ #ifdef NCURSES_EXT_FUNCS defineKey :: CInt -> String -> IO () defineKey k s = withCString s (\s' -> define_key s' k) >> return () foreign import ccall unsafe "HSCurses.h define_key" define_key :: Ptr CChar -> CInt -> IO () #endif -- -- | > The program must call endwin for each terminal being used before -- > exiting from curses. -- endWin :: IO () endWin = throwIfErr_ "endwin" endwin foreign import ccall unsafe "HSCurses.h endwin" endwin :: IO CInt ------------------------------------------------------------------------ -- -- | get the dimensions of the screen -- scrSize :: IO (Int, Int) scrSize = do lnes <- peek linesPtr cols <- peek colsPtr return (fromIntegral lnes, fromIntegral cols) foreign import ccall "HSCurses.h &LINES" linesPtr :: Ptr CInt foreign import ccall "HSCurses.h &COLS" colsPtr :: Ptr CInt -- -- | refresh curses windows and lines. curs_refresh(3) -- refresh :: IO () refresh = throwIfErr_ "refresh" refresh_c foreign import ccall unsafe "HSCurses.h refresh" refresh_c :: IO CInt -- -- | wRefresh refreshes the specified window, copying the data -- | from the virtual screen to the physical screen. -- wRefresh :: Window -> IO () wRefresh w = throwIfErr_ "wrefresh" $ wrefresh_c w foreign import ccall unsafe "HSCurses.h wrefresh" wrefresh_c :: Window -> IO CInt -- -- | Do an actual update. Used after endWin on linux to restore the terminal -- update :: IO () update = throwIfErr_ "update" update_c foreign import ccall unsafe "HSCurses.h doupdate" update_c :: IO CInt foreign import ccall unsafe "static curses.h timeout" timeout_c :: CInt -> IO () -- | Set a delay in milliseconds. timeout :: Int -> IO () timeout = timeout_c . fromIntegral ------------------------------------------------------------------------ hasColors :: IO Bool hasColors = liftM (/= 0) has_colors foreign import ccall unsafe "HSCurses.h has_colors" has_colors :: IO (#type bool) -- -- | Initialise the color settings, also sets the screen to the -- default colors (white on black) -- startColor :: IO () startColor = throwIfErr_ "start_color" start_color foreign import ccall unsafe start_color :: IO CInt newtype Pair = Pair Int deriving (Eq, Ord, Ix, Show) -- -- | colorPairs defines the maximum number of color-pairs the terminal -- can support). -- colorPairs :: IO Int colorPairs = fmap fromIntegral $ peek colorPairsPtr foreign import ccall "HSCurses.h &COLOR_PAIRS" colorPairsPtr :: Ptr CInt newtype Color = Color Int deriving (Eq, Ord, Ix) colors :: IO Int colors = liftM fromIntegral $ peek colorsPtr foreign import ccall "HSCurses.h &COLORS" colorsPtr :: Ptr CInt --black, red, green, yellow, blue, magenta, cyan, white :: Color color :: String -> Maybe Color color "default" = Just $ Color (-1) color "black" = Just $ Color (#const COLOR_BLACK) color "red" = Just $ Color (#const COLOR_RED) color "green" = Just $ Color (#const COLOR_GREEN) color "yellow" = Just $ Color (#const COLOR_YELLOW) color "blue" = Just $ Color (#const COLOR_BLUE) color "magenta" = Just $ Color (#const COLOR_MAGENTA) color "cyan" = Just $ Color (#const COLOR_CYAN) color "white" = Just $ Color (#const COLOR_WHITE) color _ = Nothing -- -- | curses support color attributes on terminals with that -- capability. To use these routines start_color must be -- called, usually right after initscr. Colors are always -- used in pairs (referred to as color-pairs). A color-pair -- consists of a foreground color (for characters) and a -- background color (for the blank field on which the charac- -- ters are displayed). A programmer initializes a color- -- pair with the routine init_pair. After it has been ini- -- tialized, COLOR_PAIR(n), a macro defined in , -- can be used as a new video attribute. -- -- If a terminal is capable of redefining colors, the pro- -- grammer can use the routine init_color to change the defi- -- nition of a color. -- -- The init_pair routine changes the definition of a color- -- pair. It takes three arguments: the number of the color- -- pair to be changed, the foreground color number, and the -- background color number. For portable applications: -- -- - The value of the first argument must be between 1 and -- COLOR_PAIRS-1. -- -- - The value of the second and third arguments must be -- between 0 and COLORS (the 0 color pair is wired to -- white on black and cannot be changed). -- -- initPair :: Pair -> Color -> Color -> IO () initPair (Pair p) (Color f) (Color b) = throwIfErr_ "init_pair" $ init_pair (fromIntegral p) (fromIntegral f) (fromIntegral b) foreign import ccall unsafe init_pair :: CShort -> CShort -> CShort -> IO CInt pairContent :: Pair -> IO (Color, Color) pairContent (Pair p) = alloca $ \fPtr -> alloca $ \bPtr -> do throwIfErr "pair_content" $ pair_content (fromIntegral p) fPtr bPtr f <- peek fPtr b <- peek bPtr return (Color (fromIntegral f), Color (fromIntegral b)) foreign import ccall unsafe pair_content :: CShort -> Ptr CShort -> Ptr CShort -> IO CInt canChangeColor :: IO Bool canChangeColor = liftM (/= 0) can_change_color foreign import ccall unsafe can_change_color :: IO (#type bool) initColor :: Color -> (Int, Int, Int) -> IO () initColor (Color c) (r, g, b) = throwIfErr_ "init_color" $ init_color (fromIntegral c) (fromIntegral r) (fromIntegral g) (fromIntegral b) foreign import ccall unsafe init_color :: CShort -> CShort -> CShort -> CShort -> IO CInt colorContent :: Color -> IO (Int, Int, Int) colorContent (Color c) = alloca $ \rPtr -> alloca $ \gPtr -> alloca $ \bPtr -> do throwIfErr "color_content" $ color_content (fromIntegral c) rPtr gPtr bPtr r <- peek rPtr g <- peek gPtr b <- peek bPtr return (fromIntegral r, fromIntegral g, fromIntegral b) foreign import ccall unsafe color_content :: CShort -> Ptr CShort -> Ptr CShort -> Ptr CShort -> IO CInt foreign import ccall unsafe "HSCurses.h hs_curses_color_pair" colorPair :: Pair -> ChType ------------- -- Attributes ------------- foreign import ccall unsafe "HSCurses.h attr_set" attr_set :: Attr -> CShort -> Ptr a -> IO Int -- foreign import ccall unsafe "HSCurses.h attr_get" :: Attr -> CShort -> Ptr a -> IO Int foreign import ccall unsafe "HSCurses.h wattr_set" wattr_set :: Window -> Attr -> CInt -> Ptr a -> IO CInt foreign import ccall unsafe "HSCurses.h wattr_get" wattr_get :: Window -> Ptr Attr -> Ptr CShort -> Ptr a -> IO CInt foreign import ccall "HSCurses.h attr_on" attr_on :: (#type attr_t) -> Ptr a -> IO Int foreign import ccall "HSCurses.h attr_off" attr_off :: (#type attr_t) -> Ptr a -> IO Int foreign import ccall "HSCurses.h attron" attron :: Int -> IO Int foreign import ccall "HSCurses.h attroff" attroff :: Int -> IO Int foreign import ccall unsafe "HSCurses.h wattron" wattron :: Window -> CInt -> IO CInt foreign import ccall unsafe "HSCurses.h wattroff" wattroff :: Window -> CInt -> IO CInt foreign import ccall standout :: IO Int foreign import ccall standend :: IO Int -- -- | -- wAttrSet :: Window -> (Attr,Pair) -> IO () wAttrSet w (a,(Pair p)) = throwIfErr_ "wattr_set" $ wattr_set w a (fromIntegral p) nullPtr -- -- | manipulate the current attributes of the named window. see curs_attr(3) -- wAttrGet :: Window -> IO (Attr,Pair) wAttrGet w = alloca $ \pa -> alloca $ \pp -> do throwIfErr_ "wattr_get" $ wattr_get w pa pp nullPtr a <- peek pa p <- peek pp return (a,Pair $ fromIntegral p) newtype Attr = Attr (#type attr_t) deriving (Eq,Storable,Bits, Num, Show) -- -- | Normal display (no highlight) -- attr0 :: Attr #ifdef WA_NORMAL attr0 = Attr (#const WA_NORMAL) #else attr0 = Attr (#const A_NORMAL) #endif isAltCharset, isBlink, isBold, isDim, isHorizontal, isInvis, isLeft, isLow, isProtect, isReverse, isRight, isStandout, isTop, isUnderline, isVertical :: Attr -> Bool isAltCharset = isAttr (#const WA_ALTCHARSET) isBlink = isAttr (#const WA_BLINK) isBold = isAttr (#const WA_BOLD) isDim = isAttr (#const WA_DIM) isHorizontal = isAttr (#const WA_HORIZONTAL) isInvis = isAttr (#const WA_INVIS) isLeft = isAttr (#const WA_LEFT) isLow = isAttr (#const WA_LOW) isProtect = isAttr (#const WA_PROTECT) isReverse = isAttr (#const WA_REVERSE) isRight = isAttr (#const WA_RIGHT) isStandout = isAttr (#const WA_STANDOUT) isTop = isAttr (#const WA_TOP) isUnderline = isAttr (#const WA_UNDERLINE) isVertical = isAttr (#const WA_VERTICAL) isAttr :: (#type attr_t) -> Attr -> Bool isAttr b (Attr a) = a .&. b /= 0 -- -- | Setting attributes -- setAltCharset, setBlink, setBold, setDim, setHorizontal, setInvis, setLeft, setLow, setProtect, setReverse, setRight, setStandout, setTop, setUnderline, setVertical :: Attr -> Bool -> Attr setAltCharset = setAttr (#const WA_ALTCHARSET) setBlink = setAttr (#const WA_BLINK) setBold = setAttr (#const WA_BOLD) setDim = setAttr (#const WA_DIM) setHorizontal = setAttr (#const WA_HORIZONTAL) setInvis = setAttr (#const WA_INVIS) setLeft = setAttr (#const WA_LEFT) setLow = setAttr (#const WA_LOW) setProtect = setAttr (#const WA_PROTECT) setReverse = setAttr (#const WA_REVERSE) setRight = setAttr (#const WA_RIGHT) setStandout = setAttr (#const WA_STANDOUT) setTop = setAttr (#const WA_TOP) setUnderline = setAttr (#const WA_UNDERLINE) setVertical = setAttr (#const WA_VERTICAL) setAttr :: (#type attr_t) -> Attr -> Bool -> Attr setAttr b (Attr a) False = Attr (a .&. complement b) setAttr b (Attr a) True = Attr (a .|. b) attrPlus :: Attr -> Attr -> Attr attrPlus (Attr a) (Attr b) = Attr (a .|. b) attrSet :: Attr -> Pair -> IO () attrSet attr (Pair p) = throwIfErr_ "attrset" $ attr_set attr (fromIntegral p) nullPtr attrOn :: Attr -> IO () attrOn (Attr attr) = throwIfErr_ "attr_on" $ attr_on attr nullPtr attrOff :: Attr -> IO () attrOff (Attr attr) = throwIfErr_ "attr_off" $ attr_off attr nullPtr wAttrOn :: Window -> Int -> IO () wAttrOn w x = throwIfErr_ "wattron" $ wattron w (fi x) wAttrOff :: Window -> Int -> IO () wAttrOff w x = throwIfErr_ "wattroff" $ wattroff w (fi x) attrDimOn :: IO () attrDimOn = throwIfErr_ "attron A_DIM" $ attron (#const A_DIM) attrDimOff :: IO () attrDimOff = throwIfErr_ "attroff A_DIM" $ attroff (#const A_DIM) attrBoldOn :: IO () attrBoldOn = throwIfErr_ "attron A_BOLD" $ attron (#const A_BOLD) attrBoldOff :: IO () attrBoldOff = throwIfErr_ "attroff A_BOLD" $ attroff (#const A_BOLD) attrDim :: Int attrDim = (#const A_DIM) attrBold :: Int attrBold = (#const A_BOLD) ------------------------------------------------------------------------ foreign import ccall safe waddch :: Window -> ChType -> IO CInt foreign import ccall safe waddchnstr :: Window -> CString -> CInt -> IO CInt foreign import ccall safe "static curses.h mvaddch" mvaddch_c :: CInt -> CInt -> ChType -> IO () mvWAddStr :: Window -> Int -> Int -> String -> IO () mvWAddStr w y x str = wMove w y x >> wAddStr w str mvAddCh :: Int -> Int -> ChType -> IO () mvAddCh l m n = mvaddch_c (fromIntegral l) (fromIntegral m) (fromIntegral n) addLn :: IO () addLn = wAddStr stdScr "\n" -- -- | normalise the string, stripping \\r and making control chars -- printable. Called over all output(?) {- normalise :: String -> String normalise [] = [] normalise ('\r':cs) = normalise cs normalise (c:cs) | isControl c = '@' : normalise cs | otherwise = c : normalise cs {-# INLINE normalise #-} -} {- normalise s = map f . filter (/= '\r') s where f c | isPrint c = c f c = '@' -} ------------------------------------------------------------------------ #if defined(HAVE_WCHAR_H) && (defined(HAVE_LIBNCURSESW) || defined(HAVE_LIBPDCURSESW)) --wAddStr :: Window -> String -> IO () --wAddStr w str = throwIfErr_ ("waddnwstr: " ++ show str) $ withCWStringLen (normalise str) (\(ws,len) -> waddnwstr w ws (fi len)) foreign import ccall unsafe waddnwstr :: Window -> CWString -> CInt -> IO CInt wAddStr :: Window -> String -> IO () wAddStr win str = do let convStr f = case f [] of [] -> return () s -> throwIfErr_ "waddnstr" $ withCWStringLen (s) (\(ws,len) -> (waddnwstr win ws (fi len))) loop [] acc = convStr acc loop (ch:str') acc = recognize ch (loop str' (acc . (ch:))) (\ch' -> do convStr acc throwIfErr "waddch" $ waddch win ch' loop str' id) loop str id #else -- -- This is heavily called, and does a lot of allocs. We walk over all -- the string accumulating a list of characters to be drawn. -- -- Got it down to: -- -- wAddStr Yi.Curses 20.0 38.1 -- wAddStr Yi.Curses 10.0 32.5 -- -- TODO make this way less expensive. That accum sucks. -- use difference lists for O(1) append -- wAddStr :: Window -> [Char] -> IO () wAddStr _ [] = return () wAddStr win s = throwIfErr_ ("waddnstr: <" ++ s ++ ">") $ withLCStringLen (s) (\(ws,len) -> waddnstr win ws (fi len)) foreign import ccall safe waddnstr :: Window -> CString -> CInt -> IO CInt #endif foreign import ccall safe vline :: Char -> Int -> IO () ------------------------------------------------------------------------ -- -- what ? -- #let translate_attr attr = \ "(if a .&. %lu /= 0 then %lu else 0) .|.", \ (unsigned long) WA_##attr, (unsigned long) A_##attr bkgrndSet :: Attr -> Pair -> IO () bkgrndSet (Attr a) p = bkgdset $ fromIntegral (ord ' ') .|. #translate_attr ALTCHARSET #translate_attr BLINK #translate_attr BOLD #translate_attr DIM #translate_attr INVIS #translate_attr PROTECT #translate_attr REVERSE #translate_attr STANDOUT #translate_attr UNDERLINE colorPair p foreign import ccall unsafe bkgdset :: ChType -> IO () erase :: IO () erase = throwIfErr_ "erase" $ werase_c stdScr foreign import ccall unsafe "werase" werase_c :: Window -> IO CInt wclear :: Window -> IO () wclear w = throwIfErr_ "wclear" $ wclear_c w foreign import ccall unsafe "wclear" wclear_c :: Window -> IO CInt clrToEol :: IO () clrToEol = throwIfErr_ "clrtoeol" clrtoeol foreign import ccall unsafe clrtoeol :: IO CInt -- -- | > move the cursor associated with the window -- > to line y and column x. This routine does not move the -- > physical cursor of the terminal until refresh is called. -- > The position specified is relative to the upper left-hand -- > corner of the window, which is (0,0). -- -- Note that 'move_c' may be a macro. -- move :: Int -> Int -> IO () move y x = throwIfErr_ "move" $ move_c (fromIntegral y) (fromIntegral x) foreign import ccall unsafe "move" move_c :: CInt -> CInt -> IO CInt -- -- | > move the cursor associated with the window -- > to line y and column x. This routine does not move the -- > physical cursor of the terminal until refresh is called. -- > The position specified is relative to the upper left-hand -- > corner of the window, which is (0,0). -- wMove :: Window -> Int -> Int -> IO () wMove w y x = throwIfErr_ "wmove" $ wmove w (fi y) (fi x) foreign import ccall unsafe wmove :: Window -> CInt -> CInt -> IO CInt ------------------ -- Cursor routines ------------------ data CursorVisibility = CursorInvisible | CursorVisible | CursorVeryVisible vis_c :: CursorVisibility -> CInt vis_c vis = case vis of CursorInvisible -> 0 CursorVisible -> 1 CursorVeryVisible -> 2 c_vis :: CInt -> CursorVisibility c_vis 0 = CursorInvisible c_vis 1 = CursorVisible c_vis 2 = CursorVeryVisible c_vis n = error ("Illegal C value for cursor visibility: " ++ show n) -- -- | Set the cursor state -- -- > The curs_set routine sets the cursor state is set to -- > invisible, normal, or very visible for visibility equal to -- > 0, 1, or 2 respectively. If the terminal supports the -- > visibility requested, the previous cursor state is -- > returned; otherwise, ERR is returned. -- cursSet :: CursorVisibility -> IO CursorVisibility cursSet CursorInvisible = do leaveOk True old <- curs_set 0 return $ c_vis old cursSet v = do leaveOk False old <- curs_set (vis_c v) return $ c_vis old foreign import ccall unsafe "HSCurses.h curs_set" curs_set :: CInt -> IO CInt -- -- | Get the current cursor coordinates -- getYX :: Window -> IO (Int, Int) getYX w = alloca $ \py -> -- allocate two ints on the stack alloca $ \px -> do nomacro_getyx w py px -- writes current cursor coords y <- peek py x <- peek px return (fromIntegral y, fromIntegral x) -- -- | Get the current cursor coords, written into the two argument ints. -- -- > The getyx macro places the current cursor position of the given -- > window in the two integer variables y and x. -- -- void getyx(WINDOW *win, int y, int x); -- foreign import ccall unsafe "HSCursesUtils.h hscurses_nomacro_getyx" nomacro_getyx :: Window -> Ptr CInt -> Ptr CInt -> IO () ------------------------------------------------------------------------ touchWin :: Window -> IO () touchWin w = throwIfErr_ "touchwin" $ touchwin w foreign import ccall touchwin :: Window -> IO CInt newPad :: Int -> Int -> IO Window newPad nlines ncols = throwIfNull "newpad" $ newpad (fromIntegral nlines) (fromIntegral ncols) pRefresh :: Window -> Int -> Int -> Int -> Int -> Int -> Int -> IO () pRefresh pad pminrow pmincol sminrow smincol smaxrow smaxcol = throwIfErr_ "prefresh" $ prefresh pad (fromIntegral pminrow) (fromIntegral pmincol) (fromIntegral sminrow) (fromIntegral smincol) (fromIntegral smaxrow) (fromIntegral smaxcol) delWin :: Window -> IO () delWin w = throwIfErr_ "delwin" $ delwin w data Border = Border { ls :: Char , rs :: Char , ts :: Char , bs :: Char , tl :: Char , tr :: Char , bl :: Char , br :: Char } defaultBorder :: Border defaultBorder = Border '\0' '\0' '\0' '\0' '\0' '\0' '\0' '\0' -- -- | > Draw a border around the edges of a window. defaultBorder is -- > a record representing all 0 parameters to wrecord. -- wBorder :: Window -> Border -> IO () wBorder w (Border ls rs ts bs tl tr bl br) = throwIfErr_ "wborder" $ wborder w ls' rs' ts' bs' tl' tr' bl' br' where ls' = castCharToCChar ls rs' = castCharToCChar rs ts' = castCharToCChar ts bs' = castCharToCChar bs tl' = castCharToCChar tl tr' = castCharToCChar tr bl' = castCharToCChar bl br' = castCharToCChar br foreign import ccall unsafe prefresh :: Window -> CInt -> CInt -> CInt -> CInt -> CInt -> CInt -> IO CInt foreign import ccall unsafe newpad :: CInt -> CInt -> IO Window foreign import ccall unsafe delwin :: Window -> IO CInt foreign import ccall unsafe wborder :: Window -> CChar -> CChar -> CChar -> CChar -> CChar -> CChar -> CChar -> CChar -> IO CInt newWin :: Int -> Int -> Int -> Int -> IO Window newWin nlines ncolumn begin_y begin_x = throwIfNull "newwin" $ newwin (fi nlines) (fi ncolumn) (fi begin_y) (fi begin_x) foreign import ccall unsafe newwin :: CInt -> CInt -> CInt -> CInt -> IO Window wClrToEol :: Window -> IO () wClrToEol w = throwIfErr_ "wclrtoeol" $ wclrtoeol w foreign import ccall unsafe wclrtoeol :: Window -> IO CInt -- -- | > The getch, wgetch, mvgetch and mvwgetch, routines read a -- > character from the window. -- #if defined(HAVE_LIBPDCURSES) || defined (HAVE_LIBPDCURSESW) foreign import ccall unsafe "HSCurses.h hscurses_nomacro_getch" getch :: IO CInt #else foreign import ccall unsafe "HSCurses.h getch" getch :: IO CInt #endif --foreign import ccall unsafe def_prog_mode :: IO CInt --foreign import ccall unsafe reset_prog_mode :: IO CInt foreign import ccall unsafe flushinp :: IO CInt foreign import ccall unsafe "HSCurses.h noqiflush" noqiflush :: IO () foreign import ccall unsafe "HSCurses.h beep" c_beep :: IO CInt foreign import ccall unsafe "HSCurses.h flash" c_flash :: IO CInt beep :: IO () beep = do br <- c_beep when (br /= (#const OK)) (c_flash >> return ()) ------------------------------------------------------------------------ -- -- | Map curses keys to key abstraction -- data Key = KeyChar Char | KeyBreak | KeyDown | KeyUp | KeyLeft | KeyRight | KeyHome | KeyBackspace | KeyF Int | KeyDL | KeyIL | KeyDC | KeyIC | KeyEIC | KeyClear | KeyEOS | KeyEOL | KeySF | KeySR | KeyNPage | KeyPPage | KeySTab | KeyCTab | KeyCATab | KeyEnter | KeySReset | KeyReset | KeyPrint | KeyLL | KeyA1 | KeyA3 | KeyB2 | KeyC1 | KeyC3 | KeyBTab | KeyBeg | KeyCancel | KeyClose | KeyCommand | KeyCopy | KeyCreate | KeyEnd | KeyExit | KeyFind | KeyHelp | KeyMark | KeyMessage | KeyMove | KeyNext | KeyOpen | KeyOptions | KeyPrevious | KeyRedo | KeyReference | KeyRefresh | KeyReplace | KeyRestart | KeyResume | KeySave | KeySBeg | KeySCancel | KeySCommand | KeySCopy | KeySCreate | KeySDC | KeySDL | KeySelect | KeySEnd | KeySEOL | KeySExit | KeySFind | KeySHelp | KeySHome | KeySIC | KeySLeft | KeySMessage | KeySMove | KeySNext | KeySOptions | KeySPrevious | KeySPrint | KeySRedo | KeySReplace | KeySRight | KeySRsume | KeySSave | KeySSuspend | KeySUndo | KeySuspend | KeyUndo | KeyResize | KeyMouse | KeyUnknown Int deriving (Eq,Show) decodeKey :: CInt -> Key decodeKey key = case key of _ | key >= 0 && key <= 255 -> KeyChar (chr (fromIntegral key)) (#const KEY_BREAK) -> KeyBreak (#const KEY_DOWN) -> KeyDown (#const KEY_UP) -> KeyUp (#const KEY_LEFT) -> KeyLeft (#const KEY_RIGHT) -> KeyRight (#const KEY_HOME) -> KeyHome (#const KEY_BACKSPACE) -> KeyBackspace _ | key >= (#const KEY_F0) && key <= (#const KEY_F(63)) -> KeyF (fromIntegral (key - #const KEY_F0)) (#const KEY_DL) -> KeyDL (#const KEY_IL) -> KeyIL (#const KEY_DC) -> KeyDC (#const KEY_IC) -> KeyIC (#const KEY_EIC) -> KeyEIC (#const KEY_CLEAR) -> KeyClear (#const KEY_EOS) -> KeyEOS (#const KEY_EOL) -> KeyEOL (#const KEY_SF) -> KeySF (#const KEY_SR) -> KeySR (#const KEY_NPAGE) -> KeyNPage (#const KEY_PPAGE) -> KeyPPage (#const KEY_STAB) -> KeySTab (#const KEY_CTAB) -> KeyCTab (#const KEY_CATAB) -> KeyCATab (#const KEY_ENTER) -> KeyEnter (#const KEY_SRESET) -> KeySReset (#const KEY_RESET) -> KeyReset (#const KEY_PRINT) -> KeyPrint (#const KEY_LL) -> KeyLL (#const KEY_A1) -> KeyA1 (#const KEY_A3) -> KeyA3 (#const KEY_B2) -> KeyB2 (#const KEY_C1) -> KeyC1 (#const KEY_C3) -> KeyC3 (#const KEY_BTAB) -> KeyBTab (#const KEY_BEG) -> KeyBeg (#const KEY_CANCEL) -> KeyCancel (#const KEY_CLOSE) -> KeyClose (#const KEY_COMMAND) -> KeyCommand (#const KEY_COPY) -> KeyCopy (#const KEY_CREATE) -> KeyCreate (#const KEY_END) -> KeyEnd (#const KEY_EXIT) -> KeyExit (#const KEY_FIND) -> KeyFind (#const KEY_HELP) -> KeyHelp (#const KEY_MARK) -> KeyMark (#const KEY_MESSAGE) -> KeyMessage (#const KEY_MOVE) -> KeyMove (#const KEY_NEXT) -> KeyNext (#const KEY_OPEN) -> KeyOpen (#const KEY_OPTIONS) -> KeyOptions (#const KEY_PREVIOUS) -> KeyPrevious (#const KEY_REDO) -> KeyRedo (#const KEY_REFERENCE) -> KeyReference (#const KEY_REFRESH) -> KeyRefresh (#const KEY_REPLACE) -> KeyReplace (#const KEY_RESTART) -> KeyRestart (#const KEY_RESUME) -> KeyResume (#const KEY_SAVE) -> KeySave (#const KEY_SBEG) -> KeySBeg (#const KEY_SCANCEL) -> KeySCancel (#const KEY_SCOMMAND) -> KeySCommand (#const KEY_SCOPY) -> KeySCopy (#const KEY_SCREATE) -> KeySCreate (#const KEY_SDC) -> KeySDC (#const KEY_SDL) -> KeySDL (#const KEY_SELECT) -> KeySelect (#const KEY_SEND) -> KeySEnd (#const KEY_SEOL) -> KeySEOL (#const KEY_SEXIT) -> KeySExit (#const KEY_SFIND) -> KeySFind (#const KEY_SHELP) -> KeySHelp (#const KEY_SHOME) -> KeySHome (#const KEY_SIC) -> KeySIC (#const KEY_SLEFT) -> KeySLeft (#const KEY_SMESSAGE) -> KeySMessage (#const KEY_SMOVE) -> KeySMove (#const KEY_SNEXT) -> KeySNext (#const KEY_SOPTIONS) -> KeySOptions (#const KEY_SPREVIOUS) -> KeySPrevious (#const KEY_SPRINT) -> KeySPrint (#const KEY_SREDO) -> KeySRedo (#const KEY_SREPLACE) -> KeySReplace (#const KEY_SRIGHT) -> KeySRight (#const KEY_SRSUME) -> KeySRsume (#const KEY_SSAVE) -> KeySSave (#const KEY_SSUSPEND) -> KeySSuspend (#const KEY_SUNDO) -> KeySUndo (#const KEY_SUSPEND) -> KeySuspend (#const KEY_UNDO) -> KeyUndo #ifdef KEY_RESIZE (#const KEY_RESIZE) -> KeyResize #endif #ifdef KEY_MOUSE (#const KEY_MOUSE) -> KeyMouse #endif _ -> KeyUnknown (fromIntegral key) keyResizeCode :: Maybe CInt #ifdef KEY_RESIZE keyResizeCode = Just (#const KEY_RESIZE) #else keyResizeCode = Nothing #endif cERR :: CInt cERR = #const ERR cKEY_UP, cKEY_DOWN, cKEY_LEFT, cKEY_RIGHT :: ChType cKEY_UP = #const KEY_UP cKEY_DOWN = #const KEY_DOWN cKEY_LEFT = #const KEY_LEFT cKEY_RIGHT = #const KEY_RIGHT -- cACS_BLOCK :: ChType -- cACS_BLOCK = #const ACS_BLOCK cTRUE :: NBool cTRUE = #const TRUE -- --------------------------------------------------------------------- -- get char -- -- ncurses ungetch and Haskell's threadWaitRead do not work together well. -- So I decided to implement my own input queue. ungetCh :: (Integral a) => a -> IO () ungetCh i = do debug "ungetCh called" writeChan inputBuf (BufDirect (fi i)) data BufData = BufDirect CInt -- data directly available | DataViaGetch -- data can be obtained by calling getch inputBuf :: Chan BufData inputBuf = unsafePerformIO newChan {-# NOINLINE inputBuf #-} getchToInputBuf :: IO () getchToInputBuf = do threadWaitRead (fi (0::Int)) {- From the (n)curses manpage: Programmers concerned about portability should be prepared for either of two cases: (a) signal receipt does not interrupt getch; (b) signal receipt interrupts getch and causes it to return ERR with errno set to EINTR. Under the ncurses implementation, handled signals never inter$B!>(B rupt getch. -} -- we only signalize that getch can now called without getting blocked. -- directly calling `getch' might result in losing the character just -- read (race condition). debug "now input available on stdin" writeChan inputBuf DataViaGetch -- -- | read a character from the window -- getCh :: IO Key getCh = do debug "getCh called" tid <- forkIO getchToInputBuf d <- readChan inputBuf killThread tid -- we can kill the thread savely, because the thread does -- not read any data via getch v <- case d of BufDirect x -> do debug "getCh: getting data directly from buffer" return x DataViaGetch -> do debug "getCh: getting data via getch" getch -- won't block! case v of (#const ERR) -> -- NO CODE IN THIS LINE do e <- getErrno if e `elem` [eAGAIN, eINTR] then do debug "Curses.getCh returned eAGAIN or eINTR" getCh else throwErrno "HSCurses.Curses.getch" k -> let k' = decodeKey k in do debug ("getCh: result = " ++ show k') return k' resizeTerminal :: Int -> Int -> IO () #ifdef HAVE_RESIZETERM resizeTerminal a b = throwIfErr_ "resizeterm" $ resizeterm (fi a) (fi b) foreign import ccall unsafe "HSCurses.h resizeterm" resizeterm :: CInt -> CInt -> IO CInt #else resizeTerminal _ _ = return () #endif -- -- | The SIGWINCH signal is sent whenever the terminal size changes. -- This signal is not available on all platforms, so it is a |Maybe| value. -- #ifdef mingw32_HOST_OS type Signal = CInt #endif cursesSigWinch :: Maybe Signal #ifdef SIGWINCH cursesSigWinch = Just (#const SIGWINCH) #else cursesSigWinch = Nothing #endif ------------ -- Test case ------------ cursesTest :: IO () cursesTest = do initScr hc <- hasColors when hc startColor ccc <- canChangeColor (ys,xs) <- scrSize cp <- colorPairs cs <- colors endWin putStrLn $ "ScreenSize: " ++ show (xs,ys) putStrLn $ "hasColors: " ++ show hc putStrLn $ "canChangeColor: " ++ show ccc putStrLn $ "colorPairs: " ++ show cp putStrLn $ "colors: " ++ show cs ----------------- -- Mouse Routines ----------------- data MouseEvent = MouseEvent { mouseEventId :: Int, mouseEventX :: Int, mouseEventY :: Int, mouseEventZ :: Int, mouseEventButton :: [ButtonEvent] } deriving(Show) data ButtonEvent = ButtonPressed Int | ButtonReleased Int | ButtonClicked Int | ButtonDoubleClicked Int | ButtonTripleClicked Int | ButtonShift | ButtonControl | ButtonAlt deriving(Eq,Show) withMouseEventMask :: MonadIO m => [ButtonEvent] -> m a -> m a #ifdef KEY_MOUSE foreign import ccall unsafe "HSCurses.h mousemask" mousemask :: (#type mmask_t) -> Ptr (#type mmask_t) -> IO (#type mmask_t) withMouseEventMask bes action = do ov <- liftIO $ alloca (\a -> mousemask (besToMouseMask bes) a >> peek a) r <- action liftIO $ mousemask ov nullPtr return r besToMouseMask :: [ButtonEvent] -> (#type mmask_t) besToMouseMask bes = foldl' (.|.) 0 (map cb bes) where cb (ButtonPressed 1) = (#const BUTTON1_PRESSED) cb (ButtonPressed 2) = (#const BUTTON2_PRESSED) cb (ButtonPressed 3) = (#const BUTTON3_PRESSED) cb (ButtonPressed 4) = (#const BUTTON4_PRESSED) cb (ButtonReleased 1) = (#const BUTTON1_RELEASED) cb (ButtonReleased 2) = (#const BUTTON2_RELEASED) cb (ButtonReleased 3) = (#const BUTTON3_RELEASED) cb (ButtonReleased 4) = (#const BUTTON4_RELEASED) cb (ButtonClicked 1) = (#const BUTTON1_CLICKED) cb (ButtonClicked 2) = (#const BUTTON2_CLICKED) cb (ButtonClicked 3) = (#const BUTTON3_CLICKED) cb (ButtonClicked 4) = (#const BUTTON4_CLICKED) cb ButtonShift = (#const BUTTON_SHIFT) cb ButtonAlt = (#const BUTTON_ALT) #ifdef BUTTON_CTRL cb ButtonControl = (#const BUTTON_CTRL) #else cb ButtonControl = (#const BUTTON_CONTROL) #endif cb _ = 0 #else withMouseEventMask _ a = a #endif ulCorner, llCorner, urCorner, lrCorner, rTee, lTee, bTee, tTee, hLine, vLine, plus, s1, s9, diamond, ckBoard, degree, plMinus, bullet, lArrow, rArrow, dArrow, uArrow, board, lantern, block, s3, s7, lEqual, gEqual, pi, nEqual, sterling :: Char ulCorner = chr 0x250C llCorner = chr 0x2514 urCorner = chr 0x2510 lrCorner = chr 0x2518 rTee = chr 0x2524 lTee = chr 0x251C bTee = chr 0x2534 tTee = chr 0x252C hLine = chr 0x2500 vLine = chr 0x2502 plus = chr 0x253C s1 = chr 0x23BA -- was: 0xF800 s9 = chr 0x23BD -- was: 0xF804 diamond = chr 0x25C6 ckBoard = chr 0x2592 degree = chr 0x00B0 plMinus = chr 0x00B1 bullet = chr 0x00B7 lArrow = chr 0x2190 rArrow = chr 0x2192 dArrow = chr 0x2193 uArrow = chr 0x2191 board = chr 0x2591 lantern = chr 0x256C block = chr 0x2588 s3 = chr 0x23BB -- was: 0xF801 s7 = chr 0x23BC -- was: 0xF803 lEqual = chr 0x2264 gEqual = chr 0x2265 pi = chr 0x03C0 nEqual = chr 0x2260 sterling = chr 0x00A3 {- -- haddock doesn't like these commented out with -- #if defined(__STDC_ISO_10646__) && defined(HAVE_WADDNWSTR) #else -} recognize :: Char -> IO a -> (ChType -> IO a) -> IO a recognize _ch noConvert _convert = noConvert -- Handle the most common case first. -- --------------------------------------------------------------------- -- code graveyard -- {- addStr :: String -> IO () addStr str = throwIfErr_ "addstr" $ withCStringConv (readIORef cursesOutConv) str addstr foreign import ccall unsafe addstr :: Ptr CChar -> IO CInt addStrLn :: String -> IO () addStrLn str = addStr str >> addLn -- -- | add a string of characters to a curses window and advance cursor -- curs_addstr(3) -- wAddStr :: Window -> String -> IO () wAddStr w str = throwIfErr_ "waddstr" $ withCStringConv (readIORef cursesOutConv) str (waddstr w) foreign import ccall unsafe waddstr :: Window -> Ptr CChar -> IO CInt addGraphStr :: String -> IO () addGraphStr str = do conv <- readIORef cursesOutConv let convStr f = case f [] of [] -> return () s -> throwIfErr_ "addstr" $ withCStringConv (return conv) s addstr loop [] acc = convStr acc loop (ch:str') acc = recognize ch (loop str' (acc . (ch:))) (\ch' -> do convStr acc throwIfErr "addch" $ addch ch' loop str' id) loop str id addGraphStrLn :: String -> IO () addGraphStrLn str = do addGraphStr str; addLn -} -- vim: sw=4 ts=4 hscurses-1.4.1.2/UI/HSCurses/CursesHelper.hs0000644000000000000000000003430112024055722016656 0ustar0000000000000000{-# LANGUAGE CPP #-} -- -- Copyright (C) 2005-2011 Stefan Wehr -- -- Derived from: yi/Curses/UI.hs -- Copyright (C) 2004 Don Stewart - http://www.cse.unsw.edu.au/~dons -- Released under the GPL, granted permission to release this module -- under the LGPL. -- -- Derived from: riot/UI.hs -- Copyright (c) Tuomo Valkonen 2004. -- Released under the GPL, granted permission to release this module -- under the LGPL. -- This library is free software; you can redistribute it and/or -- modify it under the terms of the GNU Lesser General Public -- License as published by the Free Software Foundation; either -- version 2.1 of the License, or (at your option) any later version. -- -- This library 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 -- Lesser General Public License for more details. -- -- You should have received a copy of the GNU Lesser General Public -- License along with this library; if not, write to the Free Software -- Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA module UI.HSCurses.CursesHelper ( -- * UI initialisation start, end, suspend, resizeui, -- * Input getKey, -- * Drawing drawLine, drawCursor, -- * Navigation gotoTop, -- * Colors ForegroundColor(..), BackgroundColor(..), defaultColor, black, red, green, yellow, blue, magenta, cyan, white, -- * Attributes Attribute(..), convertAttributes, -- * Style Style(..), CursesStyle, mkCursesStyle, changeCursesStyle, setStyle, wSetStyle, resetStyle, wResetStyle, convertStyles, defaultStyle, defaultCursesStyle, withStyle, wWithStyle, -- * Keys displayKey, -- * Helpers withCursor, withProgram ) where import UI.HSCurses.Curses hiding ( refresh, Window ) import UI.HSCurses.Logging import UI.HSCurses.MonadException import qualified UI.HSCurses.Curses as Curses import Data.Char import Data.Maybe import Control.Monad.Trans #ifndef mingw32_HOST_OS import System.Posix.Signals #endif -- -- -- -- | @start@ initializes the UI and grabs the keyboard. -- -- This function installs a handler for the SIGWINCH signal -- which writes the KEY_RESIZE key to the input queue (if KEY_RESIZE and -- and SIGWINCH are both available). -- start :: IO () start = do Curses.initCurses -- initialise the screen Curses.resetParams Curses.keypad Curses.stdScr True -- grab the keyboard case (Curses.cursesSigWinch, Curses.keyResizeCode) of #ifndef mingw32_HOST_OS (Just sig, Just key) -> do installHandler sig (Catch $ sigwinch sig key) Nothing return () #endif _ -> debug ("cannot install SIGWINCH handler: signal=" ++ show Curses.cursesSigWinch ++ ", KEY_RESIZE=" ++ show Curses.keyResizeCode) #ifndef mingw32_HOST_OS where sigwinch sig key = do debug "SIGWINCH signal received" Curses.ungetCh key installHandler sig (Catch $ sigwinch sig key) Nothing return () #endif -- -- | Clean up and go home. -- end :: IO () end = do Curses.endWin -- Refresh is needed on linux. grr. #if NCURSES_UPDATE_AFTER_END Curses.update #endif -- -- | Suspend the program. -- suspend :: IO () #ifndef mingw32_HOST_OS suspend = raiseSignal sigTSTP #else suspend = return () #endif -- -- | @getKey refresh@ reads a key. -- -- The @refresh@ function is used to redraw the screen when the terminal size -- changes (see the documentatio of @start@ for a discussion of the problem). -- getKey :: MonadIO m => m () -> m Key getKey refresh = do k <- liftIO $ Curses.getCh debug ("getKey: " ++ show k) case k of KeyResize -> do refresh getKey refresh _ -> return k -- -- | @drawLine n s@ draws @n@ characters of string @s@. -- drawLine :: Int -> String -> IO () -- lazy version is faster than calculating length of s drawLine w s = Curses.wAddStr Curses.stdScr $! take w (s ++ repeat ' ') -- -- | Draw the cursor at the given position. -- drawCursor :: (Int,Int) -> (Int, Int) -> IO () drawCursor (o_y,o_x) (y,x) = withCursor Curses.CursorVisible $ do gotoTop (h,w) <- scrSize Curses.wMove Curses.stdScr (min (h-1) (o_y + y)) (min (w-1) (o_x + x)) -- -- | Move cursor to origin of stdScr. -- gotoTop :: IO () gotoTop = Curses.wMove Curses.stdScr 0 0 -- -- | Resize the window -- From "Writing Programs with NCURSES", by Eric S. Raymond and -- Zeyd M. Ben-Halim -- -- resizeui :: IO (Int,Int) resizeui = do Curses.endWin Curses.refresh Curses.scrSize ------------------------------------------------------------------------ -- -- | Basic colors. -- defaultColor :: Curses.Color defaultColor = fromJust $ Curses.color "default" black, red, green, yellow, blue, magenta, cyan, white :: Curses.Color black = fromJust $ Curses.color "black" red = fromJust $ Curses.color "red" green = fromJust $ Curses.color "green" yellow = fromJust $ Curses.color "yellow" blue = fromJust $ Curses.color "blue" magenta = fromJust $ Curses.color "magenta" cyan = fromJust $ Curses.color "cyan" white = fromJust $ Curses.color "white" -- -- | Converts a list of 'Curses.Color' pairs (foreground color and -- background color) into the curses representation 'Curses.Pair'. -- -- You should call this function exactly once, at application startup. -- -- (not visible outside this module) colorsToPairs :: [(Curses.Color, Curses.Color)] -> IO [Curses.Pair] colorsToPairs cs = do p <- Curses.colorPairs let nColors = length cs blackWhite = p < nColors if blackWhite then trace ("Terminal does not support enough colors. Number of " ++ " colors requested: " ++ show nColors ++ ". Number of colors supported: " ++ show p) return $ take nColors (repeat (Curses.Pair 0)) else mapM toPairs (zip [1..] cs) where toPairs (n, (fg, bg)) = let p = Curses.Pair n in do Curses.initPair p fg bg return p ------------------------------------------------------------------------ -- Nicer, user-visible color defs. -- -- We separate colors into dark and bright colors, to prevent users -- from erroneously constructing bright colors for dark backgrounds, -- which doesn't work. -- -- | Foreground colors. -- data ForegroundColor = BlackF | GreyF | DarkRedF | RedF | DarkGreenF | GreenF | BrownF | YellowF | DarkBlueF | BlueF | PurpleF | MagentaF | DarkCyanF | CyanF | WhiteF | BrightWhiteF | DefaultF deriving (Eq, Show) -- -- | Background colors. -- data BackgroundColor = BlackB | DarkRedB | DarkGreenB | BrownB | DarkBlueB | PurpleB | DarkCyanB | WhiteB | DefaultB deriving (Eq, Show) -- -- | Mapping abstract colours to ncurses attributes and colours -- -- (not visible outside this module) convertBg :: BackgroundColor -> ([Attribute], Curses.Color) convertBg c = case c of BlackB -> ([], black) DarkRedB -> ([], red) DarkGreenB -> ([], green) BrownB -> ([], yellow) DarkBlueB -> ([], blue) PurpleB -> ([], magenta) DarkCyanB -> ([], cyan) WhiteB -> ([], white) DefaultB -> ([], defaultColor) convertFg :: ForegroundColor -> ([Attribute], Curses.Color) convertFg c = case c of BlackF -> ([], black) GreyF -> ([Bold], black) DarkRedF -> ([], red) RedF -> ([Bold], red) DarkGreenF -> ([], green) GreenF -> ([Bold], green) BrownF -> ([], yellow) YellowF -> ([Bold], yellow) DarkBlueF -> ([], blue) BlueF -> ([Bold], blue) PurpleF -> ([], magenta) MagentaF -> ([Bold], magenta) DarkCyanF -> ([], cyan) CyanF -> ([Bold], cyan) WhiteF -> ([], white) BrightWhiteF -> ([Bold], white) DefaultF -> ([], defaultColor) ------------------------------------------------------------------------ -- -- | Abstractions for some commonly used attributes. -- data Attribute = Bold | Underline | Dim | Reverse | Blink deriving (Eq, Show) -- -- | Converts an abstract attribute list into its curses representation. -- convertAttributes :: [Attribute] -> Curses.Attr convertAttributes = foldr setAttrs Curses.attr0 where setAttrs Bold = setBoldA setAttrs Underline = setUnderlineA setAttrs Dim = setDimA setAttrs Reverse = setReverseA setAttrs Blink = setBlinkA setBoldA, setUnderlineA, setDimA, setReverseA, setBlinkA :: Curses.Attr -> Curses.Attr setBoldA = flip Curses.setBold True setUnderlineA = flip Curses.setUnderline True setDimA = flip Curses.setDim True setReverseA = flip Curses.setReverse True setBlinkA = flip Curses.setBlink True ------------------------------------------------------------------------ -- -- | A humand-readable style. -- data Style = Style ForegroundColor BackgroundColor | AttributeStyle [Attribute] ForegroundColor BackgroundColor | ColorlessStyle [Attribute] deriving (Eq, Show) defaultStyle :: Style defaultStyle = Style DefaultF DefaultB -- -- | A style which uses the internal curses representations for -- attributes and colors. -- data CursesStyle = CursesStyle Curses.Attr Curses.Pair | ColorlessCursesStyle Curses.Attr deriving (Eq, Show) {- instance Show CursesStyle where show (CursesStyle _ _) = "CursesStyle" show (ColorlessCursesStyle _) = "ColorlessCursesStyle" -} mkCursesStyle :: [Attribute] -> CursesStyle mkCursesStyle attrs = ColorlessCursesStyle (convertAttributes attrs) -- -- | Changes the attributes of the given CursesStyle. -- changeCursesStyle :: CursesStyle -> [Attribute] -> CursesStyle changeCursesStyle (CursesStyle _ p) attrs = CursesStyle (convertAttributes attrs) p changeCursesStyle _ attrs = ColorlessCursesStyle (convertAttributes attrs) defaultCursesStyle :: CursesStyle defaultCursesStyle = CursesStyle Curses.attr0 (Curses.Pair 0) -- -- | Reset the screen to normal values -- resetStyle :: IO () resetStyle = wResetStyle Curses.stdScr wResetStyle :: Curses.Window -> IO () wResetStyle = flip wSetStyle defaultCursesStyle -- -- | Manipulate the current style of the standard screen -- setStyle :: CursesStyle -> IO () setStyle = wSetStyle Curses.stdScr wSetStyle :: Curses.Window -> CursesStyle -> IO () wSetStyle window (CursesStyle a p) = Curses.wAttrSet window (a, p) wSetStyle window (ColorlessCursesStyle a) = do (_, p) <- Curses.wAttrGet window Curses.wAttrSet window (a, p) withStyle :: MonadExcIO m => CursesStyle -> m a -> m a withStyle = wWithStyle Curses.stdScr wWithStyle :: MonadExcIO m => Curses.Window -> CursesStyle -> m a -> m a wWithStyle window style action = bracketM (liftIO $ do old <- Curses.wAttrGet window -- before wSetStyle window style return old) (\old -> liftIO $ Curses.wAttrSet window old) -- after (\_ -> action) -- do this -- -- | Converts a list of human-readable styles into the corresponding -- curses representation. -- -- This function should be called exactly once at application startup -- for all styles of the application. convertStyles :: [Style] -> IO [CursesStyle] convertStyles styleList = do let (attrs, cs) = unzip $ map convertStyle styleList cursesAttrs = map convertAttributes attrs cursesPairs <- colorsToPairs' cs let res = zipWith toCursesStyle cursesAttrs cursesPairs trace ("convertStyles: " ++ show (zip styleList res)) (return res) where convertStyle (Style fg bg) = convertStyle (AttributeStyle [] fg bg) convertStyle (AttributeStyle attrs fg bg) = let (afg, cfg) = convertFg fg (abg, cbg) = convertBg bg in (afg ++ abg ++ attrs, Just (cfg, cbg)) convertStyle (ColorlessStyle attrs) = (attrs, Nothing) colorsToPairs' cs = do pairs <- colorsToPairs (catMaybes cs) return $ mergeNothing cs pairs mergeNothing (Just _:crest) (p:prest) = Just p : mergeNothing crest prest mergeNothing (Nothing:crest) ps = Nothing : mergeNothing crest ps mergeNothing [] [] = [] toCursesStyle cursesAttrs Nothing = ColorlessCursesStyle cursesAttrs toCursesStyle cursesAttrs (Just cursesPair) = CursesStyle cursesAttrs cursesPair ------------------------------------------------------------------------ -- -- | Converting keys to humand-readable strings -- displayKey :: Key -> String displayKey (KeyChar ' ') = "" displayKey (KeyChar '\t') = "" displayKey (KeyChar '\r') = "" displayKey (KeyChar c) | isPrint c = [c] displayKey (KeyChar c) -- Control | ord '\^A' <= ord c && ord c <= ord '\^Z' = let c' = chr $ ord c - ord '\^A' + ord 'a' in '^':[toUpper c'] displayKey (KeyChar c) = show c displayKey KeyDown = "" displayKey KeyUp = "" displayKey KeyLeft = "" displayKey KeyRight = "" displayKey KeyHome = "" displayKey KeyBackspace = "" displayKey (KeyF i) = 'F' : show i displayKey KeyNPage = "" displayKey KeyPPage = "" displayKey KeyEnter = "" displayKey KeyEnd = "" displayKey KeyIC = "" displayKey KeyDC = "" displayKey k = show k ------------------------------------------------------------------------ -- -- | Other helpers -- -- -- | set the cursor, and do action -- withCursor :: MonadExcIO m => CursorVisibility -> m a -> m a withCursor nv action = bracketM (liftIO $ Curses.cursSet nv) -- before (\vis -> liftIO $ Curses.cursSet vis) -- after (\_ -> action) -- do this withProgram :: MonadExcIO m => m a -> m a withProgram action = withCursor CursorVisible $ bracketM_ (liftIO endWin) (liftIO flushinp) action hscurses-1.4.1.2/UI/HSCurses/CWString.hsc0000644000000000000000000002605112024055722016120 0ustar0000000000000000-- Copyright (c) 2002-2004 John Meacham (john at repetae dot net) -- Copyright (c) 2004 Don Stewart - http://www.cse.unsw.edu.au/~dons -- -- This library is free software; you can redistribute it and/or -- modify it under the terms of the GNU Lesser General Public -- License as published by the Free Software Foundation; either -- version 2.1 of the License, or (at your option) any later version. -- -- This library 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 -- Lesser General Public License for more details. -- -- You should have received a copy of the GNU Lesser General Public -- License along with this library; if not, write to the Free Software -- Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA module UI.HSCurses.CWString ( -- * utf8 versions withUTF8String, withUTF8StringLen, newUTF8String, newUTF8StringLen, peekUTF8String, peekUTF8StringLen, -- * WChar stuff #ifdef HAVE_WCHAR_H withCWString, withCWStringLen, newCWString, newCWStringLen, peekCWString, peekCWStringLen, wcharIsUnicode, CWChar, CWString, CWStringLen, #endif -- * Locale versions withLCString, withLCStringLen, newLCString, newLCStringLen, peekLCStringLen, peekLCString, -- charIsRepresentable ) where import Data.Char ( ord, chr ) import Data.Bits ( Bits((.|.), (.&.), shift) ) import Foreign.C.String #if __GLASGOW_HASKELL__ < 603 import GHC.Exts #endif #ifdef HAVE_WCHAR_H import Foreign.C.Types #include #include #include type CWChar = (#type wchar_t) type CWString = Ptr CWChar type CWStringLen = (CWString, Int) fi :: (Integral a, Num b) => a -> b fi x = fromIntegral x ------------------- -- CWChar functions ------------------- {-# INLINE wcharIsUnicode #-} wcharIsUnicode :: Bool #if defined(__STDC_ISO_10646__) wcharIsUnicode = True -- support functions wNUL :: CWChar wNUL = 0 #ifndef __GLASGOW_HASKELL__ pairLength :: String -> CString -> CStringLen pairLength = flip (,) . length cwCharsToChars :: [CWChar] -> [Char] cwCharsToChars xs = map castCWCharToChar xs charsToCWChars :: [Char] -> [CWChar] charsToCWChars xs = map castCharToCWChar xs #endif -- __STDC_ISO_10646__ castCWCharToChar :: CWChar -> Char castCWCharToChar ch = chr (fromIntegral ch ) castCharToCWChar :: Char -> CWChar castCharToCWChar ch = fromIntegral (ord ch) -- exported functions peekCWString :: CWString -> IO String #ifndef __GLASGOW_HASKELL__ peekCString cp = do cs <- peekArray0 wNUL cp; return (cwCharsToChars cs) #else peekCWString cp = loop 0 where loop i = do val <- peekElemOff cp i if val == wNUL then return [] else do rest <- loop (i+1) return (castCWCharToChar val : rest) #endif peekCWStringLen :: CWStringLen -> IO String #ifndef __GLASGOW_HASKELL__ peekCWStringLen (cp, len) = do cs <- peekArray len cp; return (cwCharsToChars cs) #else peekCWStringLen (cp, len) = loop 0 where loop i | i == len = return [] | otherwise = do val <- peekElemOff cp i rest <- loop (i+1) return (castCWCharToChar val : rest) #endif newCWString :: String -> IO CWString #ifndef __GLASGOW_HASKELL__ newCWString = newArray0 wNUL . charsToCWChars #else newCWString str = do ptr <- mallocArray0 (length str) let go [] n## = pokeElemOff ptr (I## n##) wNUL go (c:cs) n## = do pokeElemOff ptr (I## n##) (castCharToCWChar c); go cs (n## +## 1##) go str 0## return ptr #endif newCWStringLen :: String -> IO CWStringLen #ifndef __GLASGOW_HASKELL__ newCWStringLen str = do a <- newArray (charsToCWChars str) return (pairLength str a) #else newCWStringLen str = do ptr <- mallocArray0 len let go [] _ = return () go (c:cs) n## = do pokeElemOff ptr (I## n##) (castCharToCWChar c); go cs (n## +## 1##) go str 0## return (ptr, len) where len = length str #endif withCWString :: String -> (CWString -> IO a) -> IO a #ifndef __GLASGOW_HASKELL__ withCWString = withArray0 wNUL . charsToCWChars #else withCWString str f = allocaArray0 (length str) $ \ptr -> let go [] n## = pokeElemOff ptr (I## n##) wNUL go (c:cs) n## = do pokeElemOff ptr (I## n##) (castCharToCWChar c); go cs (n## +## 1##) in do go str 0## f ptr #endif withCWStringLen :: String -> (CWStringLen -> IO a) -> IO a #ifndef __GLASGOW_HASKELL__ withCWStringLen str act = withArray (charsToCWChars str) $ act . pairLength str #else withCWStringLen str f = allocaArray len $ \ptr -> let go [] _ = return () go (c:cs) n## = do pokeElemOff ptr (I## n##) (castCharToCWChar c); go cs (n## +## 1##) in do go str 0## f (ptr,len) where len = length str #endif #else -- no __STDC_ISO_10646__ wcharIsUnicode = False #endif newtype MBState = MBState { _mbstate :: (Ptr MBState)} withMBState :: (MBState -> IO a) -> IO a withMBState act = allocaBytes (#const sizeof(mbstate_t)) (\mb -> c_memset mb 0 (#const sizeof(mbstate_t)) >> act (MBState mb)) clearMBState :: MBState -> IO () clearMBState (MBState mb) = c_memset mb 0 (#const sizeof(mbstate_t)) >> return () wcsrtombs :: CWString -> (CString, CSize) -> IO CSize wcsrtombs wcs (cs,len) = alloca (\p -> poke p wcs >> withMBState (\mb -> wcsrtombs' p cs len mb)) where wcsrtombs' p cs' len' mb = do x <- c_wcsrtombs cs p len' mb case x of -1 -> do sp <- peek p poke sp ((fi (ord '?'))::CWChar) poke p wcs clearMBState mb wcsrtombs' p cs' len' mb e | e >= 0 && e <= len' -> do let ep = advancePtr cs' (fi e) poke ep (fi (0::Int)) return x e -> error $ "HSCurses.CWString.wcsrtombs: impossible case: "++show e foreign import ccall unsafe hs_get_mb_cur_max :: IO Int mb_cur_max :: Int mb_cur_max = unsafePerformIO hs_get_mb_cur_max {- charIsRepresentable :: Char -> IO Bool charIsRepresentable ch = fmap (/= -1) $ allocaBytes mb_cur_max (\cs -> c_wctomb cs (fi $ ord ch)) -} {- foreign import ccall unsafe "stdlib.h wctomb" c_wctomb :: CString -> CWChar -> IO CInt -} foreign import ccall unsafe "stdlib.h wcsrtombs" c_wcsrtombs :: CString -> (Ptr (Ptr CWChar)) -> CSize -> MBState -> IO CSize foreign import ccall unsafe "string.h memset" c_memset :: Ptr a -> CInt -> CSize -> IO (Ptr a) foreign import ccall unsafe "stdlib.h mbstowcs" c_mbstowcs :: CWString -> CString -> CSize -> IO CSize mbstowcs :: CWString -> Foreign.C.String.CString -> Foreign.C.Types.CSize -> IO Foreign.C.Types.CSize mbstowcs a b s = throwIf (== -1) (const "mbstowcs") $ c_mbstowcs a b s peekLCString :: CString -> IO String peekLCString cp = do sz <- mbstowcs nullPtr cp 0 allocaArray (fi $ sz + 1) (\wcp -> mbstowcs wcp cp (sz + 1) >> peekCWString wcp) -- TODO fix for embeded NULs peekLCStringLen :: CStringLen -> IO String peekLCStringLen (cp, len) = allocaBytes (len + 1) $ \ncp -> do copyBytes ncp cp len pokeElemOff ncp len 0 peekLCString ncp newLCString :: String -> IO CString newLCString s = withCWString s $ \wcs -> do cs <- mallocArray0 alen wcsrtombs wcs (cs, fi alen) return cs where alen = mb_cur_max * length s newLCStringLen :: String -> IO CStringLen newLCStringLen str = newLCString str >>= \cs -> return (pairLength1 str cs) withLCString :: String -> (CString -> IO a) -> IO a withLCString s a = withCWString s $ \wcs -> allocaArray0 alen $ \cs -> wcsrtombs wcs (cs,fi alen) >> a cs where alen = mb_cur_max * length s withLCStringLen :: String -> (CStringLen -> IO a) -> IO a withLCStringLen s a = withCWString s $ \wcs -> allocaArray0 alen $ \cs -> do sz <- wcsrtombs wcs (cs,fi alen) a (cs,fi sz) where alen = mb_cur_max * length s pairLength1 :: String -> CString -> CStringLen pairLength1 = flip (,) . length #else -- ----------------------------------------------------------- -- no CF_WCHAR_SUPPORT (OpenBSD) {- charIsRepresentable :: Char -> IO Bool charIsRepresentable ch = return $ isLatin1 ch -} withLCString :: String -> (Foreign.C.String.CString -> IO a) -> IO a withLCString = withCString withLCStringLen :: String -> (Foreign.C.String.CStringLen -> IO a) -> IO a withLCStringLen = withCStringLen newLCString :: String -> IO Foreign.C.String.CString newLCString = newCString newLCStringLen :: String -> IO Foreign.C.String.CStringLen newLCStringLen = newCStringLen peekLCString :: Foreign.C.String.CString -> IO String peekLCString = peekCString peekLCStringLen :: Foreign.C.String.CStringLen -> IO String peekLCStringLen = peekCStringLen #endif -- no CF_WCHAR_SUPPORT ----------------- -- UTF8 versions ----------------- withUTF8String :: String -> (CString -> IO a) -> IO a withUTF8String hsStr = withCString (toUTF hsStr) withUTF8StringLen :: String -> (CStringLen -> IO a) -> IO a withUTF8StringLen hsStr = withCStringLen (toUTF hsStr) newUTF8String :: String -> IO CString newUTF8String = newCString . toUTF newUTF8StringLen :: String -> IO CStringLen newUTF8StringLen = newCStringLen . toUTF peekUTF8String :: CString -> IO String peekUTF8String strPtr = fmap fromUTF $ peekCString strPtr peekUTF8StringLen :: CStringLen -> IO String peekUTF8StringLen strPtr = fmap fromUTF $ peekCStringLen strPtr -- these should read and write directly from/to memory. -- A first pass will be needed to determine the size of the allocated region toUTF :: String -> String toUTF [] = [] toUTF (x:xs) | ord x<=0x007F = x:toUTF xs | ord x<=0x07FF = chr (0xC0 .|. ((ord x `shift` (-6)) .&. 0x1F)): chr (0x80 .|. (ord x .&. 0x3F)): toUTF xs | otherwise = chr (0xE0 .|. ((ord x `shift` (-12)) .&. 0x0F)): chr (0x80 .|. ((ord x `shift` (-6)) .&. 0x3F)): chr (0x80 .|. (ord x .&. 0x3F)): toUTF xs fromUTF :: String -> String fromUTF [] = [] fromUTF (al@(x:xs)) | ord x<=0x7F = x:fromUTF xs | ord x<=0xBF = err | ord x<=0xDF = twoBytes al | ord x<=0xEF = threeBytes al | otherwise = err where twoBytes (x1:x2:xs') = chr (((ord x1 .&. 0x1F) `shift` 6) .|. (ord x2 .&. 0x3F)):fromUTF xs' twoBytes _ = error "fromUTF: illegal two byte sequence" threeBytes (x1:x2:x3:xs') = chr (((ord x1 .&. 0x0F) `shift` 12) .|. ((ord x2 .&. 0x3F) `shift` 6) .|. (ord x3 .&. 0x3F)):fromUTF xs' threeBytes _ = error "fromUTF: illegal three byte sequence" err = error "fromUTF: illegal UTF-8 character" hscurses-1.4.1.2/UI/HSCurses/IConv.hsc0000644000000000000000000001356112024055722015440 0ustar0000000000000000{-# LANGUAGE ForeignFunctionInterface #-} -- -- Copyright (c) 2004 Tuomo Valkonen -- Copyright (c) 2004 Don Stewart - http://www.cse.unsw.edu.au/~dons -- Copyright (c) 2005-2011 Stefan Wehr - http://www.stefanwehr.de -- -- This library is free software; you can redistribute it and/or -- modify it under the terms of the GNU Lesser General Public -- License as published by the Free Software Foundation; either -- version 2.1 of the License, or (at your option) any later version. -- -- This library 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 -- Lesser General Public License for more details. -- -- You should have received a copy of the GNU Lesser General Public -- License along with this library; if not, write to the Free Software -- Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA -- | Iconv binding #if HAVE_ICONV_H # include #endif module UI.HSCurses.IConv {-( IConv, iconv, iconv_, with_iconv, to_unicode, from_unicode, to_unicode_, from_unicode_ )-} where import UI.HSCurses.CWString ( peekUTF8StringLen, withUTF8StringLen ) import System.IO.Unsafe ( unsafePerformIO ) import Foreign hiding ( unsafePerformIO ) import Foreign.C import Control.Exception ( Exception, try, bracket ) type IConv = Ptr () --(#type iconv_t) err_ptr :: Ptr b -> Bool err_ptr p = p == (plusPtr nullPtr (-1)) throw_if_not_2_big :: String -> IO CSize -> IO CSize throw_if_not_2_big s r_ = do r <- r_ if r == fromIntegral (-1 :: Int) then do errno <- getErrno if errno /= e2BIG then throwErrno s else return r else return r iconv_open :: String -> String -> IO IConv iconv_open to from = withCString to $ \cto -> withCString from $ \cfrom -> do throwErrnoIf err_ptr "iconv_open" $ c_iconv_open cto cfrom iconv_close :: IConv -> IO () iconv_close ic = throwErrnoIfMinus1_ "iconv_close" $ c_iconv_close ic outbuf_size :: Int outbuf_size = 1024 do_iconv :: ((Ptr a, Int) -> IO String) -> IConv -> (Ptr b, Int) -> IO String do_iconv get_string_fn ic (inbuf, inbuf_bytes) = alloca $ \inbuf_ptr -> alloca $ \inbytesleft_ptr -> alloca $ \outbuf_ptr -> alloca $ \outbytesleft_ptr -> allocaBytes outbuf_size $ \outbuf -> do poke (inbytesleft_ptr :: Ptr CSize) (fromIntegral inbuf_bytes) poke inbuf_ptr inbuf let loop acc = do poke (outbytesleft_ptr :: Ptr CSize) (fromIntegral outbuf_size) poke outbuf_ptr outbuf ret <- throw_if_not_2_big "c_iconv" $ c_iconv ic inbuf_ptr inbytesleft_ptr outbuf_ptr outbytesleft_ptr left <- peek outbytesleft_ptr res <- get_string_fn (castPtr outbuf, outbuf_size - fromIntegral left) if ret == fromIntegral (-1 :: Int) then loop (acc++res) else return (acc++res) loop [] with_iconv :: String -> String -> (IConv -> IO a) -> IO a with_iconv to from fn = bracket (iconv_open to from) iconv_close fn iconv_ :: String -> IConv -> IO String iconv_ str ic = withCStringLen str $ do_iconv peekCStringLen ic -- between 8-bit encodings only iconv :: Exception e => String -> String -> String -> Either e String iconv to from str = unsafePerformIO $ try $ with_iconv to from (iconv_ str) #ifdef HAVE_WCHAR_H {- type CUni = (#type wchar_t) cuni_size = (#size wchar_t) unicode_charset = "WCHAR_T" chartocuni :: Char -> CUni chartocuni = fromIntegral . ord cunitochar :: CUni -> Char cunitochar = chr . fromIntegral -} cuni_charset :: [Char] cuni_charset = "WCHAR_T" peek_cuni :: (Ptr (#type wchar_t), Int) -> IO String peek_cuni (buf, bytes) = do let (chars, rembytes) = bytes `divMod` (#size wchar_t) if rembytes /= 0 then error "Conversion result contains remainder bytes." else peekCWStringLen (buf, chars) --liftM (map cunitochar) $ peekArray chars buf with_cuni :: String -> ((Ptr (#type wchar_t), Int) -> IO String) -> IO String with_cuni str f = withCWStringLen str $ \(s, l) -> f (s, l*(#size wchar_t)) --withArray (map chartocuni str) $ \s -> f (s, l*cuni_size) #else -- no CF_WCHAR_SUPPORT -- Due to endianness problems, it is easiest to do this through UTF-8 cuni_charset :: [Char] cuni_charset = "UTF-8" peek_cuni :: CStringLen -> IO String peek_cuni = peekUTF8StringLen with_cuni :: [Char] -> (CStringLen -> IO a) -> IO a with_cuni = withUTF8StringLen #endif to_unicode_ :: String -> String -> IO String to_unicode_ from str = with_iconv cuni_charset from $ \ic -> withCStringLen str $ do_iconv peek_cuni ic to_unicode :: Exception e => String -> String -> Either e String to_unicode from str = unsafePerformIO $ try $ to_unicode_ from str from_unicode_ :: String -> String -> IO String from_unicode_ to str = with_iconv to cuni_charset $ \ic -> with_cuni str $ do_iconv peekCStringLen ic from_unicode :: Exception e => String -> String -> Either e String from_unicode from str = unsafePerformIO $ try $ from_unicode_ from str #ifndef ICONV_LIB_PREFIX foreign import ccall unsafe "iconv.h iconv_open" c_iconv_open :: CString -> CString -> IO IConv foreign import ccall unsafe "iconv.h iconv_close" c_iconv_close :: IConv -> IO CInt foreign import ccall unsafe "iconv.h iconv" c_iconv :: IConv -> Ptr a -> Ptr CSize -> Ptr b -> Ptr CSize -> IO CSize #else foreign import ccall unsafe "iconv.h libiconv_open" c_iconv_open :: CString -> CString -> IO IConv foreign import ccall unsafe "iconv.h libiconv_close" c_iconv_close :: IConv -> IO CInt foreign import ccall unsafe "iconv.h libiconv" c_iconv :: IConv -> Ptr a -> Ptr CSize -> Ptr b -> Ptr CSize -> IO CSize #endif hscurses-1.4.1.2/UI/HSCurses/Logging.hs0000644000000000000000000000400412024055722015635 0ustar0000000000000000{-# LANGUAGE CPP #-} -- Copyright (c) 2005-2011 Stefan Wehr - http://www.stefanwehr.de -- -- This library is free software; you can redistribute it and/or -- modify it under the terms of the GNU Lesser General Public -- License as published by the Free Software Foundation; either -- version 2.1 of the License, or (at your option) any later version. -- -- This library 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 -- Lesser General Public License for more details. -- -- You should have received a copy of the GNU Lesser General Public -- License along with this library; if not, write to the Free Software -- Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA module UI.HSCurses.Logging (trace,debug) where import Control.Monad.Trans #ifdef __DEBUG__ import Data.IORef import System.IO import System.IO.Unsafe (unsafePerformIO) import System.Locale import System.Time #endif trace :: String -> a -> a debug :: MonadIO m => String -> m () #ifdef __DEBUG__ logFile :: Handle logFile = unsafePerformIO $ do h <- openFile ".hscurses.log" AppendMode debug_ h "logging initialized" return h {-# NOINLINE logFile #-} formatTime :: IO String formatTime = do let fmt = "%Y-%m-%d %H:%M:%S" clockT <- getClockTime calTime <- toCalendarTime clockT let maxSdecLen = 5 sdec' = show $ ctPicosec calTime sdec = if length sdec' > maxSdecLen then take maxSdecLen sdec' else sdec' return (formatCalendarTime defaultTimeLocale fmt calTime ++ ":" ++ sdec) trace s x = unsafePerformIO $ do debug s return x debug s = liftIO $ debug_ logFile s debug_ f s = do ts <- formatTime hPutStrLn f ("[" ++ ts ++ "] " ++ s) hFlush f #else trace _ x = x debug _ = return () #endif hscurses-1.4.1.2/UI/HSCurses/MonadException.hs0000644000000000000000000001031112024055722017162 0ustar0000000000000000{-# LANGUAGE ScopedTypeVariables #-} -- Copyright (c) 2005-2011 Stefan Wehr - http://www.stefanwehr.de -- -- This library is free software; you can redistribute it and/or -- modify it under the terms of the GNU Lesser General Public -- License as published by the Free Software Foundation; either -- version 2.1 of the License, or (at your option) any later version. -- -- This library 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 -- Lesser General Public License for more details. -- -- You should have received a copy of the GNU Lesser General Public -- License along with this library; if not, write to the Free Software -- Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA module UI.HSCurses.MonadException where #if !MIN_VERSION_base(4,6,0) import Prelude hiding (catch) #endif import Control.Exception import Control.Monad.State class Monad m => MonadExc m where catchM :: Exception e => m a -> (e -> m a) -> m a blockM :: m a -> m a unblockM :: m a -> m a class (MonadIO m, MonadExc m) => MonadExcIO m -- -- Operations implemented in term of catchM, blockM and unblockM -- (taken from Control.Exception). -- catchJustM :: (Exception e, MonadExc m) => (e -> Maybe b) -- ^ Predicate to select exceptions -> m a -- ^ Computation to run -> (b -> m a) -- ^ Handler -> m a catchJustM p a handler = catchM a handler' where handler' e = case p e of Nothing -> throw e Just b -> handler b handleM :: (Exception e, MonadExc m) => (e -> m a) -> m a -> m a handleM = flip catchM handleJustM :: (Exception e,MonadExc m) => (e -> Maybe b) -> (b -> m a) -> m a -> m a handleJustM p = flip (catchJustM p) tryM :: (Exception e, MonadExc m) => m a -> m (Either e a) tryM a = catchM (a >>= \ v -> return (Right v)) (\e -> return (Left e)) tryJustM :: (Exception e, MonadExc m) => (e -> Maybe b) -> m a -> m (Either b a) tryJustM p a = do r <- tryM a case r of Right v -> return (Right v) Left e -> case p e of Nothing -> throw e Just b -> return (Left b) bracketM :: MonadExc m => m a -- ^ computation to run first (\"acquire resource\") -> (a -> m b) -- ^ computation to run last (\"release resource\") -> (a -> m c) -- ^ computation to run in-between -> m c -- returns the value from the in-between computation bracketM before after thing = blockM (do a <- before r <- catchM (unblockM (thing a)) (\(e::SomeException) -> do { after a; throw e }) after a return r ) bracketM_ :: MonadExc m => m a -> m b -> m c -> m c bracketM_ before after thing = bracketM before (const after) (const thing) finally :: IO a -- ^ computation to run first -> IO b -- ^ computation to run afterward (even if an exception -- was raised) -> IO a -- returns the value from the first computation a `finally` sequel = blockM (do r <- catchM (unblockM a) (\(e::SomeException) -> do { sequel; throw e }) sequel return r ) -- -- Instance declarations -- instance MonadExc IO where catchM = catch blockM = block unblockM = unblock instance MonadExcIO IO instance MonadExc m => MonadExc (StateT s m) where catchM = catchState blockM = blockState unblockM = unblockState instance (MonadExc m, MonadIO m) => MonadExcIO (StateT s m) modifyState :: MonadExc m => (s -> m (a, s)) -> StateT s m a modifyState f = do oldState <- get (x, newState) <- lift $ f oldState put newState return x catchState :: (Exception e, MonadExc m) => StateT s m a -> (e -> StateT s m a) -> StateT s m a catchState run handler = modifyState (\oldState -> runStateT run oldState `catchM` (\e -> runStateT (handler e) oldState)) blockState, unblockState :: (MonadExc m) => StateT s m a -> StateT s m a blockState run = modifyState (\oldState -> blockM (runStateT run oldState)) unblockState run = modifyState (\oldState -> unblockM (runStateT run oldState)) hscurses-1.4.1.2/UI/HSCurses/Widgets.hs0000644000000000000000000010673512024055722015673 0ustar0000000000000000{-# LANGUAGE ScopedTypeVariables, ExistentialQuantification #-} -- glasgow-exts needed for existentials and multi-parameter type classes. -- Copyright (c) 2005-2011 Stefan Wehr - http://www.stefanwehr.de -- -- This library is free software; you can redistribute it and/or -- modify it under the terms of the GNU Lesser General Public -- License as published by the Free Software Foundation; either -- version 2.1 of the License, or (at your option) any later version. -- -- This library 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 -- Lesser General Public License for more details. -- -- You should have received a copy of the GNU Lesser General Public -- License along with this library; if not, write to the Free Software -- Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA module UI.HSCurses.Widgets where import Control.Exception (assert) import Control.Monad.Trans import Data.Char import Data.List import Data.Maybe import UI.HSCurses.Logging import UI.HSCurses.MonadException import qualified UI.HSCurses.Curses as Curses import qualified UI.HSCurses.CursesHelper as CursesH type Pos = (Int, Int) type Offset = (Int, Int) type Size = (Int, -- height Int -- width ) getHeight :: Size -> Int getHeight = fst getWidth :: Size -> Int getWidth = snd getYOffset :: Offset -> Int getYOffset = fst getXOffset :: Offset -> Int getXOffset = snd getYPos :: Pos -> Int getYPos = fst getXPos :: Pos -> Int getXPos = snd data Direction = DirLeft | DirRight | DirUp | DirDown deriving (Eq, Show, Ord) data HAlignment = AlignLeft | AlignCenter | AlignRight deriving (Eq, Show) data Cont a = Cont a | Done a class Widget a where draw :: Pos -> Size -> DrawingHint -> a -> IO () minSize :: a -> Size class Widget a => ActiveWidget a where activate :: MonadExcIO m => m () -> Pos -> Size -> a -> m (a, String) type KeyHandler a = Pos -> Size -> a -> IO (Cont a) mkKeyHandler :: (Pos -> Size -> a -> a) -> KeyHandler a mkKeyHandler f pos sz w = return (Cont (f pos sz w)) -- -- Drawing -- data DrawingHint = DHNormal | DHFocus | DHActive deriving (Eq, Show, Ord) data DrawingStyle = DStyle { dstyle_normal :: CursesH.CursesStyle , dstyle_focus :: CursesH.CursesStyle , dstyle_active :: CursesH.CursesStyle } deriving (Eq, Show) mkDrawingStyle :: CursesH.CursesStyle -> DrawingStyle mkDrawingStyle defStyle = let revStyle = CursesH.changeCursesStyle defStyle [CursesH.Reverse] in DStyle { dstyle_normal = defStyle , dstyle_focus = revStyle , dstyle_active = revStyle } defaultDrawingStyle :: DrawingStyle defaultDrawingStyle = mkDrawingStyle CursesH.defaultCursesStyle _draw :: DrawingHint -> DrawingStyle -> IO a -> IO a _draw DHActive sty io = CursesH.withStyle (dstyle_active sty) io _draw DHNormal sty io = CursesH.withStyle (dstyle_normal sty) io _draw DHFocus sty io = CursesH.withStyle (dstyle_focus sty) io -- -- Helper functions for scrolling -- scrollFactor :: Double scrollFactor = 0.8 scrollBy :: Int -> Int scrollBy displayLen = let amount = floor ((fromInteger . toInteger) displayLen * scrollFactor) in max (displayLen - 1) (min 1 amount) -- returns the new offset for scrolling in forward direction -- dataLen: total number of data items -- offset: the index of the first data item shown on the current page -- displayLen: the number of data items that is shown in one page scrollForward :: Int -> Int -> Int -> Int scrollForward dataLen offset displayLen = if offset + displayLen >= dataLen then offset else min (offset + scrollBy displayLen) (dataLen - displayLen) -- returns the new offset for scrolling in backward direction. -- parameters as for scrollForward scrollBackward :: t -> Int -> Int -> Int scrollBackward _ offset displayLen = if offset == 0 then offset else max (offset - scrollBy displayLen) 0 -- -- EmptyWidget -- data EmptyWidget = EmptyWidget Size instance Widget EmptyWidget where draw _ _ _ _ = return () minSize (EmptyWidget sz) = sz -- -- An opaque widget -- data OpaqueWidget = OpaqueWidget Size instance Widget OpaqueWidget where draw (y,x) (h,w) _ _ = let draw' n = do Curses.wMove Curses.stdScr (y+n) x CursesH.drawLine w "" in do mapM draw' (take h [0..]) Curses.refresh minSize (OpaqueWidget sz) = sz -- -- Widget for text input -- data EditWidget = EditWidget { ew_content :: String, ew_xoffset :: Int, -- content!!xoffset is the 1st char shown ew_xcursor :: Int, -- cursor position ew_history :: [String], ew_historyIndex :: Int, ew_historySavedContent :: Maybe String, ew_options :: EditWidgetOptions } ew_contentPos :: EditWidget -> Int ew_contentPos ew = ew_xcursor ew + ew_xoffset ew instance Widget EditWidget where draw = drawEditWidget minSize ew = (1, ewopt_minWidth $ ew_options ew) instance ActiveWidget EditWidget where activate = activateEditWidget data EditWidgetOptions = EWOptions { ewopt_keyHandlers :: [(Curses.Key, KeyHandler EditWidget)], ewopt_minWidth :: Int, ewopt_style :: DrawingStyle } defaultEWOptions :: EditWidgetOptions defaultEWOptions = EWOptions { ewopt_keyHandlers = editWidgetKeyHandlers, ewopt_minWidth = 8, ewopt_style = defaultDrawingStyle } newEditWidget :: EditWidgetOptions -> String -> EditWidget newEditWidget opts = editWidgetSetContent (EditWidget { ew_content = "", ew_xoffset = 0, ew_xcursor = 0, ew_history = [], ew_historyIndex = -1, ew_historySavedContent = Nothing, ew_options = opts }) editWidgetGoLeft :: Pos -> Size -> EditWidget -> IO (Cont EditWidget) editWidgetGoLeft = mkKeyHandler editWidgetGoLeft' editWidgetGoRight :: Pos -> Size -> EditWidget -> IO (Cont EditWidget) editWidgetGoRight = mkKeyHandler editWidgetGoRight' editWidgetDeleteLeft :: Pos -> Size -> EditWidget -> IO (Cont EditWidget) editWidgetDeleteLeft = mkKeyHandler editWidgetDeleteLeft' editWidgetDeleteUnderCursor :: Pos -> Size -> EditWidget -> IO (Cont EditWidget) editWidgetDeleteUnderCursor = mkKeyHandler editWidgetDeleteUnderCursor' editWidgetDeleteToEnd :: Pos -> Size -> EditWidget -> IO (Cont EditWidget) editWidgetDeleteToEnd = mkKeyHandler editWidgetDeleteToEnd' editWidgetGoHome :: Pos -> Size -> EditWidget -> IO (Cont EditWidget) editWidgetGoHome = mkKeyHandler editWidgetGoHome' editWidgetGoEnd :: Pos -> Size -> EditWidget -> IO (Cont EditWidget) editWidgetGoEnd = mkKeyHandler editWidgetGoEnd' editWidgetHistoryUp :: Pos -> Size -> EditWidget -> IO (Cont EditWidget) editWidgetHistoryUp = mkKeyHandler editWidgetHistoryUp' editWidgetHistoryDown :: Pos -> Size -> EditWidget -> IO (Cont EditWidget) editWidgetHistoryDown = mkKeyHandler editWidgetHistoryDown' editWidgetKeyHandlers :: [(Curses.Key, Pos -> Size -> EditWidget -> IO (Cont EditWidget))] editWidgetKeyHandlers = [(Curses.KeyLeft, editWidgetGoLeft), (Curses.KeyRight, editWidgetGoRight), (Curses.KeyBackspace, editWidgetDeleteLeft), (Curses.KeyChar '\^D', editWidgetDeleteUnderCursor), (Curses.KeyDC, editWidgetDeleteUnderCursor), (Curses.KeyChar '\^K', editWidgetDeleteToEnd), (Curses.KeyHome, editWidgetGoHome), (Curses.KeyChar '\^A', editWidgetGoHome), (Curses.KeyEnd, editWidgetGoEnd), (Curses.KeyChar '\^E', editWidgetGoEnd), (Curses.KeyChar '\r', editWidgetFinish), (Curses.KeyChar '\t', editWidgetFinish), (Curses.KeyUp, editWidgetHistoryUp), (Curses.KeyDown, editWidgetHistoryDown) ] editWidgetGetContent :: EditWidget -> String editWidgetGetContent ew = ew_content ew editWidgetSetContent :: EditWidget -> String -> EditWidget editWidgetSetContent ew s = addToHistory (ew { ew_content = s, ew_xoffset = 0, ew_xcursor = 0 }) s editWidgetGetOptions :: EditWidget -> EditWidgetOptions editWidgetGetOptions ew = ew_options ew editWidgetSetOptions :: EditWidget -> EditWidgetOptions -> EditWidget editWidgetSetOptions ew opts = ew { ew_options = opts } drawEditWidget :: Pos -> Size -> DrawingHint -> EditWidget -> IO () drawEditWidget (y, x) (_, width) hint ew = _draw hint (ewopt_style . ew_options $ ew) $ do Curses.wMove Curses.stdScr y x CursesH.drawLine width (drop (ew_xoffset ew) $ ew_content ew) Curses.refresh activateEditWidget :: MonadExcIO m => m () -> Pos -> Size -> EditWidget -> m (EditWidget, String) activateEditWidget refresh pos@(y, x) sz@(_, width) ew = CursesH.withCursor Curses.CursorVisible $ processKey ew where processKey ex = do liftIO $ drawLocal ex k <- CursesH.getKey refresh case lookup k (ewopt_keyHandlers $ ew_options ex) of Nothing -> case k of Curses.KeyChar c | isAscii c && isPrint c -> processKey $ insertChar ex c _ -> processKey ex Just f -> do x' <- liftIO $ f pos sz ex case x' of Cont ex' -> processKey ex' Done ex' -> do liftIO $ drawEditWidget pos sz DHActive ex' return (ex', editWidgetGetContent ex') insertChar ew' c = let pos' = ew_contentPos ew' oldContent = ew_content ew' newContent = take pos' oldContent ++ (c : drop pos' oldContent) in editWidgetGoRight' pos' sz (ew' { ew_content = newContent }) drawLocal ew' = _draw DHActive (ewopt_style . ew_options $ ew') $ do Curses.wMove Curses.stdScr y x CursesH.drawLine width (drop (ew_xoffset ew') $ ew_content ew') Curses.wMove Curses.stdScr y (x + ew_xcursor ew') Curses.refresh editWidgetGoLeft' :: t -> t1 -> EditWidget -> EditWidget editWidgetGoLeft' _ _ ew = let newXcursor = max (ew_xcursor ew - 1) 0 newXoffset = if ew_xcursor ew == 0 then max (ew_xoffset ew - 1) 0 else ew_xoffset ew in ew { ew_xoffset = newXoffset, ew_xcursor = newXcursor } editWidgetGoRight' :: t -> (t1, Int) -> EditWidget -> EditWidget editWidgetGoRight' _ (_, width) ew = let len = length (ew_content ew) lastChar = len - ew_xoffset ew - 1 newXcursor = minimum [ew_xcursor ew + 1, lastChar + 1, width - 1] newXoffset = if ew_xcursor ew == width - 1 then min (ew_xoffset ew + 1) (len - width + 1) else ew_xoffset ew in ew { ew_xoffset = newXoffset, ew_xcursor = newXcursor } editWidgetDeleteLeft' :: Pos -> Size -> EditWidget -> EditWidget editWidgetDeleteLeft' pos sz ew = let cpos = ew_contentPos ew - 1 oldContent = ew_content ew newContent = take cpos oldContent ++ drop (cpos+1) oldContent ew' = editWidgetGoLeft' pos sz (ew { ew_content = newContent }) in if ew_xcursor ew == 0 && ew_xoffset ew /= 0 then editWidgetGoRight' pos sz (editWidgetGoLeft' pos sz ew') else ew' editWidgetDeleteUnderCursor' :: t -> t1 -> EditWidget -> EditWidget editWidgetDeleteUnderCursor' _ _ ew = let pos = ew_contentPos ew oldContent = ew_content ew newContent = take pos oldContent ++ drop (pos+1) oldContent in ew { ew_content = newContent } editWidgetDeleteToEnd' :: t -> t1 -> EditWidget -> EditWidget editWidgetDeleteToEnd' _ _ ew = let pos = ew_contentPos ew oldContent = ew_content ew newContent = take pos oldContent in ew { ew_content = newContent } editWidgetGoHome' :: t -> t1 -> EditWidget -> EditWidget editWidgetGoHome' _ _ ew = ew { ew_xcursor = 0, ew_xoffset = 0 } editWidgetGoEnd' :: Pos -> Size -> EditWidget -> EditWidget editWidgetGoEnd' pos sz ew = let cpos = ew_contentPos ew len = length (ew_content ew) in if cpos == len then ew else editWidgetGoEnd' pos sz (editWidgetGoRight' pos sz ew) editWidgetFinish :: (Monad m) => t -> t1 -> EditWidget -> m (Cont EditWidget) editWidgetFinish _ _ ew = return (Done (addToHistory ew (ew_content ew))) maxHistoryLength :: Int maxHistoryLength = 50 addToHistory :: EditWidget -> [Char] -> EditWidget addToHistory ew s = let newHist = if not (null s) then take maxHistoryLength (s : ew_history ew) else ew_history ew in ew { ew_history = newHist, ew_historyIndex = -1, ew_historySavedContent = Nothing } editWidgetHistoryUp' :: t -> t1 -> EditWidget -> EditWidget editWidgetHistoryUp' _ _ ew = editWidgetHistory (+) ew editWidgetHistoryDown' :: t -> t1 -> EditWidget -> EditWidget editWidgetHistoryDown' _ _ ew = editWidgetHistory (-) ew -- ew_historyList: list of history items, i.e. non-null strings which were -- entered into the widget and confirmed with ENTER or which were added -- via editWidgetSetContent. -- ew_historyIndex: the index of the history item shown in the widget. The -- value -1 means that the value saved in ew_historySavedContent should -- be shown. editWidgetHistory :: (Num t) => (Int -> t -> Int) -> EditWidget -> EditWidget editWidgetHistory op ew = let i = ew_historyIndex ew l = ew_history ew j = i `op` 1 in if j >= 0 && j < length l then let savedContent = case ew_historySavedContent ew of Nothing -> Just (ew_content ew) x -> x in ew { ew_historyIndex = j, ew_content = l!!j, ew_historySavedContent = savedContent, ew_xcursor = 0, ew_xoffset = 0 } else if j == -1 then case ew_historySavedContent ew of Nothing -> ew Just x -> ew { ew_content = x, ew_historyIndex = j, ew_xcursor = 0, ew_xoffset = 0 } else ew -- -- Text widget -- data TextWidget = TextWidget { tw_text :: String, tw_yoffset :: Int, tw_xoffset :: Int, tw_options :: TextWidgetOptions } deriving (Eq, Show) instance Widget TextWidget where draw = drawTextWidget minSize tw = case twopt_size $ tw_options tw of TWSizeDefault -> let l = lines (tw_text tw) in (length l, if null l then 0 else maximum (map length l)) TWSizeFixed sz -> sz data TextWidgetSize = TWSizeDefault -- minimal size determined by content | TWSizeFixed Size -- minimal size is fixed, content is -- possibly cut off deriving (Eq, Show) {- | Autowrap -- minimal width determined by content, -- but lines are wrapped if necessary -} data TextWidgetOptions = TWOptions { twopt_size :: TextWidgetSize, twopt_style :: DrawingStyle, twopt_halign :: HAlignment } deriving (Eq, Show) defaultTWOptions :: TextWidgetOptions defaultTWOptions = TWOptions { twopt_size = TWSizeDefault, twopt_style = defaultDrawingStyle, twopt_halign = AlignLeft } newTextWidget :: TextWidgetOptions -> String -> TextWidget newTextWidget opts s = TextWidget { tw_text = s, tw_yoffset = 0, tw_xoffset = 0, tw_options = opts } drawTextWidget :: Pos -> Size -> DrawingHint -> TextWidget -> IO () drawTextWidget (y, x) (height, width) hint tw = let ly = take height $ drop (tw_yoffset tw) (lines (tw_text tw)) l = take height $ (map (drop (tw_xoffset tw)) ly ++ repeat []) l' = map (align (twopt_halign $ tw_options tw) width ' ') l in --trace ("drawing text widget at " ++ show pos ++ " with size " ++ show sz) $ do _draw hint (twopt_style . tw_options $ tw) (mapM drawLine $ zip l' [0..]) Curses.refresh where drawLine (s, i) = do Curses.wMove Curses.stdScr (y + i) x CursesH.drawLine width s textWidgetGetText :: TextWidget -> String textWidgetGetText = tw_text textWidgetSetText :: TextWidget -> String -> TextWidget textWidgetSetText tw s = tw { tw_text = s } textWidgetScrollDown :: Size -> TextWidget -> TextWidget textWidgetScrollDown (h, _) tw = let dataLen = length $ lines (tw_text tw) offset = tw_yoffset tw in tw { tw_yoffset = scrollForward dataLen offset h } textWidgetScrollUp :: Size -> TextWidget -> TextWidget textWidgetScrollUp (h, _) tw = let dataLen = length $ lines (tw_text tw) offset = tw_yoffset tw in tw { tw_yoffset = scrollBackward dataLen offset h } textWidgetScrollLeft :: Size -> TextWidget -> TextWidget textWidgetScrollLeft (_, w) tw = let dataLen = length $ lines (tw_text tw) offset = tw_xoffset tw in tw { tw_xoffset = scrollBackward dataLen offset w } textWidgetScrollRight :: Size -> TextWidget -> TextWidget textWidgetScrollRight (_, w) tw = let dataLen = length $ lines (tw_text tw) offset = tw_xoffset tw in tw { tw_xoffset = scrollForward dataLen offset w } -- -- Table widget -- data TableCell = forall w. Widget w => TableCell w | forall w. ActiveWidget w => ActiveTableCell w isActive :: TableCell -> Bool isActive (TableCell _) = False isActive (ActiveTableCell _) = True instance Widget TableCell where draw pos sz hint (TableCell w) = draw pos sz hint w draw pos sz hint (ActiveTableCell w) = draw pos sz hint w minSize (TableCell w) = minSize w minSize (ActiveTableCell w) = minSize w _activateTableCell :: MonadExcIO m => m () -> Pos -> Size -> TableCell -> m (TableCell, String) _activateTableCell _ _ _ (TableCell _) = error "_activateTableCell: cannot activate non-active cell!" _activateTableCell refresh pos sz (ActiveTableCell w) = do (new, res) <- activate refresh pos sz w return (ActiveTableCell new, res) type Row = [TableCell] singletonRow :: TableCell -> Row singletonRow tc = [tc] getCellWidget :: TableWidget -> (Int, Int) -> TableCell getCellWidget tbw (row, col) = (tbw_rows tbw) !! row !! col setCellWidget :: TableWidget -> (Int, Int) -> TableCell -> TableWidget setCellWidget tbw (rowIndex, colIndex) w = let rows = tbw_rows tbw row = rows !! rowIndex newRow = listReplace row w colIndex newRows = listReplace rows newRow rowIndex in tbw { tbw_rows = newRows } data TableWidget = TableWidget { tbw_rows :: [Row], tbw_colOffset :: Int, tbw_pos :: Maybe Pos, tbw_options :: TableWidgetOptions } data FillRow = First | Last | None deriving (Eq,Show) data TableWidgetOptions = TBWOptions { tbwopt_fillCol :: Maybe Int, tbwopt_fillRow :: FillRow, tbwopt_activeCols :: [Int], tbwopt_minSize :: Size } deriving (Eq, Show) defaultTBWOptions :: TableWidgetOptions defaultTBWOptions = TBWOptions { tbwopt_fillCol = Nothing, tbwopt_fillRow = None, tbwopt_activeCols = [], tbwopt_minSize = (4, 10) } instance Widget TableWidget where draw = drawTableWidget minSize = tbwopt_minSize . tbw_options newTableWidget :: TableWidgetOptions -> [Row] -> TableWidget newTableWidget opts rows = TableWidget { tbw_rows = rows, tbw_colOffset = 0, tbw_pos = findFirstActiveCell rows opts, tbw_options = opts } data TableWidgetDisplayInfo = TBWDisplayInfo { tbwdisp_height :: Int -- height of the display area , tbwdisp_width :: Int -- width of the display area , tbwdisp_firstVis :: Int -- index of the first row visible , tbwdisp_lastVis :: Int -- index of the last row visible , tbwdisp_rows :: [Row] -- the rows which are visible , tbwdisp_nrows :: Int -- the number of rows visible , tbwdisp_heights :: [Int] -- the heights of the visible rows , tbwdisp_widths :: [Int] -- the widths of the visible rows -- free space at the right side (xoffset, size) , tbwdisp_rightMargin :: Maybe (Int, Size) } tableWidgetDisplayInfo :: Size -> TableWidget -> TableWidgetDisplayInfo tableWidgetDisplayInfo (height, width) tbw = assert (isQuadratic (tbw_rows tbw)) $ let allRows = tbw_rows tbw ncols = length (allRows!!0) colOffset = tbw_colOffset tbw allHeights = minSpaces getHeight allRows heights' = drop colOffset allHeights nrows = getNRows heights' 0 0 rows = take nrows $ drop colOffset allRows (heights, heightDummy) = let hs = take nrows heights' s = sum hs d = height - s in case tbwopt_fillRow $ tbw_options tbw of First -> (applyToFirst (+d) hs, 0) Last -> (applyToLast (+d) hs, 0) None -> (hs, d) widths' = minSpaces getWidth (transpose $ tbw_rows tbw) (widths, rightMargin) = if sum widths' > width then error ("table to wide: width=" ++ show (sum widths') ++ ", available width=" ++ show width) else case tbwopt_fillCol $ tbw_options tbw of Just i | i >= 0 && i < ncols -> (take i widths' ++ let rest = drop i widths' in (head rest + width - sum widths') : tail rest , Nothing) _ -> let diff = width - sum widths' msz = (height, diff) m = if diff > 0 then Just (sum widths', msz) else Nothing in (widths', m) dummyHeights = if heightDummy == 0 then [] else [heightDummy] dummyRows = if heightDummy == 0 then [] else [map (\w -> TableCell (OpaqueWidget (heightDummy, w))) widths] in TBWDisplayInfo { tbwdisp_height = height , tbwdisp_width = width , tbwdisp_firstVis = colOffset , tbwdisp_lastVis = colOffset + nrows - 1 , tbwdisp_rows = rows ++ dummyRows , tbwdisp_nrows = nrows + length dummyRows , tbwdisp_heights = heights ++ dummyHeights , tbwdisp_widths = widths , tbwdisp_rightMargin = rightMargin } where minSpaces f ls = snd $ mapAccumL (\acc ws -> (acc, acc + maximum (map (f . minSize) ws))) 0 ls getNRows (h:hs) n acc | h + n <= height = getNRows hs (h+n) (acc+1) getNRows _ _ acc = acc isQuadratic [] = True isQuadratic (x:xs) = isQuadratic' xs (length x) isQuadratic' (x:xs) n = length x == n && isQuadratic' xs n isQuadratic' [] _ = True applyToFirst _ [] = [] applyToFirst f (x:xs) = f x : xs applyToLast _ [] = [] applyToLast f l = let (h, t) = (head $ reverse l, tail $ reverse l) in reverse $ f h : t getCellInfo :: Pos -> Size -> TableWidget -> (Int,Int) -> (Pos, Size) getCellInfo (y,x) sz tbw (row, col) = let info = tableWidgetDisplayInfo sz tbw heights = tbwdisp_heights info widths = tbwdisp_widths info h = heights !! row w = widths !! col yoff = sum $ take row heights xoff = sum $ take col widths in ((y+yoff, x+xoff), (h, w)) drawTableWidget :: Pos -> Size -> DrawingHint -> TableWidget -> IO () drawTableWidget (y, x) sz hint tbw = let info = tableWidgetDisplayInfo sz tbw heights = tbwdisp_heights info widths = tbwdisp_widths info firstVis = tbwdisp_firstVis info rows = tbwdisp_rows info rightMargin = tbwdisp_rightMargin info in do drawRows rows heights widths 0 firstVis hint case rightMargin of Nothing -> return () Just (xoff,s) -> draw (y,x+xoff) s hint (OpaqueWidget s) Curses.refresh where drawRows :: [Row] -> [Int] -> [Int] -> Int -> Int -> DrawingHint -> IO () drawRows [] _ _ _ _ _ = return () drawRows (r:rs) (h:hs) widths yoffset rowIndex hint' = do drawCols r h widths yoffset 0 (rowIndex, 0) hint' drawRows rs hs widths (yoffset + h) (rowIndex + 1) hint' drawCols :: Row -> Int -> [Int] -> Int -> Int -> (Int, Int) -> DrawingHint -> IO () drawCols [] _ _ _ _ _ _ = return () drawCols (c:cs) h (w:ws) yoffset xoffset (rowIndex, colIndex) hint' = let hint'' = case tbw_pos tbw of Just (z, a) | z == rowIndex && a == colIndex -> DHFocus _ -> hint' in do draw (y+yoffset, x+xoffset) (h,w) hint'' c drawCols cs h ws yoffset (xoffset + w) (rowIndex, colIndex+1) hint' tableWidgetScrollDown :: Size -> TableWidget -> TableWidget tableWidgetScrollDown (h, _) tbw = let dataLen = length $ tbw_rows tbw offset = tbw_colOffset tbw newOffset = scrollForward dataLen offset h newTbw = tbw { tbw_colOffset = newOffset } in case tbw_pos newTbw of Nothing -> newTbw Just (y,x) -> newTbw { tbw_pos = Just (max newOffset y, x) } tableWidgetScrollUp :: Size -> TableWidget -> TableWidget tableWidgetScrollUp sz@(h,_) tbw = let dataLen = length $ tbw_rows tbw offset = tbw_colOffset tbw newOffset = scrollBackward dataLen offset h newTbw = tbw { tbw_colOffset = newOffset } newLastVis = tbwdisp_lastVis (tableWidgetDisplayInfo sz newTbw) in case tbw_pos newTbw of Nothing -> newTbw Just (y,x) -> newTbw { tbw_pos = Just (min newLastVis y, x) } tableWidgetActivateCurrent :: MonadExcIO m => m () -> Pos -> Size -> DrawingHint -> TableWidget -> m (TableWidget, Maybe String) tableWidgetActivateCurrent refresh (y, x) sz _ tbw = case tbw_pos tbw of Nothing -> do debug "tableWidgetActivateCurrent: pos=Nothing" return (tbw, Nothing) Just p -> let w = getCellWidget tbw p in if not $ isActive w then do debug "tableWidgetActivateCurrent: not active" return (tbw, Nothing) else activate' w p where activate' widget colyx@(coly, colx) = let info = tableWidgetDisplayInfo sz tbw vcol = colx vrow = coly - tbwdisp_firstVis info heights = tbwdisp_heights info widths = tbwdisp_widths info h = heights !! vrow w = widths !! vcol yoffset = sum (take vrow heights) xoffset = sum (take vcol widths) in do (new, res) <- _activateTableCell refresh (y+yoffset, x+xoffset) (h, w) widget return (setCellWidget tbw colyx new, Just res) tableWidgetGoLeft :: Size -> TableWidget -> TableWidget tableWidgetGoLeft = tableWidgetMove DirLeft tableWidgetGoRight :: Size -> TableWidget -> TableWidget tableWidgetGoRight = tableWidgetMove DirRight tableWidgetGoUp :: Size -> TableWidget -> TableWidget tableWidgetGoUp = tableWidgetMove DirUp tableWidgetGoDown :: Size -> TableWidget -> TableWidget tableWidgetGoDown = tableWidgetMove DirDown tableWidgetMove :: Direction -> (Int, Int) -> TableWidget -> TableWidget tableWidgetMove dir sz tbw = let pos = tbw_pos tbw opts = tbw_options tbw nrows = length (tbw_rows tbw) in case pos of Nothing -> tbw Just p -> case findNextActiveCell opts nrows p dir of Nothing -> tbw newP@(Just (y, _)) -> tableWidgetMakeVisible (tbw {tbw_pos=newP}) sz y tableWidgetMakeVisible :: TableWidget -> (Int, Int) -> Int -> TableWidget tableWidgetMakeVisible tbw sz@(_,_) y = let info = tableWidgetDisplayInfo sz tbw firstVis = tbwdisp_firstVis info lastVis = tbwdisp_lastVis info in if y < firstVis then tableWidgetMakeVisible (tableWidgetScrollUp sz tbw) sz y else if y > lastVis then tableWidgetMakeVisible (tableWidgetScrollDown sz tbw) sz y else tbw findFirstActiveCell :: [Row] -> TableWidgetOptions -> Maybe Pos findFirstActiveCell rows opts = let nrows = length rows firstActiveCells = map (\y -> findNextActiveCell opts nrows (y, -1) DirRight) [0..nrows-1] in case catMaybes firstActiveCells of [] -> Nothing (x:_) -> Just x findNextActiveCell :: TableWidgetOptions -> Int -> Pos -> Direction -> Maybe Pos findNextActiveCell opts nrows (y,x) dir = -- trace ("findNextActiveCell (opts=" ++ show opts ++ ", nrows=" ++ show nrows -- ++ ", pos=" ++ show pos ++ ", dir=" ++ show dir) $ let rows = [0..(nrows - 1)] cols = sort (tbwopt_activeCols opts) horiz f = case f cols x rows y of Nothing -> Nothing Just z -> Just (y, z) vert f = case f rows y cols x of Nothing -> Nothing Just z -> Just (y, z) res = case dir of DirLeft-> horiz goLeft DirRight -> horiz goRight DirUp -> vert goLeft DirDown -> vert goRight in --trace ("result of findNextActiveCell: " ++ show res) res where goLeft _ _ rows a | not (a `elem` rows) = Nothing goLeft cols b _ _ = case reverse (takeWhile ( Nothing (c:_) -> Just c goRight _ _ rows a | not (a `elem` rows) = Nothing goRight cols a _ _ = case dropWhile (a>=) cols of [] -> Nothing (b:_) -> Just b tableWidgetDeleteRow :: Int -> TableWidget -> TableWidget tableWidgetDeleteRow n tbw = let rows = tbw_rows tbw rows' = deleteAt n rows pos' = case tbw_pos tbw of Nothing -> Nothing Just (row,col) -> let row' = min row (length rows' - 1) in if row' >= 0 then Just (row', col) else Nothing in tbw { tbw_rows = rows', tbw_pos = pos' } -- -- BorderWidget -- -- -- Selection Widget -- -- -- Utility functions -- -- | Join a list by some delimiter joinLists :: [[a]] -> [a] -> [a] joinLists l s = if (null l) then [] else foldr1 (\x -> \y -> x ++ s ++ y) l -- | Split a list by some delimiter splitList :: Eq a => [a] -> [a] -> [[a]] splitList d l = unfoldr (\x -> if (null x) then Nothing else Just $ nextToken d [] (snd $ splitAt (length d) x)) (d++l) where nextToken _ r [] = (r, []) nextToken e r m@(h:t) | (e `isPrefixOf` m) = (r, m) | otherwise = nextToken e (r++[h]) t listReplace :: [a] -> a -> Int -> [a] listReplace l a i = case splitAt i l of (_, []) -> error ("listReplace: index to large. index="++show i++ ", length="++show (length l)) ([], _) | i < 0 -> error ("listReplace: negative index. index="++ show i) (xs,(_:ys)) -> xs ++ (a:ys) --alignRows :: [[String]] -> Char -> String -> [String] alignRows :: [[[a]]] -> a -> [a] -> [[a]] alignRows rows fill delim = let widths = foldr maxWidths (repeat 0) rows in map (alignRow widths) rows where maxWidths :: [[a]] -> [Int] -> [Int] maxWidths row acc = map (uncurry max) (zip acc (map length row)) alignRow widths row = concatMap (uncurry alignCell) (zip widths row) alignCell width cell = let diff = width - length cell in cell ++ (take diff $ repeat fill) ++ delim align :: HAlignment -> Int -> a -> [a] -> [a] align a w f l = let space = w - length l in case a of AlignLeft -> l ++ (fill space) AlignRight -> (fill space) ++ l AlignCenter -> let left = space `div` 2 right = left + (space `mod` 2) in fill left ++ l ++ fill right where fill n = take n (repeat f) deleteAt :: Int -> [a] -> [a] deleteAt n l = if n >= 0 && n < length l then let (a,b) = splitAt n l in a ++ (tail b) else error ("deleteAt: illegal index: " ++ show n)